qvm: geometric model hierarchy
Browse files- docs/ASSET_PIPELINE_TODO.md +3 -0
- 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_GEOMETRIC_HIERARCHY.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-geometric-hierarchy.json +0 -0
- scripts/analyze_qvm_geometric_hierarchy.py +52 -0
- scripts/analyze_qvm_model_hierarchy.py +5 -3
- scripts/test_qvm_complete_leaf.py +7 -3
- scripts/test_qvm_geometric_hierarchy.py +21 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -730,3 +730,6 @@ Research progress: RE-685 [report](research/QVM_LEAF_HIT_PUBLISH.md); remaining
|
|
| 730 |
|
| 731 |
|
| 732 |
Research progress: RE-686 [report](research/QVM_COMPLETE_LEAF.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 730 |
|
| 731 |
|
| 732 |
Research progress: RE-686 [report](research/QVM_COMPLETE_LEAF.md); remaining native/content/runtime/platform scope stays open.
|
| 733 |
+
|
| 734 |
+
|
| 735 |
+
Research progress: RE-687 [report](research/QVM_GEOMETRIC_HIERARCHY.md); remaining native/content/runtime/platform scope stays open.
|
docs/FINDINGS.md
CHANGED
|
@@ -1076,3 +1076,6 @@ Bounded qagame paths recover bomb-plant/inactivity correction requests, direct f
|
|
| 1076 |
|
| 1077 |
|
| 1078 |
**RE-686 — Complete packed-model leaf geometry and source-produced hit records:** Complete23092 now produces actual geometry-derived context records through packed vertices, ancestry, barycentrics, source normals/points and actual metadata lookup. [Evidence](research/QVM_COMPLETE_LEAF.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1076 |
|
| 1077 |
|
| 1078 |
**RE-686 — Complete packed-model leaf geometry and source-produced hit records:** Complete23092 now produces actual geometry-derived context records through packed vertices, ancestry, barycentrics, source normals/points and actual metadata lookup. [Evidence](research/QVM_COMPLETE_LEAF.md).
|
| 1079 |
+
|
| 1080 |
+
|
| 1081 |
+
**RE-687 — Recursive model traversal with actual leaf geometry:** 25341 now composes actual22009 and23092 through recursive hierarchies, producing hit records from packed geometry rather than supplied leaf replies. [Evidence](research/QVM_GEOMETRIC_HIERARCHY.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1059,3 +1059,6 @@ Research progress: RE-685 [report](research/QVM_LEAF_HIT_PUBLISH.md); remaining
|
|
| 1059 |
|
| 1060 |
|
| 1061 |
Research progress: RE-686 [report](research/QVM_COMPLETE_LEAF.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 1059 |
|
| 1060 |
|
| 1061 |
Research progress: RE-686 [report](research/QVM_COMPLETE_LEAF.md); remaining native/content/runtime/platform scope stays open.
|
| 1062 |
+
|
| 1063 |
+
|
| 1064 |
+
Research progress: RE-687 [report](research/QVM_GEOMETRIC_HIERARCHY.md); remaining native/content/runtime/platform scope stays open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1082,3 +1082,8 @@ Actual queried/allocated grenade enters223156, evaluates source trajectory, trun
|
|
| 1082 |
## 2026-10-21 — RE-686 Complete packed-model leaf geometry and source-produced hit records (separate task commit)
|
| 1083 |
|
| 1084 |
Complete23092 now produces actual geometry-derived context records through packed vertices, ancestry, barycentrics, source normals/points and actual metadata lookup. 36 whole-context compositions check hits/misses/behind-origin/multiple surfaces/twelve triangles/capacity with independent geometry and publication oracles; mixed word/byte copy coherence has a dedicated regression. Full suite: 1202 tests pass. Report regenerates byte-identically (354732 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime changed; shared STORE4 synchronizes active byte memory, with an independent regression; native/reference/legal/full platform scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1082 |
## 2026-10-21 — RE-686 Complete packed-model leaf geometry and source-produced hit records (separate task commit)
|
| 1083 |
|
| 1084 |
Complete23092 now produces actual geometry-derived context records through packed vertices, ancestry, barycentrics, source normals/points and actual metadata lookup. 36 whole-context compositions check hits/misses/behind-origin/multiple surfaces/twelve triangles/capacity with independent geometry and publication oracles; mixed word/byte copy coherence has a dedicated regression. Full suite: 1202 tests pass. Report regenerates byte-identically (354732 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime changed; shared STORE4 synchronizes active byte memory, with an independent regression; native/reference/legal/full platform scope remains open.
|
| 1085 |
+
|
| 1086 |
+
|
| 1087 |
+
## 2026-10-21 — RE-687 Recursive model traversal with actual leaf geometry (separate task commit)
|
| 1088 |
+
|
| 1089 |
+
25341 now composes actual22009 and23092 through recursive hierarchies, producing hit records from packed geometry rather than supplied leaf replies. 18 postorder compositions independently check every leaf context, ancestry matrix, carried record count, hit/miss outcome and caller return. Full suite: 1206 tests pass. Report regenerates byte-identically (423592 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -1102,3 +1102,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1102 |
|
| 1103 |
|
| 1104 |
- [x] RE-686 Complete packed-model leaf geometry and source-produced hit records ([report](research/QVM_COMPLETE_LEAF.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1102 |
|
| 1103 |
|
| 1104 |
- [x] RE-686 Complete packed-model leaf geometry and source-produced hit records ([report](research/QVM_COMPLETE_LEAF.md)).
|
| 1105 |
+
|
| 1106 |
+
|
| 1107 |
+
- [x] RE-687 Recursive model traversal with actual leaf geometry ([report](research/QVM_GEOMETRIC_HIERARCHY.md)).
|
docs/research/QVM_GEOMETRIC_HIERARCHY.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Recursive model traversal with actual leaf geometry
|
| 2 |
+
|
| 3 |
+
RE-687. Reproduce with `python3 scripts/analyze_qvm_geometric_hierarchy.py`; check with `python3 scripts/test_qvm_geometric_hierarchy.py`. The [machine report](qvm-geometric-hierarchy.json) retains source identity and bounded fixtures.
|
| 4 |
+
|
| 5 |
+
An optional leaf resolver preserves the earlier captured-leaf report while the new composition executes complete23092. Packed surfaces, actual child transforms and recursive source traversal determine hit/miss outcomes. Independent geometry oracles verify each leaf and context continuity in source postorder. Each leaf initializes its own nearest/farthest bounds while record count carries across leaves, a behavior retained rather than replaced with a single global bound accumulator. Native sqrt remains explicit. Model tables, hierarchy bounds and asset identities are fixtures; original runtime/native parity remains unverified.
|
| 6 |
+
|
| 7 |
+
No original executable/full QVM/native collision/physics/rendering executes. Native responses and legal input domains are supplied or unverified where stated; full runtime/macOS/Linux Rust/Bevy/Solari gameplay remains open.
|
docs/research/README.md
CHANGED
|
@@ -660,3 +660,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 660 |
|
| 661 |
|
| 662 |
[RE-686: Complete packed-model leaf geometry and source-produced hit records](QVM_COMPLETE_LEAF.md). Reproduce with `python3 scripts/analyze_qvm_complete_leaf.py`; check with `python3 scripts/test_qvm_complete_leaf.py`.
|
|
|
|
|
|
|
|
|
|
|
|
| 660 |
|
| 661 |
|
| 662 |
[RE-686: Complete packed-model leaf geometry and source-produced hit records](QVM_COMPLETE_LEAF.md). Reproduce with `python3 scripts/analyze_qvm_complete_leaf.py`; check with `python3 scripts/test_qvm_complete_leaf.py`.
|
| 663 |
+
|
| 664 |
+
|
| 665 |
+
[RE-687: Recursive model traversal with actual leaf geometry](QVM_GEOMETRIC_HIERARCHY.md). Reproduce with `python3 scripts/analyze_qvm_geometric_hierarchy.py`; check with `python3 scripts/test_qvm_geometric_hierarchy.py`.
|
docs/research/qvm-geometric-hierarchy.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_geometric_hierarchy.py
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""25341 with actual22009 and actual23092 geometry, no supplied hit replies."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source
|
| 6 |
+
from analyze_qvm_model_hierarchy import fixture,walk,NODES,ROOT
|
| 7 |
+
from analyze_qvm_complete_leaf import leaf,words,CONTEXT,ORIGIN,DIRECTION
|
| 8 |
+
from analyze_qvm_surface_category import support,put_text
|
| 9 |
+
from analyze_qvm_slide_prefix import vec
|
| 10 |
+
from analyze_qvm_acceleration import word
|
| 11 |
+
from analyze_qvm import write_json
|
| 12 |
+
VERTICES=[[0,0,0],[256,0,0],[0,256,0]]
|
| 13 |
+
NAMES=['h_head','u_torso','l_rfoot','g_vest']
|
| 14 |
+
|
| 15 |
+
def attach(m,bs,node,part,name,vertices=VERTICES):
|
| 16 |
+
model=m[node+88];m[model+84]=1;m[model+100]=part-model;m.update({part+80:3,part+84:1,part+88:128,part+100:512,part+104:1024});put_text(m,bs,part+4,name.encode())
|
| 17 |
+
for j in range(3):m[part+128+4*j]=j
|
| 18 |
+
for frame in range(2):
|
| 19 |
+
for j,v in enumerate(vertices):
|
| 20 |
+
address=part+512+(frame*3+j)*8;data=b''.join(int(x).to_bytes(2,'little',signed=True) for x in v)+b'\0\0'
|
| 21 |
+
for k,b in enumerate(data):bs[address+k]=b
|
| 22 |
+
|
| 23 |
+
def describe(m,args,name,vertices=VERTICES):
|
| 24 |
+
chain=[];node=args[8];p=node;seen=set()
|
| 25 |
+
while p:
|
| 26 |
+
if p in seen:raise ValueError('cyclic fixture ancestry')
|
| 27 |
+
seen.add(p);chain.append([[m[p+12+16*r+4*c]&0xffffffff for c in range(4)] for r in range(4)]);p=m[p+96]
|
| 28 |
+
return {'surfaces':[{'name':name,'packed_vertices':vertices,'triangles':[[0,1,2]]}],'origin':vec(m,args[12]),'direction':vec(m,args[16]),'null_word4':m[4],'basis_chain':chain,'node_origin':vec(m,node+76)}
|
| 29 |
+
|
| 30 |
+
def geometric_walk(ins,m,bs,args,names):
|
| 31 |
+
def resolved(i,m,a):
|
| 32 |
+
inputs=describe(m,a,names[a[8]]);m,r=leaf(i,m,bs,a);r['input']=inputs;return m,r
|
| 33 |
+
m,r=walk(ins,m,args,leaf_resolver=resolved)
|
| 34 |
+
return m,{'arguments':args,'leaf_reports':r['leaf_requests'],'execution':{k:v for k,v in r['execution'].items() if k!='children'},'final_context':words(m,args[20])}
|
| 35 |
+
|
| 36 |
+
def main():
|
| 37 |
+
q,raw,h,ins=source();rows=[]
|
| 38 |
+
for kind,fraction,hit in itertools.product(['none','flat','nested'],[0,.5,1],[False,True]):
|
| 39 |
+
m,adj=fixture(kind,fraction);s,bs=support(raw,h);m.update(s)
|
| 40 |
+
for index,node in enumerate(NODES):
|
| 41 |
+
for j in range(3):m[node+76+4*j]=0
|
| 42 |
+
model=m[node+88];count=m[model+80]
|
| 43 |
+
for frame in range(2):
|
| 44 |
+
for child in range(count):
|
| 45 |
+
for j in range(3):m[model+1280+(frame*count+child)*112+64+4*j]=0
|
| 46 |
+
attach(m,bs,node,0x78e00000+4096*index,NAMES[index])
|
| 47 |
+
for o in range(0,308,4):m[CONTEXT+o]=0
|
| 48 |
+
for p,v in [(ORIGIN,(.25,.25,1) if hit else (20,20,1)),(DIRECTION,(0,0,-1))]:
|
| 49 |
+
for j,x in enumerate(v):m[p+4*j]=word(x)
|
| 50 |
+
initial=words(m,CONTEXT);m,r=geometric_walk(ins,m,bs,{8:ROOT,12:ORIGIN,16:DIRECTION,20:CONTEXT},dict(zip(NODES,NAMES)));r.update({'kind':kind,'fraction':word(fraction),'hit_fixture':hit,'initial_context':initial});rows.append(r)
|
| 51 |
+
write_json(Path('docs/research/qvm-geometric-hierarchy.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Actual25341/22009/23092 including metadata and geometry over explicit packed surfaces. No leaf hit responses supplied. Native sqrt modeled; actual asset identity/live bounds/engine collision remain unverified.'})
|
| 52 |
+
if __name__=='__main__':main()
|
scripts/analyze_qvm_model_hierarchy.py
CHANGED
|
@@ -18,7 +18,7 @@ def transform_child(ins,m,args,cmd):
|
|
| 18 |
samples=[m[sample+o]&0xffffffff for o in range(64,112,4)];m[TRANSFORM_LOCAL+228]=child;m[TRANSFORM_LOCAL+232]=sample;m,_,e=execute(ins,22010,23090,m,cmd,TRANSFORM_LOCAL)
|
| 19 |
return m,cmd,0,{'child':child,'initial_record':before,'sample_words64_108':samples,'origin_contract':{'parents':parents,'sample_origin':samples[:3]},'final_record':[m[child+o]&0xffffffff for o in range(0,112,4)],'execution':e}
|
| 20 |
|
| 21 |
-
def walk(ins,m,args,depth=0):
|
| 22 |
if depth>8:raise ValueError('fixture hierarchy depth exceeded')
|
| 23 |
m=dict(m);base=0x78200000+depth*4096
|
| 24 |
for o,v in args.items():m[base+208+o]=v
|
|
@@ -26,9 +26,11 @@ def walk(ins,m,args,depth=0):
|
|
| 26 |
def transform(i,m,a,c):
|
| 27 |
m,c,v,r=transform_child(i,m,a,c);transforms.append(r);return m,c,v,r
|
| 28 |
def recurse(i,m,a,c):
|
| 29 |
-
m,r=walk(i,m,a,depth+1);nested.append(r);leaves.extend(r['leaf_requests']);return m,c,0,r
|
| 30 |
def leaf(i,m,a,c):
|
| 31 |
-
r={'arguments':a,'node':a[8],'leaf_geometry_not_executed':True}
|
|
|
|
|
|
|
| 32 |
m,_,e=execute(ins,25342,25833,m,(0,0,0),base,{22009:transform,25341:recurse,23092:leaf})
|
| 33 |
return m,{'arguments':args,'depth':depth,'transforms':transforms,'nested':nested,'leaf_requests':leaves,'execution':e}
|
| 34 |
|
|
|
|
| 18 |
samples=[m[sample+o]&0xffffffff for o in range(64,112,4)];m[TRANSFORM_LOCAL+228]=child;m[TRANSFORM_LOCAL+232]=sample;m,_,e=execute(ins,22010,23090,m,cmd,TRANSFORM_LOCAL)
|
| 19 |
return m,cmd,0,{'child':child,'initial_record':before,'sample_words64_108':samples,'origin_contract':{'parents':parents,'sample_origin':samples[:3]},'final_record':[m[child+o]&0xffffffff for o in range(0,112,4)],'execution':e}
|
| 20 |
|
| 21 |
+
def walk(ins,m,args,depth=0,leaf_resolver=None):
|
| 22 |
if depth>8:raise ValueError('fixture hierarchy depth exceeded')
|
| 23 |
m=dict(m);base=0x78200000+depth*4096
|
| 24 |
for o,v in args.items():m[base+208+o]=v
|
|
|
|
| 26 |
def transform(i,m,a,c):
|
| 27 |
m,c,v,r=transform_child(i,m,a,c);transforms.append(r);return m,c,v,r
|
| 28 |
def recurse(i,m,a,c):
|
| 29 |
+
m,r=walk(i,m,a,depth+1,leaf_resolver);nested.append(r);leaves.extend(r['leaf_requests']);return m,c,0,r
|
| 30 |
def leaf(i,m,a,c):
|
| 31 |
+
if leaf_resolver is None:r={'arguments':a,'node':a[8],'leaf_geometry_not_executed':True}
|
| 32 |
+
else:m,r=leaf_resolver(i,m,a);r={'arguments':a,'node':a[8],'effect':r}
|
| 33 |
+
leaves.append(r);return m,c,0,r
|
| 34 |
m,_,e=execute(ins,25342,25833,m,(0,0,0),base,{22009:transform,25341:recurse,23092:leaf})
|
| 35 |
return m,{'arguments':args,'depth':depth,'transforms':transforms,'nested':nested,'leaf_requests':leaves,'execution':e}
|
| 36 |
|
scripts/test_qvm_complete_leaf.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
import json,unittest
|
| 2 |
from pathlib import Path
|
| 3 |
-
from test_qvm_ground import word,n
|
| 4 |
from test_qvm_ray_triangle import expected as candidate
|
| 5 |
from test_qvm_hit_geometry import expected as geometry
|
| 6 |
|
|
@@ -8,9 +8,13 @@ def expected(p):
|
|
| 8 |
r=p['before'][:];near=word(1e7);far=word(0);a=p['input']
|
| 9 |
for index,s in enumerate(a['surfaces']):
|
| 10 |
for triangle in s['triangles']:
|
| 11 |
-
vertices=[[word(v/64) for v in s['packed_vertices'][j]] for j in triangle]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
if not hit:continue
|
| 13 |
-
c.update({'u':u,'v':v,'parameter':t});normal,edges,point=geometry({'candidate':c});category={'h_head':1,'u_torso':3}.get(s['name'],a['null_word4'])
|
| 14 |
if n(t)<n(near):near=t;r[3:6]=point;r[9:12]=normal;r[15]=index
|
| 15 |
if n(t)>n(far):far=t;r[:3]=point;r[6:9]=normal;r[14]=index
|
| 16 |
count=r[16]
|
|
|
|
| 1 |
import json,unittest
|
| 2 |
from pathlib import Path
|
| 3 |
+
from test_qvm_ground import word,n,f
|
| 4 |
from test_qvm_ray_triangle import expected as candidate
|
| 5 |
from test_qvm_hit_geometry import expected as geometry
|
| 6 |
|
|
|
|
| 8 |
r=p['before'][:];near=word(1e7);far=word(0);a=p['input']
|
| 9 |
for index,s in enumerate(a['surfaces']):
|
| 10 |
for triangle in s['triangles']:
|
| 11 |
+
vertices=[[word(v/64) for v in s['packed_vertices'][j]] for j in triangle]
|
| 12 |
+
if 'basis_chain' in a:
|
| 13 |
+
from test_qvm_leaf_basis import expected as matrix
|
| 14 |
+
b=[[n(x) for x in row] for row in matrix(a['basis_chain'])];o=list(map(n,a['node_origin']));vertices=[[word(f(f(f(f(n(v[0])*b[0][c])+f(n(v[1])*b[1][c]))+f(n(v[2])*b[2][c]))+o[c])) for c in range(3)] for v in vertices]
|
| 15 |
+
c={'vertices':vertices,'origin':a['origin'],'direction':a['direction']};hit,det,u,v,t=candidate(c)
|
| 16 |
if not hit:continue
|
| 17 |
+
c.update({'u':u,'v':v,'parameter':t});normal,edges,point=geometry({'candidate':c});category={'h_head':1,'u_torso':3,'l_rfoot':14,'g_vest':4}.get(s['name'],a['null_word4'])
|
| 18 |
if n(t)<n(near):near=t;r[3:6]=point;r[9:12]=normal;r[15]=index
|
| 19 |
if n(t)>n(far):far=t;r[:3]=point;r[6:9]=normal;r[14]=index
|
| 20 |
count=r[16]
|
scripts/test_qvm_geometric_hierarchy.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from test_qvm_complete_leaf import expected
|
| 4 |
+
N=[0x78300000+4096*j for j in range(4)]
|
| 5 |
+
class GeometricHierarchyTests(unittest.TestCase):
|
| 6 |
+
@classmethod
|
| 7 |
+
def setUpClass(cls):cls.rows=json.loads(Path('docs/research/qvm-geometric-hierarchy.json').read_text())['probes']
|
| 8 |
+
def test_independent_every_leaf_and_context_continuation(self):
|
| 9 |
+
self.assertEqual(len(self.rows),18)
|
| 10 |
+
for p in self.rows:
|
| 11 |
+
previous=p['initial_context']
|
| 12 |
+
for request in p['leaf_reports']:
|
| 13 |
+
r=request['effect'];self.assertEqual(r['before'],previous);self.assertEqual(r['after'],expected(r));previous=r['after']
|
| 14 |
+
self.assertEqual(p['final_context'],previous)
|
| 15 |
+
def test_actual_postorder_and_source_leaves(self):
|
| 16 |
+
for p in self.rows:self.assertEqual([r['node'] for r in p['leaf_reports']],{'none':[N[0]],'flat':[N[1],N[2],N[0]],'nested':[N[1],N[3],N[2],N[0]]}[p['kind']]);self.assertTrue(all('effect' in r and 'leaf_geometry_not_executed' not in r for r in p['leaf_reports']))
|
| 17 |
+
def test_hits_derived_from_packed_geometry_or_missed(self):
|
| 18 |
+
for p in self.rows:self.assertEqual(p['final_context'][16],len(p['leaf_reports']) if p['hit_fixture'] else 0)
|
| 19 |
+
def test_all_void_geometry_returns_reach_caller_boundary(self):
|
| 20 |
+
for p in self.rows:self.assertIsNone(p['execution']['return']);self.assertTrue(all(r['effect']['execution']['stop']==25339 for r in p['leaf_reports']))
|
| 21 |
+
if __name__=='__main__':unittest.main()
|