qvm: recover intermission camera placement
Browse files- docs/FINDINGS.md +3 -0
- docs/PROVISIONAL_TODO.md +3 -0
- docs/RESEARCH_LEDGER.md +5 -0
- docs/REVERSE_ENGINEERING_TODO.md +3 -0
- docs/research/QVM_CAMERA_PLACE.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-camera-place.json +0 -0
- docs/research/qvm-resumer-audit.json +14 -3
- scripts/analyze_qvm_camera_place.py +19 -0
- scripts/qvm_transition_support.py +28 -0
- scripts/test_qvm_camera_place.py +12 -0
- xtask/checks.tsv +5 -0
docs/FINDINGS.md
CHANGED
|
@@ -1529,3 +1529,6 @@ RE-813–822 replaces the scoreboard decimal assumption with actual37914 executi
|
|
| 1529 |
|
| 1530 |
|
| 1531 |
**RE-843:** Rust composes recovered tie, readiness, begin and exit-log policies with prior exit timers/limits across150 continuous source fixtures. Atomic staged updates preserve shared pending/client state; reset and lower-level world/I/O effects remain explicit intentions. Source branch labels are independently classified by the tested composition oracle; captured requests and actual final source state supply effect parity. [Evidence](research/RUST_INTERMISSION_FLOW.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1529 |
|
| 1530 |
|
| 1531 |
**RE-843:** Rust composes recovered tie, readiness, begin and exit-log policies with prior exit timers/limits across150 continuous source fixtures. Atomic staged updates preserve shared pending/client state; reset and lower-level world/I/O effects remain explicit intentions. Source branch labels are independently classified by the tested composition oracle; captured requests and actual final source state supply effect parity. [Evidence](research/RUST_INTERMISSION_FLOW.md).
|
| 1532 |
+
|
| 1533 |
+
|
| 1534 |
+
**RE-844:** 72 original 6575 fixtures recover entity/player origin and view-angle copies, velocity clear, movement type5 and cleared entity/client fields. Coherent byte copies preserve arbitrary float words, including NaN payloads; two entity-to-client targets prove indirection. Mode/field4324 gates converge without extra effects. Native renderer/camera integration remains open. [Evidence](research/QVM_CAMERA_PLACE.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1548,3 +1548,6 @@ RE-843: Rust composes recovered tie, readiness, begin and exit-log policies with
|
|
| 1548 |
|
| 1549 |
|
| 1550 |
- [ ] RE-844: Recover next-map/respawn/camera/publication/event allocation effects, broaden pointer/identity fixtures, and integrate ranking→intermission→scoreboard runtime traces. [Scope](research/QVM_INTERMISSION_BATCH.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1548 |
|
| 1549 |
|
| 1550 |
- [ ] RE-844: Recover next-map/respawn/camera/publication/event allocation effects, broaden pointer/identity fixtures, and integrate ranking→intermission→scoreboard runtime traces. [Scope](research/QVM_INTERMISSION_BATCH.md).
|
| 1551 |
+
|
| 1552 |
+
|
| 1553 |
+
RE-844: 72 original 6575 fixtures recover entity/player origin and view-angle copies, velocity clear, movement type5 and cleared entity/client fields. Coherent byte copies preserve arbitrary float words, including NaN payloads; two entity-to-client targets prove indirection. Mode/field4324 gates converge without extra effects. Native renderer/camera integration remains open. Full runtime completion remains open. [Evidence](research/QVM_CAMERA_PLACE.md).
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1893,3 +1893,8 @@ Rust composes recovered tie, readiness, begin and exit-log policies with prior e
|
|
| 1893 |
RE-843 final review: targeted xtask registry regression passes for the intermission module and all five source-to-Rust report dependencies. Added batch evidence, validation cadence and RE-844 lower-level/runtime follow-ups.
|
| 1894 |
|
| 1895 |
Batch RE-834–843 boundary: the single `cargo xtask test-full --since 5f7b2df8` run passed after task ten: 1,648 Python tests, 137 Rust tests (assets 10, gameplay 99, xtask 28), 45 deterministic report producers, storage policy, 403 documentation files and whitespace checks. No generated report drift; validation notes amended into task ten. Original assets unchanged.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1893 |
RE-843 final review: targeted xtask registry regression passes for the intermission module and all five source-to-Rust report dependencies. Added batch evidence, validation cadence and RE-844 lower-level/runtime follow-ups.
|
| 1894 |
|
| 1895 |
Batch RE-834–843 boundary: the single `cargo xtask test-full --since 5f7b2df8` run passed after task ten: 1,648 Python tests, 137 Rust tests (assets 10, gameplay 99, xtask 28), 45 deterministic report producers, storage policy, 403 documentation files and whitespace checks. No generated report drift; validation notes amended into task ten. Original assets unchanged.
|
| 1896 |
+
|
| 1897 |
+
|
| 1898 |
+
## 2026-10-27 — RE-844 Original intermission camera placement and client indirection
|
| 1899 |
+
|
| 1900 |
+
72 original 6575 fixtures recover entity/player origin and view-angle copies, velocity clear, movement type5 and cleared entity/client fields. Coherent byte copies preserve arbitrary float words, including NaN payloads; two entity-to-client targets prove indirection. Mode/field4324 gates converge without extra effects. Native renderer/camera integration remains open. Focused `cargo xtask test-group camera-place` passes (5 Python tests); selected reports regenerate twice deterministically, with storage, documentation links and whitespace guards. Full suite deferred to task ten. Original assets unchanged; source fixtures do not establish complete native/runtime parity.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -1585,3 +1585,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1585 |
|
| 1586 |
|
| 1587 |
- [ ] RE-844: Recover next-map/respawn/camera/publication/event allocation effects, broaden pointer/identity fixtures, and integrate ranking→intermission→scoreboard runtime traces. [Scope](research/QVM_INTERMISSION_BATCH.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1585 |
|
| 1586 |
|
| 1587 |
- [ ] RE-844: Recover next-map/respawn/camera/publication/event allocation effects, broaden pointer/identity fixtures, and integrate ranking→intermission→scoreboard runtime traces. [Scope](research/QVM_INTERMISSION_BATCH.md).
|
| 1588 |
+
|
| 1589 |
+
|
| 1590 |
+
- [x] RE-844 Original intermission camera placement and client indirection ([evidence](research/QVM_CAMERA_PLACE.md)).
|
docs/research/QVM_CAMERA_PLACE.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Original intermission camera placement and client indirection
|
| 2 |
+
|
| 3 |
+
RE-844. Reproduce with `python3 scripts/analyze_qvm_camera_place.py`; focused validation: `cargo xtask test-group camera-place`. [Machine report](qvm-camera-place.json).
|
| 4 |
+
|
| 5 |
+
72 original 6575 fixtures recover entity/player origin and view-angle copies, velocity clear, movement type5 and cleared entity/client fields. Coherent byte copies preserve arbitrary float words, including NaN payloads; two entity-to-client targets prove indirection. Mode/field4324 gates converge without extra effects. Native renderer/camera integration remains open.
|
| 6 |
+
|
| 7 |
+
Original executable/native runtime and complete Linux/macOS Rust/Bevy/Solari acceptance remain unverified.
|
docs/research/README.md
CHANGED
|
@@ -1123,3 +1123,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 1123 |
[RE-843: Rust composed exit and intermission state machine](RUST_INTERMISSION_FLOW.md).
|
| 1124 |
|
| 1125 |
- [RE-834–843 intermission batch findings, validation and follow-up scope](QVM_INTERMISSION_BATCH.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1123 |
[RE-843: Rust composed exit and intermission state machine](RUST_INTERMISSION_FLOW.md).
|
| 1124 |
|
| 1125 |
- [RE-834–843 intermission batch findings, validation and follow-up scope](QVM_INTERMISSION_BATCH.md).
|
| 1126 |
+
|
| 1127 |
+
|
| 1128 |
+
[RE-844: Original intermission camera placement and client indirection](QVM_CAMERA_PLACE.md).
|
docs/research/qvm-camera-place.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
docs/research/qvm-resumer-audit.json
CHANGED
|
@@ -9974,6 +9974,17 @@
|
|
| 9974 |
"path": "scripts/qvm_team_counter_support.py",
|
| 9975 |
"repeated_calls_opt_in": true,
|
| 9976 |
"repeated_calls_setting": "literal_true"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9977 |
}
|
| 9978 |
],
|
| 9979 |
"limits": "Static direct-import calls only, including local aliases. Computed ranges, indirect/module calls and reachability need manual/dynamic review. Backward branches and dynamic stores are review markers, not proven failures; fixture compatibility is not semantic proof.",
|
|
@@ -10014,10 +10025,10 @@
|
|
| 10014 |
}
|
| 10015 |
},
|
| 10016 |
"summary": {
|
| 10017 |
-
"call_expressions":
|
| 10018 |
-
"files":
|
| 10019 |
"legacy_expressions": 158,
|
| 10020 |
-
"nonliteral_ranges":
|
| 10021 |
"unresolved_mode_expressions": 3
|
| 10022 |
}
|
| 10023 |
}
|
|
|
|
| 9974 |
"path": "scripts/qvm_team_counter_support.py",
|
| 9975 |
"repeated_calls_opt_in": true,
|
| 9976 |
"repeated_calls_setting": "literal_true"
|
| 9977 |
+
},
|
| 9978 |
+
{
|
| 9979 |
+
"backward_conditional_branches": [],
|
| 9980 |
+
"calls": [],
|
| 9981 |
+
"explicit_result_offsets": null,
|
| 9982 |
+
"helper": "qvm_trace_support.resume",
|
| 9983 |
+
"line": 22,
|
| 9984 |
+
"literal_range": null,
|
| 9985 |
+
"path": "scripts/qvm_transition_support.py",
|
| 9986 |
+
"repeated_calls_opt_in": true,
|
| 9987 |
+
"repeated_calls_setting": "literal_true"
|
| 9988 |
}
|
| 9989 |
],
|
| 9990 |
"limits": "Static direct-import calls only, including local aliases. Computed ranges, indirect/module calls and reachability need manual/dynamic review. Backward branches and dynamic stores are review markers, not proven failures; fixture compatibility is not semantic proof.",
|
|
|
|
| 10025 |
}
|
| 10026 |
},
|
| 10027 |
"summary": {
|
| 10028 |
+
"call_expressions": 202,
|
| 10029 |
+
"files": 154,
|
| 10030 |
"legacy_expressions": 158,
|
| 10031 |
+
"nonliteral_ranges": 27,
|
| 10032 |
"unresolved_mode_expressions": 3
|
| 10033 |
}
|
| 10034 |
}
|
scripts/analyze_qvm_camera_place.py
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
import itertools
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from qvm_research_support import source
|
| 5 |
+
from qvm_transition_support import run,vector,words,ENTITY,PCLIENT,POSITION,ANGLES
|
| 6 |
+
from analyze_qvm import write_json
|
| 7 |
+
EF=[4,8,92,96,100,156,160,180,460]
|
| 8 |
+
CF=[4,20,24,28,32,36,40,104,152,156,160,3108,4324]
|
| 9 |
+
VECTORS=[[0x80000000,0,0x3f800000],[0x7fc01234,0x7f800000,0xff800000],[0x3fc00000,0xc0100000,0x4b000001]]
|
| 10 |
+
def main():
|
| 11 |
+
q,raw,h,ins=source();rows=[]
|
| 12 |
+
for mode,special,slot,origin,angles in itertools.product([0,2,3],[0,1],[0,1],VECTORS,VECTORS[:2]):
|
| 13 |
+
m={ENTITY+o:0x12345678 for o in EF};m[ENTITY+520]=PCLIENT+6336*slot
|
| 14 |
+
for j in range(2):
|
| 15 |
+
for o in CF:m[PCLIENT+6336*j+o]=0xaabbccdd
|
| 16 |
+
m[PCLIENT+6336*slot+3108]=mode;m[PCLIENT+6336*slot+4324]=special;vector(m,POSITION,origin);vector(m,ANGLES,angles)
|
| 17 |
+
before=[{str(o):m[PCLIENT+6336*j+o]&0xffffffff for o in CF} for j in range(2)];m,p=run(ins,m,6575,6715,20,{8:ENTITY});p.update(input=dict(mode=mode,special=special,slot=slot,origin=origin,angles=angles),clients_before=before,entity={str(o):m[ENTITY+o]&0xffffffff for o in EF},clients=[{str(o):m[PCLIENT+6336*j+o]&0xffffffff for o in CF} for j in range(2)]);rows.append(p)
|
| 18 |
+
write_json(Path('docs/research/qvm-camera-place.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Actual6575 over72 coherent word/byte fixtures, including entity-client indirection and raw NaN/infinite/signed-zero copies. Both apparent mode gates join the same body. No native camera/rendering behavior or unbounded alias ABI claim.'})
|
| 19 |
+
if __name__=='__main__':main()
|
scripts/qvm_transition_support.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Finite camera/map/event source execution with coherent byte copies."""
|
| 2 |
+
from qvm_exit_rules_support import E,CPOOL,POOL
|
| 3 |
+
from qvm_trace_support import resume
|
| 4 |
+
from qvm_byte_memory_support import read_bytes
|
| 5 |
+
T=E+0x30000
|
| 6 |
+
ENTITY=POOL+880*60
|
| 7 |
+
PCLIENT=CPOOL+6336*60
|
| 8 |
+
POSITION=34999612
|
| 9 |
+
ANGLES=34999624
|
| 10 |
+
|
| 11 |
+
def vector(m,a,values):
|
| 12 |
+
for j,v in enumerate(values):m[a+4*j]=v
|
| 13 |
+
|
| 14 |
+
def words(m,a,n):return [int.from_bytes(read_bytes(m,{},a+4*j,4),'little') for j in range(n)]
|
| 15 |
+
def run(ins,m,start,stop,frame,args=None,targets=(),handlers=None,boundaries=(),base=T):
|
| 16 |
+
for o,v in (args or {}).items():m[base+frame+o]=v
|
| 17 |
+
requests=[]
|
| 18 |
+
def capture(t):
|
| 19 |
+
def f(i,m,a):requests.append({'target':t,'arguments':a});return m,0,{'captured':True}
|
| 20 |
+
return f
|
| 21 |
+
hs={t:capture(t) for t in targets};hs.update(handlers or {})
|
| 22 |
+
initial=dict(m);m,e=resume(ins,start+1,stop,m,base,handlers=hs,boundaries=boundaries,repeated_calls=True,sync_child_words=True,coherent_memory=True,segment_limit=4096,limit=32768)
|
| 23 |
+
changes=[{'address':a,'before':v&0xffffffff,'after':m[a]&0xffffffff} for a,v in initial.items() if (m[a]&0xffffffff)!=(v&0xffffffff) and not T<=a<T+0x20000]
|
| 24 |
+
return m,{'return':e['return'],'requests':requests,'changes':changes,'execution':{k:e[k] for k in ['stop','trace_length','trace_sha256']}}
|
| 25 |
+
|
| 26 |
+
def classify(ins,m,a):
|
| 27 |
+
m,p=run(ins,m,33715,33740,12,a,base=T+0x1000)
|
| 28 |
+
return m,p['return'],{'actual_source_child':33715}
|
scripts/test_qvm_camera_place.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
class CameraTests(unittest.TestCase):
|
| 4 |
+
def test_exact_camera_words_and_untouched_indirected_client(self):
|
| 5 |
+
rows=json.loads(Path('docs/research/qvm-camera-place.json').read_text())['probes'];self.assertEqual(len(rows),72)
|
| 6 |
+
for p in rows:
|
| 7 |
+
a=p['input'];entity={str(o):0 for o in [4,8,156,160,180,460]};entity.update({str(92+4*j):v for j,v in enumerate(a['origin'])});self.assertEqual(p['entity'],entity)
|
| 8 |
+
expected=[dict(v) for v in p['clients_before']];c=expected[a['slot']]
|
| 9 |
+
c.update({str(20+4*j):v for j,v in enumerate(a['origin'])});c.update({str(152+4*j):v for j,v in enumerate(a['angles'])});c.update({'4':5,'32':0,'36':0,'40':0,'104':0});self.assertEqual(p['clients'],expected)
|
| 10 |
+
def test_no_children_or_unexpected_mutation_addresses(self):
|
| 11 |
+
for p in json.loads(Path('docs/research/qvm-camera-place.json').read_text())['probes']:self.assertEqual(p['requests'],[]);self.assertEqual(p['execution']['stop'],6715)
|
| 12 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -2244,3 +2244,8 @@ report scripts/analyze_rust_intermission_flow.py docs/research/rust-intermission
|
|
| 2244 |
edge docs/research/rust-intermission-flow.json scripts/test_rust_intermission_flow.py
|
| 2245 |
group rust-intermission-flow scripts/analyze_rust_intermission_flow.py
|
| 2246 |
edge scripts/analyze_rust_intermission_flow.py scripts/analyze_qvm_resumer_audit.py
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2244 |
edge docs/research/rust-intermission-flow.json scripts/test_rust_intermission_flow.py
|
| 2245 |
group rust-intermission-flow scripts/analyze_rust_intermission_flow.py
|
| 2246 |
edge scripts/analyze_rust_intermission_flow.py scripts/analyze_qvm_resumer_audit.py
|
| 2247 |
+
report scripts/analyze_qvm_camera_place.py docs/research/qvm-camera-place.json
|
| 2248 |
+
edge docs/research/qvm-camera-place.json scripts/test_qvm_camera_place.py
|
| 2249 |
+
group camera-place scripts/analyze_qvm_camera_place.py
|
| 2250 |
+
edge scripts/analyze_qvm_camera_place.py scripts/analyze_qvm_resumer_audit.py
|
| 2251 |
+
edge scripts/qvm_transition_support.py scripts/analyze_qvm_resumer_audit.py
|