qvm: recover exit log publication
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_EXIT_LOG.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-exit-log.json +0 -0
- scripts/analyze_qvm_exit_log.py +22 -0
- scripts/test_qvm_exit_log.py +20 -0
- xtask/checks.tsv +4 -0
docs/FINDINGS.md
CHANGED
|
@@ -1517,3 +1517,6 @@ RE-813–822 replaces the scoreboard decimal assumption with actual37914 executi
|
|
| 1517 |
|
| 1518 |
|
| 1519 |
**RE-839:** Rust matches 39 original begin-transition cases, preserving timestamp guard semantics, fallback IDs, entity-client field clear and preparation/slow/respawn/move/publication order. Native work stays typed effects; invalid counts reject before mutation. [Evidence](research/RUST_INTERMISSION_BEGIN.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1517 |
|
| 1518 |
|
| 1519 |
**RE-839:** Rust matches 39 original begin-transition cases, preserving timestamp guard semantics, fallback IDs, entity-client field clear and preparation/slow/respawn/move/publication order. Native work stays typed effects; invalid counts reject before mutation. [Evidence](research/RUST_INTERMISSION_BEGIN.md).
|
| 1520 |
+
|
| 1521 |
+
|
| 1522 |
+
**RE-840:** 83 original 7367 cases recover Exit header, pending now−50, publication/configstring22 ordering, team score log, signed ping clamp and at most32 ranked connected nonspectator rows. Verified original format strings are recorded. Logging, publication and syscall effects remain captured. [Evidence](research/QVM_EXIT_LOG.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1533,3 +1533,6 @@ RE-838: 39 original 6825 cases recover the once-only blocked guard, clock assign
|
|
| 1533 |
|
| 1534 |
|
| 1535 |
RE-839: Rust matches 39 original begin-transition cases, preserving timestamp guard semantics, fallback IDs, entity-client field clear and preparation/slow/respawn/move/publication order. Native work stays typed effects; invalid counts reject before mutation. Full runtime completion remains open. [Evidence](research/RUST_INTERMISSION_BEGIN.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1533 |
|
| 1534 |
|
| 1535 |
RE-839: Rust matches 39 original begin-transition cases, preserving timestamp guard semantics, fallback IDs, entity-client field clear and preparation/slow/respawn/move/publication order. Native work stays typed effects; invalid counts reject before mutation. Full runtime completion remains open. [Evidence](research/RUST_INTERMISSION_BEGIN.md).
|
| 1536 |
+
|
| 1537 |
+
|
| 1538 |
+
RE-840: 83 original 7367 cases recover Exit header, pending now−50, publication/configstring22 ordering, team score log, signed ping clamp and at most32 ranked connected nonspectator rows. Verified original format strings are recorded. Logging, publication and syscall effects remain captured. Full runtime completion remains open. [Evidence](research/QVM_EXIT_LOG.md).
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1869,3 +1869,8 @@ Rust matches 131 original readiness cases, including slot16 mask exclusion, empt
|
|
| 1869 |
## 2026-10-27 — RE-839 Rust begin-intermission state and effect intentions
|
| 1870 |
|
| 1871 |
Rust matches 39 original begin-transition cases, preserving timestamp guard semantics, fallback IDs, entity-client field clear and preparation/slow/respawn/move/publication order. Native work stays typed effects; invalid counts reject before mutation. Focused `cargo xtask test-group rust-intermission-begin` passes (9 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1869 |
## 2026-10-27 — RE-839 Rust begin-intermission state and effect intentions
|
| 1870 |
|
| 1871 |
Rust matches 39 original begin-transition cases, preserving timestamp guard semantics, fallback IDs, entity-client field clear and preparation/slow/respawn/move/publication order. Native work stays typed effects; invalid counts reject before mutation. Focused `cargo xtask test-group rust-intermission-begin` passes (9 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.
|
| 1872 |
+
|
| 1873 |
+
|
| 1874 |
+
## 2026-10-27 — RE-840 Original exit log publication and ranked row contracts
|
| 1875 |
+
|
| 1876 |
+
83 original 7367 cases recover Exit header, pending now−50, publication/configstring22 ordering, team score log, signed ping clamp and at most32 ranked connected nonspectator rows. Verified original format strings are recorded. Logging, publication and syscall effects remain captured. Focused `cargo xtask test-group exit-log` 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
|
@@ -1570,3 +1570,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1570 |
|
| 1571 |
|
| 1572 |
- [x] RE-839 Rust begin-intermission state and effect intentions ([evidence](research/RUST_INTERMISSION_BEGIN.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1570 |
|
| 1571 |
|
| 1572 |
- [x] RE-839 Rust begin-intermission state and effect intentions ([evidence](research/RUST_INTERMISSION_BEGIN.md)).
|
| 1573 |
+
|
| 1574 |
+
|
| 1575 |
+
- [x] RE-840 Original exit log publication and ranked row contracts ([evidence](research/QVM_EXIT_LOG.md)).
|
docs/research/QVM_EXIT_LOG.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Original exit log publication and ranked row contracts
|
| 2 |
+
|
| 3 |
+
RE-840. Reproduce with `python3 scripts/analyze_qvm_exit_log.py`; focused validation: `cargo xtask test-group exit-log`. [Machine report](qvm-exit-log.json).
|
| 4 |
+
|
| 5 |
+
83 original 7367 cases recover Exit header, pending now−50, publication/configstring22 ordering, team score log, signed ping clamp and at most32 ranked connected nonspectator rows. Verified original format strings are recorded. Logging, publication and syscall effects remain captured.
|
| 6 |
+
|
| 7 |
+
Original executable/native runtime and complete Linux/macOS Rust/Bevy/Solari acceptance remain unverified.
|
docs/research/README.md
CHANGED
|
@@ -1109,3 +1109,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 1109 |
|
| 1110 |
|
| 1111 |
[RE-839: Rust begin-intermission state and effect intentions](RUST_INTERMISSION_BEGIN.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1109 |
|
| 1110 |
|
| 1111 |
[RE-839: Rust begin-intermission state and effect intentions](RUST_INTERMISSION_BEGIN.md).
|
| 1112 |
+
|
| 1113 |
+
|
| 1114 |
+
[RE-840: Original exit log publication and ranked row contracts](QVM_EXIT_LOG.md).
|
docs/research/qvm-exit-log.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_exit_log.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
import itertools
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from qvm_research_support import source
|
| 5 |
+
from qvm_intermission_support import seed,execute
|
| 6 |
+
from analyze_qvm import write_json
|
| 7 |
+
|
| 8 |
+
def cases():
|
| 9 |
+
for mode,count,ping in itertools.product([-1,3,9,11],[-1,0,1,4,33],[-1,998,999,1000]):
|
| 10 |
+
c=[{'468':1 if j%5==1 else 2,'3096':3 if j%5==2 else 0,'248':j-10,'452':ping,'140':j} for j in range(35)]
|
| 11 |
+
yield dict(mode=mode,rank_count=count,order=list(reversed(range(35))),now=120000,reason=34414,first_score=-1,second_score=42),c
|
| 12 |
+
for now in [-2147483648,0,2147483647]:yield dict(now=now,reason=34577,rank_count=0),[]
|
| 13 |
+
|
| 14 |
+
def main():
|
| 15 |
+
q,raw,h,ins=source();rows=[]
|
| 16 |
+
for a,c in cases():
|
| 17 |
+
m,p=execute(ins,seed(c,**a),7367,7523,56,{8:a['reason']},targets=[7259,6328,-19]);p.update(input=a,clients=c,pending=m[34999592]&0xffffffff);rows.append(p)
|
| 18 |
+
strings={}
|
| 19 |
+
for a in [34708,34691,34655]:
|
| 20 |
+
start=h['data_offset']+a;strings[str(a)]=raw[start:raw.index(b'\0',start)].decode('ascii')
|
| 21 |
+
write_json(Path('docs/research/qvm-exit-log.json'),{'source':q['source'],'sha256':q['sha256'],'strings':strings,'probes':rows,'limits':'Actual7367 body and actual33715 over83 cases. Exit header, pending now-50, publication/configstring22, optional team scores, capped32 ranked rows, connected/non-spectator filters and ping min(value,999). Logging/publication/syscall effects captured; native files/network unverified.'})
|
| 22 |
+
if __name__=='__main__':main()
|
scripts/test_qvm_exit_log.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from qvm_intermission_support import CPOOL
|
| 4 |
+
|
| 5 |
+
def expected(a,c):
|
| 6 |
+
out=[(7259,{8:34708,12:a['reason']}),(6328,{}),(-19,{8:22,12:39731})]
|
| 7 |
+
if a.get('mode',0)>=3 and a['mode'] not in [9,11]:out.append((7259,{8:34691,12:a.get('first_score',0),16:a.get('second_score',0)}))
|
| 8 |
+
for id in a.get('order',list(range(len(c))))[:max(0,min(32,a.get('rank_count',len(c))))]:
|
| 9 |
+
v=c[id]
|
| 10 |
+
if v.get('3096',0)!=3 and v.get('468',2)==2:out.append((7259,{8:34655,12:v.get('248',0),16:min(v.get('452',0),999),20:id,24:CPOOL+6336*id+504}))
|
| 11 |
+
return out
|
| 12 |
+
class ExitLogTests(unittest.TestCase):
|
| 13 |
+
def test_exact_log_and_publication_abi(self):
|
| 14 |
+
r=json.loads(Path('docs/research/qvm-exit-log.json').read_text());self.assertEqual(len(r['probes']),83)
|
| 15 |
+
for p in r['probes']:
|
| 16 |
+
actual=[(v['target'],{int(k):n&0xffffffff for k,n in v['arguments'].items()}) for v in p['requests']];wanted=expected(p['input'],p['clients']);self.assertEqual(actual,[(t,{k:v&0xffffffff for k,v in a.items()}) for t,a in wanted]);self.assertEqual(p['pending'],(p['input'].get('now',0)-50)&0xffffffff)
|
| 17 |
+
def test_only_pending_write_and_original_strings(self):
|
| 18 |
+
r=json.loads(Path('docs/research/qvm-exit-log.json').read_text());self.assertEqual(r['strings']['34708'],'Exit: %s\n');self.assertEqual(r['strings']['34691'],'red:%i blue:%i\n')
|
| 19 |
+
for p in r['probes']:self.assertTrue(all(v['address']==34999592 for v in p['changes']))
|
| 20 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -2208,3 +2208,7 @@ report scripts/analyze_rust_intermission_begin.py docs/research/rust-intermissio
|
|
| 2208 |
edge docs/research/rust-intermission-begin.json scripts/test_rust_intermission_begin.py
|
| 2209 |
group rust-intermission-begin scripts/analyze_rust_intermission_begin.py
|
| 2210 |
edge scripts/analyze_rust_intermission_begin.py scripts/analyze_qvm_resumer_audit.py
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2208 |
edge docs/research/rust-intermission-begin.json scripts/test_rust_intermission_begin.py
|
| 2209 |
group rust-intermission-begin scripts/analyze_rust_intermission_begin.py
|
| 2210 |
edge scripts/analyze_rust_intermission_begin.py scripts/analyze_qvm_resumer_audit.py
|
| 2211 |
+
report scripts/analyze_qvm_exit_log.py docs/research/qvm-exit-log.json
|
| 2212 |
+
edge docs/research/qvm-exit-log.json scripts/test_qvm_exit_log.py
|
| 2213 |
+
group exit-log scripts/analyze_qvm_exit_log.py
|
| 2214 |
+
edge scripts/analyze_qvm_exit_log.py scripts/analyze_qvm_resumer_audit.py
|