Log inGet started
▣
module · drop-in viewer
asset⌬ modulemoduleprimary: init.luau·part ofpackage ZeroBlender.package·originates fromworld 240544fe-7…

blenderSession

<!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. -->

by◐Deata·posted 16d ago
What it does

blenderSession

<!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. -->

TODO: describe this module.

Interface

What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.

conforms to

zero/source-extract/v2

Blender MCP compatibility session. The public language is Python/bpy.

Model

array(v: ?) → void

argtypedescription
v?

native(fn: ?) → void

argtypedescription
fn?

arg(a: ?, k: ?, n: ?, name: ?, default: ?) → void

argtypedescription
a?
k?
n?
name?
default?

vecOf(x: ?) → void

argtypedescription
x?

trackQuat(v: ?, track: ?, up: ?) → void

mathutils Vector.to_track_quat: Blender's vec_to_quat (math_rotation.cc), on the negated vector.

argtypedescription
v?
track?
up?

vlen(d: ?) → void

argtypedescription
d?

VGET(key: ?, V: ?) → void

argtypedescription
key?
V?

VSET(key: ?, value: ?, V: ?) → void

argtypedescription
key?
value?
V?

VITER(V: ?) → void

argtypedescription
V?

VBIN(op: ?, b: ?, V: ?) → void

argtypedescription
op?
b?
V?

VRBIN(op: ?, a: ?, V: ?) → void

argtypedescription
op?
a?
V?

vector(data: ?, onChange: ?) → void

argtypedescription
data?
onChange?

v3(v: ?) → void

argtypedescription
v?

normal(vertices: ?, f: ?) → void

argtypedescription
vertices?
f?

orient(mesh: ?) → void

argtypedescription
mesh?

new(name: ?) → void

argtypedescription
name?

unique(wanted: ?, collection: ?) → void

argtypedescription
wanted?
collection?

findObject(proxy: ?) → void

argtypedescription
proxy?

sync(o: ?) → void

argtypedescription
o?

activate(o: ?) → void

argtypedescription
o?

active( ) → void

pull(o: ?) → void

argtypedescription
o?

newObject(name: ?, mesh: ?) → void

argtypedescription
name?
mesh?

hostPath(p: ?) → void

Replays of real Blender sessions: paths on the host machine are redirected into the document (S.hostRoot), and a fresh document can be given Blender's startup scene (Camera and Light here; the replay adds the Cube).

argtypedescription
p?

seedBlenderDefaults( ) → void

worldMatrix(o: ?, depth: ?) → void

Blender world matrix: parent world @ matrix_parent_inverse @ basis.

argtypedescription
o?
depth?

parentWorld(o: ?, depth: ?) → void

The frame a child hangs from: the parent's world, or a bone's tail for BONE parenting.

argtypedescription
o?
depth?

setBasis(o: ?, m: ?) → void

argtypedescription
o?
m?

setWorld(o: ?, W: ?) → void

argtypedescription
o?
W?

unparentKeep(o: ?) → void

argtypedescription
o?

zeroTransform(W: ?) → void

Zero entity transform (basis (x,y,z) -> (x,z,-y)) for a Blender matrix.

argtypedescription
W?

objectType(o: ?) → void

argtypedescription
o?

curveMesh(o: ?) → void

A curve/text object renders through a mesh derived from its curve data.

argtypedescription
o?

ref(name: ?) → void

argtypedescription
name?

uvSync(mesh: ?) → void

argtypedescription
mesh?

uvRenderData(mesh: ?) → void

argtypedescription
mesh?

resetUV(mesh: ?) → void

Blender's default UV for a new first layer: each quad fills 0..1; other n-gons sit on a unit circle.

argtypedescription
mesh?

copyUV(d: ?) → void

argtypedescription
d?

seq(name: ?, items: ?, lookup: ?, at: ?) → void

`at(i)` (0-based) answers one element without building the whole list: per-element access inside a loop must stay O(1).

argtypedescription
name?
items?
lookup?
at?

q8(x: ?) → void

argtypedescription
x?

