atproto Thingiverse but good

PM-83: add STL/OBJ evidence recognizers and LDraw official-library filesystem fallback master

Root cause 1: recognize_evidence had no STL or OBJ recognizers. Neutral/no-hint loads of STL/OBJ files fell through to Recognized::None, causing viewer MeshError. Add recognizes_stl (binary size check + ASCII facet normal evidence) and recognizes_obj (UTF-8 with parseable geometric v/vn/vt/f lines), wired into recognize_evidence with the same ordering as existing recognizers. Root cause 2: build_model_load_bundle resolved all references via SqliteResolver (project-scoped DB memberships). User MPDs reference official library parts (parts/3001.dat, p/4-4cyli.dat, s/ subfiles, etc.) that have no DB rows, so the bundle build 404'd. State.ldraw_library_dir was dead code. Implement a filesystem fallback inside the BFS: when the DB resolver returns NotFound and the path root is parts/ or p/, read bytes from <libdir>/parts/<name> or <libdir>/p/<name> (with case-insensitive matching), compute sha256, and synthesize an inline ModelResource with root official-parts/official-p, empty target_cids, and mime_type application/x-ldraw. Skip binding_for and validate_manifest_child for official resources; keep bundle-level validation. Children of official parts also resolve through the same fallback so primitives referenced by parts (p/4-4con*.dat from parts/*.dat) resolve recursively. Tests: 6 new registry tests (STL binary, STL ASCII, STL near-misses, OBJ with geometric lines, OBJ comments-only, over-bound); 4 new ldraw bundle builder tests (official library resolves parts + primitives, missing part 404s, CanonicalPath traversal rejection, no library dir unchanged). Epic: PM-86 Task: PM-83


Author Orual Date Commit fb41b615 Parent c99759a5 Change ID wzlruxwz
+1648 -361
16 changed files