m3/org/openalice-spatialci ok

openalice-spatial

[Atlas card](https://atlas.blal.pro/repos/openalice-spatial)

Features
19
Status
·unknown
Last activity
1mo ago
Branch
mvp

Architecture rating

F1mo ago
docsD

Strong doc scaffolding: valid manifest with NANO-PATH summary, AGENTS.md, ROADMAP.md, docs/ dir, 19 declared features; dragged down by 111 missing docstrings across codebase and README that merely links to Atlas card with no local onboarding content.

consistencyD

Zero circular deps and dead imports, valid manifest, AGENTS.md, conventional docker-compose layout; undermined by 9 god modules, 3 duplicate signatures, max cyclomatic complexity 36, and env-drift (2 undeclared vars in use).

reliabilityD

Health probe live at /health (200, 100% 24h uptime) and job-queue pull/push pattern shows some design intent, but 8 broad excepts swallow failures; no evidence of graceful SIGTERM shutdown, timeouts, retries, or idempotency keys on job submission.

observabilityF

Health endpoint is the sole positive signal; 35 console statements indicate printf-debugging over structured logging; RUST_LOG declared but unused (env drift) means Rust tracing not wired; no metrics, spans, or alerting evidence.

securityF

No evidence of authn/authz on any endpoint; worker pull/push routes appear unauthenticated; 8 bare/broad excepts can swallow security-relevant errors; env drift (DOMAIN, MODEL_PATH undeclared) suggests ad-hoc secret handling; no rate-limit or security-header signals found.

data layerF

Owns 3 tables (jobs, worlds, images) per manifest but no migrations directory visible in repo structure; no evidence of FK constraints, RLS, tenant isolation, or GDPR tooling; schema governance entirely unknown.

testingF

No test directory visible in repo tree; inspector reports no test count; CI workflow passes but likely build-only — zero evidence of unit, integration, or regression tests for a pipeline with image ingestion + GPU worker coordination.

source · auto-grader-2026-06-18

Ecosystem manifest

.atlas-deps.yml

3D world generation service — NANO-PATH architecture: Gemini multi-view images → AnySplat Gaussian Splatting → PLY/GLTF for WebGPU rendering.

Consumed env
  • PORT
  • SPATIAL_WORK_DIR
  • RUST_LOG
  • VIEW_API_URL
  • VIEW_API_KEY
  • GPU_WORKER_PULL
  • GPU_WORKER_URL
  • RUNPOD_ENDPOINT_URL
  • RUNPOD_ENDPOINT_ID
  • RUNPOD_API_KEY
  • RUNPOD_BASE_URL
  • ANYSPLAT_DOCKER_IMAGE
  • GEMINI_API_KEY
  • GEMINI_API_URL
  • GEMINI_MODEL
  • DIFFSPLAT_MODEL
  • DIFFSPLAT_MODE
  • DIFFSPLAT_RUNPOD_ENDPOINT
  • DIFFSPLAT_RUNPOD_KEY
Exposes
  • docker_image: openalice-spatial
  • http_endpoint: POST /v1/generate — submit text/image → 3D world job
  • http_endpoint: GET /v1/jobs/:id — poll job status
  • http_endpoint: GET /v1/worlds/:id — download PLY/GLTF
  • http_endpoint: GET /v1/worker/pull — GPU worker long-poll queue
  • http_endpoint: POST /v1/worker/push — GPU worker result delivery
  • npm_package: @openalice/spatial-viewer — React 19 + Three.js + SparkJS Gaussian-splat .ply viewer (orbit/walk/fly camera)
  • npm_package: @openalice/spatial-editor — React 19 3D world editor built on @openalice/spatial-viewer (zustand+immer state, object list, property panels, AI generate panel)
Owns tables
  • jobs
  • worlds
  • images
Env drift · manifest ⇄ code

Atlas grepped the repo's source for env reads (rust env::var · ts process.env · py os.environ · shell $VAR) and diffed against the manifest's consumes_env. Two lists below: stale declarations and undeclared reads.

Code reads, manifest omits
  • DOMAIN
  • MODEL_PATH
Manifest declares, code unused
  • PORT
  • RUST_LOG
Observed reads: 19 · declared: 19

Roadmap · what's planned next

52% avg4 goals

Code composition

tokei · loc
4.3kloc
  • Rust50.0%
  • TSX18.6%
  • TypeScript12.5%
  • Python11.3%
  • Batch2.7%
  • Other5.0%
  • Rust50.0%· 2,168
  • TSX18.6%· 805
  • TypeScript12.5%· 541
  • Python11.3%· 490
  • Batch2.7%· 116
  • JSON2.0%· 87
  • YAML1.5%· 65
  • Shell0.7%· 31
  • +2 more0.7%· 32 · 2 files
Language% codecodecommentsblanksfiles
Rust50.0%2,168872849
TSX18.6%805107888
TypeScript12.5%541121819
Python11.3%490261295
Batch2.7%1167233
JSON2.0%87005
YAML1.5%651343
Shell0.7%31271
TOML0.4%18441
Dockerfile0.3%14221
Markdown0.0%06191477
Plain Text0.0%02101

Telemetry ribbon · last 90 days

5 events
MAYJUNJUL2026-05-21 · commit · new commit cbfea53 → b5592412026-05-21 · manifest · manifest updated · +2 exposes2026-05-22 · commit · new commit b559241 → 1b346da2026-06-17 · commit · new commit 1b346da → 6b3dc3f2026-06-17 · commit · new commit 6b3dc3f → 67614ddNOW
commitmanifestlifecyclekind

platform/spatial

13 features
  • platform.spatial.editor
    packages/spatial-editor/src/SpatialEditor.tsx:1
    Three-panel layout: object list/library (left), 3D viewer with toolbar (center), properties inspector (right), AI generate panel (bottom). Auto-saves every 30 s by default. Undo/redo history stack managed by useEditorStore. Loads/saves world state via spatial API.
  • platform.spatial.editor.generated-object
    packages/spatial-editor/src/hooks/useGeneratedObject.ts:2
    (GET /v1/jobs/:id) after GeneratePanel submits, surfaces live progress/status, and on `completed` loads the resulting GLTF/PLY into the scene by adding a PlacedObject whose sourceId is the job's result_url. Mirrors the spatial-viewer useSplatLoader poll cadence. Polling logic is split into a pure `pollGeneratedObject` so it is testable without a DOM.
  • platform.spatial.editor.generated-object.test
    packages/spatial-editor/src/hooks/useGeneratedObject.test.ts:2
    loads the GLTF/PLY result into the scene (PlacedObject from result_url) on completion, handles failure / completed-without-url / transient errors, respects the poll budget, and aborts cleanly. Runs under `node --test` (Node 22 strips types) — no DOM/vitest needed.
  • platform.spatial.editor.generate-panel
    packages/spatial-editor/src/components/GeneratePanel.tsx:2
    accepts a text prompt, quality preset (1k/2k/4k), and object vs world mode; calls Spatial API to submit a generation job and returns the job ID for polling progress.
  • platform.spatial.editor.object-panel
    packages/spatial-editor/src/components/ObjectPanel.tsx:2
    the Spatial API library and placed objects in the current scene; supports add, duplicate, and remove operations through the editor store.
  • platform.spatial.editor.properties-panel
    packages/spatial-editor/src/components/PropertiesPanel.tsx:2
    (position/rotation/scale), material, and metadata of the currently selected 3D object; writes updates through editor store with undo/redo support.
  • platform.spatial.editor.store
    packages/spatial-editor/src/hooks/useEditorStore.ts:2
    placed objects, camera presets, lighting config, dirty flag, and undo/redo history stack; single source of truth for all SpatialEditor panel components.
  • platform.spatial.editor.toolbar
    packages/spatial-editor/src/components/EditorToolbar.tsx:2
    /delete/camera); highlights active tool from editor store; keyboard shortcut labels (V/G/R/S).
  • platform.spatial.hooks.navigation
    packages/spatial-viewer/src/hooks/useNavigation.ts:2
    supports 'orbit', 'fly', and 'walk' modes; dispatches custom DOM events consumed by the Three.js render loop so React state never bottlenecks 60 fps.
  • platform.spatial.hooks.splat-loader
    packages/spatial-viewer/src/hooks/useSplatLoader.ts:2
    .splat) file from a world ID via the Spatial API or direct URL; tracks loading progress (0-100%) and exposes error state; cancels in-flight fetch on unmount.
  • platform.spatial.viewer
    packages/spatial-viewer/src/SpatialViewer.tsx:1
    Renders .ply splat files loaded from a worldId API URL or a direct splatUrl prop. Camera modes: orbit (default), walk, fly. Quality: auto/low/medium/high. Whitelabel-ready via `branding` prop (custom logo, hideWatermark). FPS counter optional. Used in the platform dashboard and exportable for licensees (e.g. ImmoClip virtual tours).
  • platform.spatial.viewer.controls
    packages/spatial-viewer/src/SpatialControls.tsx:2
    walk) with reset-camera and screenshot buttons; designed to sit in the corner of the canvas without blocking the splat view.
  • platform.spatial.viewer.toolbar
    packages/spatial-viewer/src/SpatialToolbar.tsx:2
    screenshot, and stats-overlay toggle buttons; composable into any SpatialViewer instance; color-customizable for theme matching.