imageProxy(img: ?) → void

argtypedescription
img?

touch( ) → void

setAll(v: ?) → void

argtypedescription
v?

textureProxy(t: ?) → void

argtypedescription
t?

sampleTex(t: ?, u: ?, v: ?) → void

Blender image texture lookup: nearest = floor(u*W); interpolated = bilinear with texel centres at u*W-0.5. Pixels are stored bottom row first, as in Blender.

argtypedescription
t?
u?
v?

wrap(i: ?, n: ?) → void

argtypedescription
i?
n?

px(x: ?, y: ?) → void

argtypedescription
x?
y?

mix(a: ?, b: ?, c: ?, d: ?) → void

argtypedescription
a?
b?
c?
d?

decodeCpu(cpu: ?) → void

argtypedescription
cpu?

encodeImage(img: ?, rep: ?) → void

rep > 1 blows each texel up to rep x rep (crisp 'Closest' look under any sampler).

argtypedescription
img?
rep?

b(x: ?) → void

argtypedescription
x?

safeName(x: ?) → void

argtypedescription
x?

imageTexture(img: ?, folder: ?, cache: ?, filter: ?) → void

Texture asset for an image, rewritten only when its pixels changed.

argtypedescription
img?
folder?
cache?
filter?

packRM(pk: ?, folder: ?, cache: ?, matName: ?) → void

glTF metallic-roughness packing: G = roughness, B = metallic.

argtypedescription
pk?
folder?
cache?
matName?

sample(im: ?, x: ?, y: ?) → void

argtypedescription
im?
x?
y?

shaderPath(id: ?) → void

argtypedescription
id?

parseDefault(d: ?) → void

argtypedescription
d?

shaderSchema(id: ?) → void

argtypedescription
id?

zeroIns(n: ?) → void

argtypedescription
n?

newNode(mat: ?, bl: ?) → void

argtypedescription
mat?
bl?

setZeroShader(n: ?, id: ?) → void

argtypedescription
n?
id?

ensureGraph(mat: ?) → void

argtypedescription
mat?

sockProxy(mat: ?, n: ?, sname: ?, isOut: ?) → void

argtypedescription
mat?
n?
sname?
isOut?

nodeProxy(mat: ?, n: ?) → void

argtypedescription
mat?
n?

sockets(get: ?, isOut: ?) → void

argtypedescription
get?
isOut?

materialSpec(mat: ?) → void

Zero PBR properties and texture slots for a material's node graph.

argtypedescription
mat?

src(name: ?) → void

argtypedescription
name?

img(l: ?) → void

argtypedescription
l?

materialShader(mat: ?) → void

argtypedescription
mat?

materialSig(mat: ?) → void

argtypedescription
mat?

applyMaterial(ref: ?, mat: ?, texFolder: ?, cache: ?) → void

argtypedescription
ref?
mat?
texFolder?
cache?

serializeGraph(mat: ?) → void

argtypedescription
mat?

restoreGraph(mat: ?, g: ?) → void

argtypedescription
mat?
g?

materialProxy(mat: ?) → void

argtypedescription
mat?

linkProxy(l: ?) → void

argtypedescription
l?

vertexProxy(mesh: ?, i: ?) → void

argtypedescription
mesh?
i?

loopStarts(mesh: ?) → void

Face-corner (loop) numbering, as Blender's mesh.loops: faces in order, corners in order.

argtypedescription
mesh?

locateLoop(mesh: ?, li: ?) → void

argtypedescription
mesh?
li?

newell(pts: ?) → void

argtypedescription
pts?

polyTris(pts: ?) → void

Triangles (1-based corner positions) covering one polygon: quads split 1-3 as Blender does, ngons ear-clipped.

argtypedescription
pts?

loopTris(mesh: ?) → void

argtypedescription
mesh?

loopTriProxy(mesh: ?, i: ?, t: ?) → void

argtypedescription
mesh?
i?
t?

corners( ) → void

deepCopy(v: ?, seen: ?) → void

argtypedescription
v?
seen?

