qvm: resolve bot and announcement connect children
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_RESOLVED_CONNECT_TAIL.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-resolved-connect-tail.json +0 -0
- scripts/analyze_qvm_resolved_connect_tail.py +22 -0
- scripts/qvm_connect_callback_support.py +17 -0
- scripts/test_qvm_resolved_connect_tail.py +12 -0
- xtask/checks.tsv +5 -0
docs/FINDINGS.md
CHANGED
|
@@ -1781,3 +1781,6 @@ RE-813–822 replaces the scoreboard decimal assumption with actual37914 executi
|
|
| 1781 |
|
| 1782 |
|
| 1783 |
**RE-927:** Rust matches162 original182896 payload/counter cases, retaining exact ccprint/spectator framing, raw name bytes, previous-team suppression and wrapping formatter counter. It does not select or mutate teams. Native broadcast delivery and additional team-switch logic remain open. [Evidence](research/RUST_TEAM_ANNOUNCEMENT.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1781 |
|
| 1782 |
|
| 1783 |
**RE-927:** Rust matches162 original182896 payload/counter cases, retaining exact ccprint/spectator framing, raw name bytes, previous-team suppression and wrapping formatter counter. It does not select or mutate teams. Native broadcast delivery and additional team-switch logic remain open. [Evidence](research/RUST_TEAM_ANNOUNCEMENT.md).
|
| 1784 |
+
|
| 1785 |
+
|
| 1786 |
+
**RE-928:** 144 original173979 suffix cases execute actual161744 settings/drop wrapper and182896 announcement body instead of supplied bot booleans and captured team callback. Parent control/state remains source-identical; extra userinfo selector toggles, setup records, drops, exact announcement bytes and formatter carry are verified. Native125185 setup,171668 userinfo mutation, ranking/network/logging remain supplied/captured. [Evidence](research/QVM_RESOLVED_CONNECT_TAIL.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1824,3 +1824,6 @@ RE-926: 162 actual182896 cases execute original70458/37914 integer/string format
|
|
| 1824 |
|
| 1825 |
|
| 1826 |
RE-927: Rust matches162 original182896 payload/counter cases, retaining exact ccprint/spectator framing, raw name bytes, previous-team suppression and wrapping formatter counter. It does not select or mutate teams. Native broadcast delivery and additional team-switch logic remain open. Full runtime completion remains open. [Evidence](research/RUST_TEAM_ANNOUNCEMENT.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1824 |
|
| 1825 |
|
| 1826 |
RE-927: Rust matches162 original182896 payload/counter cases, retaining exact ccprint/spectator framing, raw name bytes, previous-team suppression and wrapping formatter counter. It does not select or mutate teams. Native broadcast delivery and additional team-switch logic remain open. Full runtime completion remains open. [Evidence](research/RUST_TEAM_ANNOUNCEMENT.md).
|
| 1827 |
+
|
| 1828 |
+
|
| 1829 |
+
RE-928: 144 original173979 suffix cases execute actual161744 settings/drop wrapper and182896 announcement body instead of supplied bot booleans and captured team callback. Parent control/state remains source-identical; extra userinfo selector toggles, setup records, drops, exact announcement bytes and formatter carry are verified. Native125185 setup,171668 userinfo mutation, ranking/network/logging remain supplied/captured. Full runtime completion remains open. [Evidence](research/QVM_RESOLVED_CONNECT_TAIL.md).
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -2365,3 +2365,8 @@ Rust matches288 original161744 fixed-record and effect cases, preserving143-byte
|
|
| 2365 |
## 2026-10-28 — RE-927 Rust team announcements and spectator suppression
|
| 2366 |
|
| 2367 |
Rust matches162 original182896 payload/counter cases, retaining exact ccprint/spectator framing, raw name bytes, previous-team suppression and wrapping formatter counter. It does not select or mutate teams. Native broadcast delivery and additional team-switch logic remain open. Focused `cargo xtask test-group rust-team-announcement` 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2365 |
## 2026-10-28 — RE-927 Rust team announcements and spectator suppression
|
| 2366 |
|
| 2367 |
Rust matches162 original182896 payload/counter cases, retaining exact ccprint/spectator framing, raw name bytes, previous-team suppression and wrapping formatter counter. It does not select or mutate teams. Native broadcast delivery and additional team-switch logic remain open. Focused `cargo xtask test-group rust-team-announcement` 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.
|
| 2368 |
+
|
| 2369 |
+
|
| 2370 |
+
## 2026-10-28 — RE-928 Original connect suffix with bot wrapper and announcements
|
| 2371 |
+
|
| 2372 |
+
144 original173979 suffix cases execute actual161744 settings/drop wrapper and182896 announcement body instead of supplied bot booleans and captured team callback. Parent control/state remains source-identical; extra userinfo selector toggles, setup records, drops, exact announcement bytes and formatter carry are verified. Native125185 setup,171668 userinfo mutation, ranking/network/logging remain supplied/captured. Focused `cargo xtask test-group qvm-resolved-connect-tail` passes (4 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
|
@@ -1861,3 +1861,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1861 |
|
| 1862 |
|
| 1863 |
- [x] RE-927 Rust team announcements and spectator suppression ([evidence](research/RUST_TEAM_ANNOUNCEMENT.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1861 |
|
| 1862 |
|
| 1863 |
- [x] RE-927 Rust team announcements and spectator suppression ([evidence](research/RUST_TEAM_ANNOUNCEMENT.md)).
|
| 1864 |
+
|
| 1865 |
+
|
| 1866 |
+
- [x] RE-928 Original connect suffix with bot wrapper and announcements ([evidence](research/QVM_RESOLVED_CONNECT_TAIL.md)).
|
docs/research/QVM_RESOLVED_CONNECT_TAIL.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Original connect suffix with bot wrapper and announcements
|
| 2 |
+
|
| 3 |
+
RE-928. Reproduce with `python3 scripts/analyze_qvm_resolved_connect_tail.py`; focused validation: `cargo xtask test-group qvm-resolved-connect-tail`. [Machine report](qvm-resolved-connect-tail.json).
|
| 4 |
+
|
| 5 |
+
144 original173979 suffix cases execute actual161744 settings/drop wrapper and182896 announcement body instead of supplied bot booleans and captured team callback. Parent control/state remains source-identical; extra userinfo selector toggles, setup records, drops, exact announcement bytes and formatter carry are verified. Native125185 setup,171668 userinfo mutation, ranking/network/logging remain supplied/captured.
|
| 6 |
+
|
| 7 |
+
Original executable/native runtime and complete Linux/macOS Rust/Bevy/Solari acceptance remain unverified.
|
docs/research/README.md
CHANGED
|
@@ -1396,3 +1396,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 1396 |
|
| 1397 |
|
| 1398 |
[RE-927: Rust team announcements and spectator suppression](RUST_TEAM_ANNOUNCEMENT.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1396 |
|
| 1397 |
|
| 1398 |
[RE-927: Rust team announcements and spectator suppression](RUST_TEAM_ANNOUNCEMENT.md).
|
| 1399 |
+
|
| 1400 |
+
|
| 1401 |
+
[RE-928: Original connect suffix with bot wrapper and announcements](QVM_RESOLVED_CONNECT_TAIL.md).
|
docs/research/qvm-resolved-connect-tail.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_resolved_connect_tail.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Execute the verified original QVM body; native effects are supplied or captured."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source,constants
|
| 6 |
+
from qvm_camera_world_support import B,run
|
| 7 |
+
from qvm_exit_rules_support import POOL,CPOOL
|
| 8 |
+
from analyze_qvm_acceleration import word,number
|
| 9 |
+
from analyze_qvm import write_json
|
| 10 |
+
|
| 11 |
+
def main():
|
| 12 |
+
q,raw,h,ins=source();rows=[]
|
| 13 |
+
from qvm_connect_policy_support import WATCH
|
| 14 |
+
from qvm_connect_callback_support import environment,resolved_tail
|
| 15 |
+
from qvm_map_commands_support import put_string
|
| 16 |
+
for mode,team,bot,first,answer,changed in itertools.product([0,3,9],[0,2,3],[0,1],[0,1],[0,1],[False,True]):
|
| 17 |
+
m,b=environment(raw,h);slot=3;pointer=CPOOL+6336*slot
|
| 18 |
+
for o in range(0,6336,4):m[pointer+o]=0xaabbccdd
|
| 19 |
+
now=2147483647 if mode==9 else 100;seconds={0:0,2:2,3:-1}[team];m.update({pointer+3096:team,34090788:mode,34992532:now,34085460:seconds,POOL+880*slot+424:32,POOL+880*slot+532:0});put_string(m,b,pointer+504,b'old');m,p,b=resolved_tail(ins,m,b,slot,first,bot,b'\\characterfile\\bots/a.c\\skill\\1.5\\team\\red',answer,2 if changed else None,b'new^1name');p.update(input=dict(mode=mode,team=team,bot=bot,first=first,answer=answer,changed=changed,now=now,seconds=seconds),words={str(o):m[pointer+o]&0xffffffff for o in WATCH},entity_flags=m[POOL+880*slot+424]&0xffffffff,in_use=m[POOL+880*slot+532]&0xffffffff,ring=m[23708]&0xffffffff,info_ring=m[23712]&0xffffffff);rows.append(p)
|
| 20 |
+
|
| 21 |
+
write_json(Path('docs/research/qvm-resolved-connect-tail.json'),{'source':q['source'],'sha256':q['sha256'],'root':173979,'probes':rows,'limits':'144 original173979 suffix cases execute actual161744 settings/drop wrapper and182896 announcement body instead of supplied bot booleans and captured team callback. Parent control/state remains source-identical; extra userinfo selector toggles, setup records, drops, exact announcement bytes and formatter carry are verified. Native125185 setup,171668 userinfo mutation, ranking/network/logging remain supplied/captured.'})
|
| 22 |
+
if __name__=='__main__':main()
|
scripts/qvm_connect_callback_support.py
CHANGED
|
@@ -32,3 +32,20 @@ def team_announcement(ins,m,b,pointer,previous):
|
|
| 32 |
def fmt(i,m,a,bs):return final_format(i,m,a,dict(bs),formatter)
|
| 33 |
def send(i,m,a,bs):sends.append(dict(recipient=a[8],text=cstring(m,bs,a[12]).hex()));return m,0,{'network_send_captured':True}
|
| 34 |
m,v,p,b=run(ins,m,182896,183023,28,{8:pointer,12:previous},b,{70458:fmt,-18:send},base=ANNOUNCE);p.update(sends=sends);return m,p,b
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
def fmt(i,m,a,bs):return final_format(i,m,a,dict(bs),formatter)
|
| 33 |
def send(i,m,a,bs):sends.append(dict(recipient=a[8],text=cstring(m,bs,a[12]).hex()));return m,0,{'network_send_captured':True}
|
| 34 |
m,v,p,b=run(ins,m,182896,183023,28,{8:pointer,12:previous},b,{70458:fmt,-18:send},base=ANNOUNCE);p.update(sends=sends);return m,p,b
|
| 35 |
+
|
| 36 |
+
def resolved_handlers(slot,userinfo,answer,after_team,name,events,children):
|
| 37 |
+
from qvm_connect_policy_support import tail_handlers
|
| 38 |
+
handlers=tail_handlers(slot,answer,after_team,name,events)
|
| 39 |
+
def bot(i,m,a,bs):
|
| 40 |
+
events.append(dict(op='bot',slot=a[8],restart=a[12]));m,p,b=bot_settings(i,m,dict(bs),a[8],a[12],userinfo,answer);children['bot']=p;return m,p['result'],{'actual_source_child':161744}
|
| 41 |
+
def announce(i,m,a,bs):
|
| 42 |
+
events.append(dict(op='join',slot=slot,choice=a[12]));m,p,b=team_announcement(i,m,dict(bs),a[8],a[12]);children.setdefault('announcements',[]).extend(p['sends']);return m,0,{'actual_source_child':182896}
|
| 43 |
+
handlers.update({161744:bot,182896:announce});return handlers
|
| 44 |
+
|
| 45 |
+
def resolved_tail(ins,m,b,slot,first,bot,userinfo,answer,after_team,name):
|
| 46 |
+
from qvm_connect_policy_support import TAIL
|
| 47 |
+
from qvm_exit_rules_support import CPOOL
|
| 48 |
+
from qvm_camera_world_support import POOL
|
| 49 |
+
import hashlib,json
|
| 50 |
+
events=[];children={};m[TAIL+20]=CPOOL+6336*slot;m[TAIL+24]=POOL+880*slot
|
| 51 |
+
m,v,p,b=run(ins,m,174173,174397,1080,{8:slot,12:first,16:bot},b,resolved_handlers(slot,userinfo,answer,after_team,name,events,children),base=TAIL);changes=p.pop('changes');p.update(change_count=len(changes),changes_sha256=hashlib.sha256(json.dumps(changes,sort_keys=True).encode()).hexdigest(),events=events,children=children,accepted=v==0,message=None if v==0 else cstring(m,b,v).hex());return m,p,b
|
scripts/test_qvm_resolved_connect_tail.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
class ResolvedTests(unittest.TestCase):
|
| 4 |
+
def test_actual_children_and_preserved_parent_state(self):
|
| 5 |
+
rows=json.loads(Path('docs/research/qvm-resolved-connect-tail.json').read_text())['probes'];old=json.loads(Path('docs/research/qvm-connect-tail.json').read_text())['probes'];self.assertEqual(len(rows),144)
|
| 6 |
+
for p,prior in zip(rows,old):
|
| 7 |
+
for k in ['input','events','accepted','message','words','entity_flags','in_use']:self.assertEqual(p[k],prior[k])
|
| 8 |
+
a=p['input'];bot=p['children'].get('bot');self.assertEqual(bot is not None,bool(a['bot']));self.assertEqual(p['info_ring'],int(bool(a['bot'])))
|
| 9 |
+
if bot:
|
| 10 |
+
self.assertEqual(bot['result'],int(bool(a['answer'])));self.assertEqual(bytes.fromhex(bot['settings'][0])[144:148],bytes.fromhex('0000c03f'));self.assertEqual(bot['calls'][-1]['op'],'setup' if a['answer'] else 'drop')
|
| 11 |
+
notice=p['children'].get('announcements',[]);joined=any(e['op']=='join' for e in p['events']);self.assertEqual(notice,[{'recipient':-1,'text':b'ccprint "5" "new^1name" "2"'.hex()}] if joined else []);self.assertEqual(p['ring'],prior['ring']+int(joined))
|
| 12 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -3042,3 +3042,8 @@ report scripts/analyze_rust_team_announcement.py docs/research/rust-team-announc
|
|
| 3042 |
edge docs/research/rust-team-announcement.json scripts/test_rust_team_announcement.py
|
| 3043 |
group rust-team-announcement scripts/analyze_rust_team_announcement.py
|
| 3044 |
edge scripts/analyze_rust_team_announcement.py scripts/analyze_qvm_resumer_audit.py
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3042 |
edge docs/research/rust-team-announcement.json scripts/test_rust_team_announcement.py
|
| 3043 |
group rust-team-announcement scripts/analyze_rust_team_announcement.py
|
| 3044 |
edge scripts/analyze_rust_team_announcement.py scripts/analyze_qvm_resumer_audit.py
|
| 3045 |
+
edge docs/research/qvm-connect-tail.json scripts/test_qvm_resolved_connect_tail.py
|
| 3046 |
+
report scripts/analyze_qvm_resolved_connect_tail.py docs/research/qvm-resolved-connect-tail.json
|
| 3047 |
+
edge docs/research/qvm-resolved-connect-tail.json scripts/test_qvm_resolved_connect_tail.py
|
| 3048 |
+
group qvm-resolved-connect-tail scripts/analyze_qvm_resolved_connect_tail.py
|
| 3049 |
+
edge scripts/analyze_qvm_resolved_connect_tail.py scripts/analyze_qvm_resumer_audit.py
|