spatial/generate

2 features
  • spatial.generate.object
    src/main.rs:659
    Shortcut endpoint to generate a single 3D object (mode=object) with prompt or image.
    api:POST /v1/objects
    since 0.1.0
  • spatial.generate.world
    src/main.rs:257
    Submit text or image prompt to generate a 3D world via NANO-PATH (multi-view → Gaussian Splat).
    api:POST /v1/generate
    since 0.1.0

spatial/jobs

1 feature
  • spatial.jobs.status
    src/main.rs:457
    Poll a generation job's status (Queued/Generating/Fitting/Completed/Failed) with progress.
    api:GET /v1/jobs/:id
    since 0.1.0

spatial/worker

1 feature
  • spatial.worker.pull
    src/main.rs:739
    GPU worker long-polls the queue (≤30s) for a pending DiffSplat/MV3D task.
    api:GET /v1/worker/pull
    since 0.1.0

spatial/world

2 features
  • spatial.world.download
    src/main.rs:484
    Download a generated 3D world (PLY/GLTF) for client-side WebGPU rendering.
    api:GET /v1/worlds/:id
    since 0.1.0
  • spatial.world.save-state
    src/main.rs:576
    Persist a composed world state (objects, camera presets, lighting) to disk by world_id.
    api:POST /v1/worlds/:id/state
    since 0.1.0