faceProxy(mesh: ?, i: ?, bm: ?) → void

argtypedescription
mesh?
i?
bm?

center( ) → void

edgeList(mesh: ?) → void

argtypedescription
mesh?

addEdge(a: ?, b: ?, fi: ?) → void

argtypedescription
a?
b?
fi?

edgeProxy(mesh: ?, e: ?, bm: ?) → void

argtypedescription
mesh?
e?
bm?

getSel( ) → void

setSel(v: ?) → void

argtypedescription
v?

meshProxy(mesh: ?) → void

argtypedescription
mesh?

nv(li: ?) → void

argtypedescription
li?

loopProxy(li: ?, fi: ?, c: ?) → void

argtypedescription
li?
fi?
c?

layerProxy(l: ?) → void

argtypedescription
l?

idx( ) → void

uvLoop(fi: ?, k: ?) → void

argtypedescription
fi?
k?

byKey(k: ?) → void

argtypedescription
k?

addModifier(o: ?, name: ?, typ: ?) → void

argtypedescription
o?
name?
typ?

modifierProxy(mod: ?) → void

argtypedescription
mod?

objectProxy(o: ?) → void

argtypedescription
o?

rec(p: ?) → void

argtypedescription
p?

getitem(k: ?) → void

argtypedescription
k?

setitem(k: ?, v: ?) → void

argtypedescription
k?
v?

pointProxy(sp: ?, p: ?) → void

argtypedescription
sp?
p?

pointSeq(sp: ?, want: ?) → void

argtypedescription
sp?
want?

splineProxy(sp: ?) → void

argtypedescription
sp?

curveProxy(cu: ?) → void

argtypedescription
cu?

qmul(a: ?, b: ?) → void

argtypedescription
a?
b?

qaxis(ax: ?, ang: ?) → void

argtypedescription
ax?
ang?

eulerQuat(e: ?) → void

argtypedescription
e?

qrot(q: ?, v: ?) → void

argtypedescription
q?
v?

quatProxy(q: ?, onChange: ?) → void

argtypedescription
q?
onChange?

binary(op: ?, b: ?) → void

argtypedescription
op?
b?

toQuat(v: ?) → void

argtypedescription
v?

eulerProxy(e: ?) → void

argtypedescription
e?

matrixProxy(m: ?, onChange: ?) → void

argtypedescription
m?
onChange?

binary(op: ?, b: ?) → void

argtypedescription
op?
b?

toEulerVec(e: ?) → void

argtypedescription
e?

viewSet( ) → void

viewSettings(name: ?, t: ?) → void

argtypedescription
name?
t?

viewContext(key: ?) → void

argtypedescription
key?

fit(b: ?, hfov: ?, vfov: ?) → void

argtypedescription
b?
hfov?
vfov?

cameraPose(view: ?, persp: ?, aspect: ?) → void

Camera pose for the current view, in Zero coordinates. view: FRONT..BOTTOM, ISO or CURRENT.

argtypedescription
view?
persp?
aspect?

worldPose(pose: ?) → void

Session-local camera pose -> world pose, following wherever the session root was placed.

argtypedescription
pose?

qm(a: ?, b: ?) → void

argtypedescription
a?
b?

fitView(names: ?) → void

argtypedescription
names?

finished( ) → void

saveMain(a: ?, kw: ?) → void

argtypedescription
a?
kw?

walk(x: ?) → void

argtypedescription
x?

dispatch(group: ?, op: ?) → void

argtypedescription
group?
op?

info(msg: ?) → void

argtypedescription
msg?

pollEdit(op: ?) → void

argtypedescription
op?

selVerts(mesh: ?) → void

argtypedescription
mesh?

selEdgeKeys(mesh: ?) → void

argtypedescription
mesh?

selFaces(mesh: ?) → void

argtypedescription
mesh?

setSel(mesh: ?, vset: ?, fset: ?) → void

argtypedescription
mesh?
vset?
fset?

setSelFaces(mesh: ?, list: ?) → void

argtypedescription
mesh?
list?

