Research notes
Findings of investigations behind design decisions: how other systems solve a problem, what is possible for an open-source project (licences, documented formats), the decision and the sources. Every investigation gets its own page here, written and pushed as soon as the findings are in – before the implementation starts.
| Topic | Decision | Date |
|---|---|---|
| One download to try TeamCraft on a laptop | bundle PostgreSQL’s programs (theseus-rs builds, PostgreSQL Licence, newest 18.x, checksum-checked) with the desktop app and the server as teamcraft-server; teamcraft local runs a private cluster (scram, random password, 127.0.0.1 only, free port, no socket) and the server, and stops both when the app’s stdin pipe closes; separate with local server installers for Windows x64, macOS Apple silicon and Linux x86_64; no new crate, no SQLite, no postgresql_embedded | 2026-11-14 |
| Deprovisioning through the identity provider (SCIM 2.0) | not now: the target audience’s IdPs (university SAML/OIDC proxies, Keycloak) send no SCIM; the idle-SSO report, idle token lifetimes and OIDC back-channel logout cover what they can signal (#173 step 9). Later: active: false (boolean or string, PATCH or PUT) → Offboard and deactivate with a configured default, soft delete only | 2026-11-12 |
| 3D preview of CATIA V5 products | put together from the parts like NX, SOLIDWORKS and Inventor assemblies: instances, part numbers and placements (X, Y, Z axes and origin in mm) read from the product’s CATProdCont object stream; no file names are stored, so components are found by the UUID of their CATProdCont (CATIA files of the own revision and name matches) or by <part number>.CATPart/.CATProduct; hidden components later | 2026-11-12 |
| 3D preview of Creo assemblies | put together from the parts like NX, SOLIDWORKS, Inventor and CATIA: section NeuAsmSld lists the direct components (part or sub-assembly, model name, axes e1–e3 and origin in the parent’s frame); files found as <name>.prt / <name>.asm; lengths converted to mm from UnitSystemDef (parts too); decoded on unlicensed samples, tested with synthetic assemblies around NIST ctc-01 | 2026-11-12 |
| 3D preview of Creo parts | Creo stores no display tessellation: the exact B-rep (VisibGeom, a self-describing tagged format with compressed numbers) is read instead – analytic faces with contours, every edge sampled in both faces’ parameter spaces; faces are ear-clipped in the parameter plane, welded and refined with PN triangles; spline, fillet and ruled faces included; assemblies in their own page | 2026-11-08 |
| 3D preview of CATIA V5 parts | read the visualisation (CGR) mesh CATIA stores in every part (nested V5_CFV2 document CATCGRCont, stream SceneGraph/MainDataStream, uncompressed; decoded from sample files, verified against the NIST STEP export) and refine it along its exact normals like NX parts; thumbnails rendered from it; products from their parts (CATIA V5 products), the exact B-rep never | 2026-11-08 |
| 3D preview of Inventor files | read the display tessellation Inventor stores in every part (PmGraphicsSegment: one indexed triangle list per face with exact per-vertex normals, cm), weld it on its exact coordinates and refine it with PN triangles like NX and SOLIDWORKS; assemblies from UFRxDoc (files, visibility) and AmRxSegment (placements, checked against the stored bounding boxes of 243 sample assemblies), re-posed flexible sub-assemblies and suppressed components (addendum 2026-11-11), thumbnails rendered from the 3D preview; design views, weld beads and the ShapeManager geometry later | 2026-11-08 |
| Instance counts of Inventor assemblies | read the occurrence count of each referenced file from the first file descriptor table in UFRxDoc (checked against Inventor’s API: 190 of 190 files); suppressed occurrences left out via the occurrence records in the same stream (flag 07, linked by name), not guessed when they do not add up | 2026-11-11 |
| Crash reports from the desktop app | panic hook, session marker and uncaught UI errors written locally (redacted); at the next start the user sees the report and can open a prefilled GitHub issue, copy or discard it – no telemetry service, nothing sent unseen | 2026-11-10 |
| Mass properties from exported meshes | Eberly’s divergence-theorem integrals per triangle, computed in the isolated preview process and cached per content hash; edge check (open, non-manifold, misoriented) and fix of fully inverted meshes; admin material library plus density override per revision; per-file length unit and instance count; measured mass/CG/inertia wins and covers the sub-tree; parts exported in the common vehicle frame (placements on BOM lines later); roll-up by parallel axis under the read rights | 2026-11-09 |
| 3D preview of Fusion designs | read the display scene Fusion stores in every .f3d (OGS world + stream_mesh_*, ZIP entries in Zstandard, inflated with ruzstd): the triangle meshes of the body faces, welded and refined along their exact normals like NX parts, centimetres to millimetres; thumbnails rendered from it, the stored PNG as fallback; the ShapeManager B-rep stays unread; instance transforms and hidden bodies wait for a sample assembly | 2026-11-08 |
| 3D preview of SketchUp models | SketchUp 2021+ (ZIP + tag–length–value model.dat) with an own reader: faces triangulated with earcut, nested components placed (p' = s·(R p + t)), hidden faces, instances and layers left out, thumbnails rendered from the mesh; the 40 OpenSKP test files (MIT) as fixtures; classic files (SketchUp 3–2020, MFC object stream) through the unchanged Rust port of OpenSKP (MIT) in vendor/openskp; no colours or textures yet | 2026-11-08 |
| 3D preview of Rhino models | read the meshes a .3dm stores (mesh objects, B-rep render meshes, extrusion mesh caches), subdivide SubD control nets (Catmull-Clark with creases), place block instances; openNURBS sources read only; B-reps without stored meshes (truck) later | 2026-11-08 |
| 3D preview of SOLIDWORKS files | read the display tessellation SOLIDWORKS stores in every part (Contents/DisplayLists: triangle strips with exact per-vertex normals), weld it and refine it with PN triangles like NX; assemblies from the placements in COMPINSTANCETREE (checked against the NIST assembly’s NX placements), thumbnails rendered from the 3D preview; the Parasolid geometry (readable) and pre-2015 OLE files later | 2026-11-07 |
| Mutation testing with cargo-mutants | cargo-mutants (MIT, a CI tool, no new crate): --lib tests over the pure, unit-tested modules (.cargo/mutants.toml), --in-diff on pull requests report-only at first, weekly sharded full run; exclusions in the config with a reason, not #[mutants::skip]; missed mutants in touched code get a test that checks behaviour | 2026-11-07 |
| 3D preview of NX parts | read the JT 9 tessellation NX stores in every part (/Root/FastLoad/JT, topologically compressed) and refine it along its exact normals (PN triangles, creases from both normals); assemblies from their structure stream (placements verified against a JT export), thumbnails rendered from the 3D preview; stand-alone JT 10 and the Parasolid block later or never | 2026-11-07 |
| 3D preview of stand-alone JT files | read JT 10 files (format id jt) with the JT 9 topology coder plus the new Int32 codec, LZMA (lzma-rs, MIT) and the scene graph (instances, row-vector transforms, units, hidden nodes); hashes checked; verified on the NIST box assembly (36 placements equal to NX, sizes equal to NIST STEP); JT 9 stays with the NX reader; shattered files, PMI and B-rep segments not now | 2026-11-08 |
| Text from HTML reports | own bounded tokenizer (no new crate, encoding_rs for charsets) in the same isolated text-extract child as PDF; table rows as lines with | separators, scripts, styles, comments, embedded images and hidden elements skipped, nothing fetched; templates on HTML run on the extracted text; plain text keeps its decimals | 2026-11-07 |
| Text from PDF reports | pdf_oxide (MIT/Apache-2.0) in an isolated teamcraft text-extract child process with size, page, time and memory limits; the only candidate that survived truncated and damaged files without panics; no OCR | 2026-11-05 |
| One provider interface for the assistant | one provider-neutral API layer (src/llm/): Anthropic Messages and OpenAI-compatible Chat Completions now, stateless Responses later; the key stays on the server (desktop Ask… and ACP unchanged); base URL set by the operator, internal hosts allowed, no redirects; next: budgets, progress streaming, threads, context quick actions | 2026-11-05 |
| Sharing UI code between web and desktop | top-level shared/ with tokens, one component CSS, plain ES modules (formatters, states, markdown-lite, widgets, 3D viewer), fonts and icons; web keeps server templates, desktop keeps rendering from JSON; one markup contract, Rust and JS rules pinned to shared test vectors | 2026-11-05 |
| Supersede, replace and alternate parts | global two-way alternates per item, supersession with one successor, replace in assemblies from the where-used page (in-work parents only, released ones listed for a new revision); local substitutes per BOM line later | 2026-11-05 |
| Jira connector for change requests and change orders | one-way TeamCraft → Jira first (ECR/ECO as issues, status mapping, remote link back, outbox like webhooks, explicit project-group scope per connection); Jira webhooks later, never approvals | 2026-11-05 |
| Previews of native CAD files (Inventor, Solid Edge) | embedded preview image: implement · 3D from the native file on the server: skip (licensing) · 3D through the user’s own CAD installation in the desktop app: implement | 2026-11-04 |
| Importing existing CAD folder trees | scan with a duplicate report first, one item per model with its drawings and exports, check-in at the end, BOM from references optional, tutorial in the desktop app | 2026-11-04 |
| Popular features of Teamcenter | implement favorites, saved searches, Save As and BOM comparison; numbering schemes, custom attributes, transmittals and redlining stay planned | 2026-11-04 |
| Openly licensed CAD files for end-to-end tests | NIST test models (no restrictions): parts in Inventor, NX, SolidWorks, Creo, CATIA V5, STEP, NX and SolidWorks assemblies; Solid Edge: none found | 2026-11-04 |
| Read permissions for project groups | restricted project groups: members and admins read, everybody else gets 404; placeholders for links across the boundary; enforcement in the services, no row-level security | 2026-11-05 |
| As-built records | item type as_built = one physical unit: build record (design revision built to, serial, date), as-built BOM copied from the design and compared with it, deviations with disposition (open / use as is / rework / repair / scrap); no submit with an open deviation | 2026-11-06 |
| Fluent, STAR-CCM+ and Simcenter 3D files | recognise by extension plus bounded head checks (NX SPLMSSTR for .sim/.fem/.afm, HDF5/gzip signatures, Nastran markers in .dat); small text summaries from head and tail only (.trn, .out, .f06, journals, macros); never parse .op2, .h5, .dat.h5, .sim, .simh; one simulation item per analysis with the master part as pinned basis; values from run-written exchange files, tail-reading templates and reports (#141) | 2026-11-07 |