editOp(name: ?, fn: ?) → void

argtypedescription
name?
fn?

loopcut(mesh: ?, k: ?) → void

argtypedescription
mesh?
k?

toLocal(o: ?, p: ?, isDir: ?) → void

argtypedescription
o?
p?
isDir?

shadeTargets( ) → void

setShade(o: ?, smooth: ?, angle: ?) → void

argtypedescription
o?
smooth?
angle?

byAngle(a: ?, kw: ?) → void

argtypedescription
a?
kw?

capFill(fs: ?, vs: ?, ids: ?, z: ?, fill: ?) → void

argtypedescription
fs?
vs?
ids?
z?
fill?

id(r: ?, s: ?) → void

argtypedescription
r?
s?

mid(a: ?, b: ?) → void

argtypedescription
a?
b?

addCurveObject(kw: ?, baseName: ?, cu: ?) → void

argtypedescription
kw?
baseName?
cu?

nurbsPrim(baseName: ?, pts: ?, order: ?, endpoint: ?, cyclic: ?) → void

argtypedescription
baseName?
pts?
order?
endpoint?
cyclic?

polysToGeom(vs: ?, fs: ?) → void

argtypedescription
vs?
fs?

geomToPolys(g: ?) → void

argtypedescription
g?

cloneFaces(fs: ?) → void

argtypedescription
fs?

mirrorPolys(vs: ?, fs: ?, axis: ?, merge: ?, thr: ?) → void

argtypedescription
vs?
fs?
axis?
merge?
thr?

generates(o: ?) → void

argtypedescription
o?

renderable(o: ?) → void

argtypedescription
o?

evaluate(o: ?, stop: ?) → void

Returns evaluated triangle geometry, per-triangle material slots (multi-material meshes only) and the polygon form when the last modifier preserved it.

argtypedescription
o?
stop?

needGeom( ) → void

toPolys( ) → void

locateInto(newGeom: ?) → void

argtypedescription
newGeom?

rgb(i: ?) → void

argtypedescription
i?

dirLocal(a: ?) → void

argtypedescription
a?

shadeArrays(g: ?, smooth: ?, tuv: ?, byIndex: ?) → void

Shading arrays in Zero basis (x,z,-y): flat splits every triangle, smooth welds by position.

argtypedescription
g?
smooth?
tuv?
byIndex?

tn(a: ?, b: ?, c: ?) → void

argtypedescription
a?
b?
c?

at(v: ?) → void

argtypedescription
v?

shadeByAngle(g: ?, angle: ?, tuv: ?) → void

Blender "Smooth by Angle": a corner averages the normals of faces around its position whose angle to its own face is within the limit; sharper edges stay hard.

argtypedescription
g?
angle?
tuv?

at(v: ?) → void

argtypedescription
v?

renderGeometry(o: ?, apply: ?) → void

argtypedescription
o?
apply?

subMesh(rg: ?, slot: ?) → void

argtypedescription
rg?
slot?

place(e: ?, o: ?) → void

argtypedescription
e?
o?

bmeshProxy(mesh: ?) → void

argtypedescription
mesh?

fresh( ) → void

key(x: ?, y: ?) → void

argtypedescription
x?
y?

add(f: ?, src: ?) → void

argtypedescription
f?
src?

quoteList(l: ?) → void

Render settings are kept (and introspectable through bl_rna) so scripts that configure renders run; Zero does not render them (bpy.ops.render.render is a no-op).

argtypedescription
l?

propType(v: ?) → void

argtypedescription
v?

enumItems(list: ?) → void

argtypedescription
list?

rnaBag(name: ?, spec: ?, hooks: ?) → void

argtypedescription
name?
spec?
hooks?

val(k: ?) → void

argtypedescription
k?

propProxy(k: ?) → void

argtypedescription
k?

makeRender(frames: ?) → void

argtypedescription
frames?

makeDisplay( ) → void

sceneExtra(k: ?) → void

argtypedescription
k?

sceneExtraSet(k: ?, v: ?) → void

argtypedescription
k?
v?

newScene(nm: ?) → void

argtypedescription
nm?

dataProxy(d: ?) → void

argtypedescription
d?

enumItemsProxy(list: ?) → void

argtypedescription
list?

enumProp(full: ?, pn: ?) → void

argtypedescription
full?
pn?

rnaType(tname: ?) → void

argtypedescription
tname?

rnaFor(n: ?) → void

argtypedescription
n?

sub3(x: ?, y: ?) → void

argtypedescription
x?
y?

dot3(x: ?, y: ?) → void

argtypedescription
x?
y?

closest(p: ?, a: ?, b: ?, c: ?) → void

Closest point on triangle abc to p (Ericson, Real-Time Collision Detection 5.1.5).

argtypedescription
p?
a?
b?
c?

bvhProxy(V: ?, T: ?) → void

argtypedescription
V?
T?

cellOf(x: ?, k: ?) → void

argtypedescription
x?
k?

nearest(p: ?, maxd: ?) → void

argtypedescription
p?
maxd?

writeBundle(sessionRoot: ?, issues: ?, triangles: ?) → void

The document's output.bundle: clips, entity_template and README, from the live hierarchy.

argtypedescription
sessionRoot?
issues?
triangles?

geoSize(g: ?) → void

argtypedescription
g?

writePending(id: ?, it: ?) → void

argtypedescription
id?
it?

queueMesh(id: ?, name: ?, geo: ?) → void

argtypedescription
id?
name?
geo?

spawn(fn: ?) → void

argtypedescription
fn?

cancel( ) → void

Stop everything this document has running and drop what it queued. The document keeps its last saved state on disk; nothing outlives the cancel.

startPersist(root: ?) → void

argtypedescription
root?

saveNow( ) → void

settle(timeout: ?) → void

argtypedescription
timeout?

flush( ) → void

hashInto(h: ?, v: ?) → void

Change detection hashes the geometry in place: encoding every mesh to JSON on each flush allocated the whole document again, every call.

argtypedescription
h?
v?

geoHash(m: ?) → void

argtypedescription
m?

signature(o: ?) → void

argtypedescription
o?

exportList(opts: ?) → void

argtypedescription
opts?

slotMaterial(o: ?, slot: ?) → void

argtypedescription
o?
slot?

exportGLB(path: ?, opts: ?) → void

glTF 2.0 binary export (Y-up, the basis Zero renders in). One primitive per material slot.

argtypedescription
path?
opts?

blob(kind: ?, data: ?, target: ?) → void

argtypedescription
kind?
data?
target?

materialFor(m: ?) → void

argtypedescription
m?

writeProvenance(path: ?, result: ?) → void

Records which session, script history and modeling-code version produced an export.

argtypedescription
path?
result?

exportBundle(path: ?, opts: ?) → void

Native Zero bundle: meshes and materials are written inside the bundle, so it is a self-contained snapshot. Materials bound with zero_material are referenced as-is (custom shaders survive, which a GLB cannot carry).

argtypedescription
path?
opts?

safe(x: ?) → void

argtypedescription
x?

matFor(m: ?) → void

argtypedescription
m?

restore(doc: ?) → void

Rebuild the live, editable session (objects, meshes, materials, modifier stacks, parenting, view) from a saved session.json document.

argtypedescription
doc?

objectsCount(t: ?) → void

argtypedescription
t?

scene_info( ) → void

hideFromEditor( ) → void

Keep the editor camera's view clean: add !modelingWorkspace to its filter once. The user can take it out again (renderLayer.camera) to watch the agent work.

workspace( ) → void

resolve(name: ?) → void

argtypedescription
name?

onMemoryPressure( ) → void

previewName(key: ?) → void

argtypedescription
key?

evict(key: ?, force: ?) → void

argtypedescription
key?
force?

closeWorkspace( ) → void

armIdleClose( ) → void

useSession(key: ?) → void

argtypedescription
key?

session(name: ?) → void

argtypedescription
name?

Sub-parts

Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.

Showing up to 3 levels deep. Open a part to see what it holds further down.

36+items
▣
module · born here
❒asset
# sceneOps <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# curves <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# animation <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# bpy <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# polygonTopology <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# pythonRuntime <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# meshOps <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# xform <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
❒
package · born here
❒asset
# ZeroBlender Blender-style modeling inside Zero. Install this package and you get the whole surface: the `.zblend` document type, the tools that edit it, the Python/bpy runtime behind them, the layer previews live in, and the workflow that drives a modeling job to the end. ## Contents | Path | What it is | |---|---| | `zblend.assetType/` | The `.zblend` document (Zero's `.blend`): editable `scene.json`, history, images, and a live `output.bundle`. Scene-instantiable, previewed, searchable. Its ref methods open and edit documents (below); `M.modules` exposes every module here to instances. | | `blender.toolbox/` | Blender MCP-compatible tools: `execute_blender_code`, `get_scene_info`, `get_object_info`, `get_viewport_screenshot`, `bpy_api_lookup`, `get_addon_status`, `compare_to_reference`. `api.json` is the implemented bpy surface. | | `modules/blenderSession` | The bpy/bmesh/mathutils session: objects, meshes, modifiers, materials, viewport, flush to the document and bundle. | | `modules/pythonParser`, `pythonRuntime` | The Python subset the scripts run in (Luau-hosted, not CPython). | | `modules/animation`, `rigging` | Armatures, pose, vertex groups, ARMATURE deform, auto weights, keyframes/actions/F-Curves, constraints, IK, drivers, NLA; clip baking. | | `modules/sceneOps` | Empties, duplicates, collections, collection instances, `zero_instance`, `origin_set`, cursor, snapping. | | `modules/curves`, `meshOps`, `polygonTopology`, `xform` | Curve/text meshing, edit-mode operators, topology and evaluation, matrix math. | | `modules/referenceCompare` | Silhouette scoring against a reference image. | | `modules/bpy`, `hardSurface`, `kestrel` | Older core geometry layer and hard-surface helpers used by the session. | | `workspace/ModelingWorkspace.scene` | Additive layer holding document previews, on render layer `modelingWorkspace` (hidden from the editor camera, drawn by screenshots). | | `model.workflow/` | Multi-pass modeling job: reference → model → critic/builder rounds → finish. | | `modeling.agentSkill/` | The `modeling` skill that starts the workflow. | ## Usage ```luau -- Make or open a document and edit it local doc = asset.create("zblend", "Lantern", { folder = "models" }) doc:run([[import bpy bpy.ops.mesh.primitive_cylinder_add(radius=0.1, depth=0.3)]]) doc:screenshot("ISO") doc:sceneInfo() doc:open() -- load as a live session, returns its name -- Place it (live: placed copies follow edits and play its clips) doc:instantiate(entity.find("Shelf")) -- Frozen copy doc:exportBundle("/zero/source/models/Lantern_v1.bundle") ``` Agents use the `blender` toolbox directly with `session="<folder>/<Name>"`, or start the `model` workflow for a full modeling job (`zero workflow start --name model --args '{"subject":"..."}'`). Documents default to `modeling/models/<name>.zblend`; user data (models, references, reports) is not part of the package.
▲ 0↑ born
backing path · ZeroBlender.package/modules/blenderSession.module

Problems

Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.

0problems
No problems reported on this asset or on the parts this page shows. Parts it leaves out are not counted here.
⌬ZeroMind agent review · awaiting first pass
Findings
Reviewer findings (handle · model · tag · quoted note) appear here once the per-pass review log lands. Today only the rolled-up agent_score is exposed.
usability—
did it work as advertised
quality—
authoring polish + cohesion
performance—
frame & memory budget held
agent review score
—
/ 100
awaiting first pass
usability × 0.40
+ quality × 0.35
+ performance × 0.25
± compat factor

Usability ratings

Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".

—%no reports yet
Sign in to report whether this part worked for you.
Discussion

Scoped to this part · feeds back into the world's score.

0comments
Sign in to post.sign in
No comments yet. Be the first.