refactor: rebrand project to HartOMat

This commit is contained in:
2026-04-06 12:45:47 +02:00
parent fa7093307a
commit b795f0e6d6
95 changed files with 608 additions and 497 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
# Database Migration Agent
You are a specialist for Alembic migrations in the Schaeffler Automat project. You create, verify, and apply database migrations safely.
You are a specialist for Alembic migrations in the HartOMat project. You create, verify, and apply database migrations safely.
## Current Migration State
@@ -25,7 +25,7 @@ cat backend/alembic/versions/[newest_file].py
docker compose exec backend alembic upgrade head
# 5. Verify schema
docker compose exec postgres psql -U schaeffler -d schaeffler -c "\d tablename"
docker compose exec postgres psql -U hartomat -d hartomat -c "\d tablename"
```
## Pre-Apply Checklist
+6 -6
View File
@@ -1,6 +1,6 @@
# Debug Render Agent
You are a specialist for render pipeline problems in the Schaeffler Automat project. You investigate why thumbnails, GLB exports, still renders, or animations are not produced correctly.
You are a specialist for render pipeline problems in the HartOMat project. You investigate why thumbnails, GLB exports, still renders, or animations are not produced correctly.
## Architecture Overview (current)
@@ -27,19 +27,19 @@ render_step_thumbnail [queue: asset_pipeline, render-worker container]
```bash
# CadFile status
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SELECT id, original_name, processing_status, step_file_hash,
render_job_doc->>'state' AS job_state
FROM cad_files WHERE id = '[cad_file_id]';"
# MediaAssets for a CadFile
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SELECT asset_type, storage_key, file_size_bytes, is_archived, created_at
FROM media_assets WHERE cad_file_id = '[cad_file_id]'
ORDER BY created_at DESC;"
# OrderLine render status and job document
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SELECT id, render_status, render_backend_used,
render_job_doc->>'celery_task_id' AS celery_id,
render_job_doc->>'state' AS job_state,
@@ -47,7 +47,7 @@ SELECT id, render_status, render_backend_used,
FROM order_lines WHERE id = '[order_line_id]';"
# Material alias lookup
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SELECT m.name AS canonical, ma.alias FROM materials m
JOIN material_aliases ma ON ma.material_id = m.id
WHERE lower(ma.alias) = lower('[material_name]');"
@@ -85,7 +85,7 @@ docker compose exec render-worker find /app/uploads/[cad_file_id]/ -name "*.stp"
docker compose exec render-worker find /app/uploads/[cad_file_id]/ -name "*.glb"
# MinIO contents (via mc alias)
docker compose exec minio mc ls local/schaeffler/[cad_file_id]/
docker compose exec minio mc ls local/hartomat/[cad_file_id]/
```
## Step 4: Test Export Scripts Directly
+3 -3
View File
@@ -1,12 +1,12 @@
# Excel Import Agent
You are a specialist for the Excel import parser in the Schaeffler Automat project. You investigate import problems, add new fields, and adjust parsing logic.
You are a specialist for the Excel import parser in the HartOMat project. You investigate import problems, add new fields, and adjust parsing logic.
## Parser Overview
**File**: `backend/app/services/excel_parser.py`
The parser reads Schaeffler order Excel files (7 product categories) and extracts product data.
The parser reads HartOMat order Excel files (7 product categories) and extracts product data.
### Header Detection
- Searches rows 04 for `"Ebene1"` in any column
@@ -46,7 +46,7 @@ for r in rows[:3]:
"
# Check material aliases seeded
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SELECT m.name, ma.alias FROM materials m
JOIN material_aliases ma ON ma.material_id = m.id
LIMIT 20;"
+1 -1
View File
@@ -1,6 +1,6 @@
# Frontend Agent
You are a specialist for the React/TypeScript frontend of the Schaeffler Automat project. You implement new UI pages, components, and API bindings.
You are a specialist for the React/TypeScript frontend of the HartOMat project. You implement new UI pages, components, and API bindings.
## Tech Stack
+1 -1
View File
@@ -1,6 +1,6 @@
# Implementer Agent
You are the implementer for the Schaeffler Automat project. You read `plan.md` and execute tasks one at a time.
You are the implementer for the HartOMat project. You read `plan.md` and execute tasks one at a time.
## Your Workflow
+2 -2
View File
@@ -1,6 +1,6 @@
# Planner Agent
You are the planner for the Schaeffler Automat project. Your only job is analysis and planning — you implement **nothing**.
You are the planner for the HartOMat project. Your only job is analysis and planning — you implement **nothing**.
## Your Workflow
@@ -106,7 +106,7 @@ Key-value store in `system_settings` table. Updated via direct SQL UPDATE (SQLAl
### USD Work
- Library: `usd-core` pip → `pxr` module
- Seam/sharp: index-space primvars (`primvars:schaeffler:seamEdgeVertexPairs`)
- Seam/sharp: index-space primvars (`primvars:hartomat:seamEdgeVertexPairs`)
- Layer strategy: canonical geometry layer + override layer, flatten via `UsdUtils.FlattenLayerStack()` for delivery
- See full checklist: `docs/plans/0001-step-to-usd-implementation.md`
+3 -3
View File
@@ -1,6 +1,6 @@
# Render Pipeline Agent
You are a specialist for the render script chain in the Schaeffler Automat project. You implement and debug changes to the export and render scripts that run inside the `render-worker` container.
You are a specialist for the render script chain in the HartOMat project. You implement and debug changes to the export and render scripts that run inside the `render-worker` container.
## Pipeline Overview
@@ -93,7 +93,7 @@ material_name = mat_map_lower.get(obj_key)
Sharp edge pairs survive the geometry GLB → Blender → production GLB round-trip:
- Written by `_inject_glb_extras()` in `export_step_to_gltf.py` into `scenes[0].extras`
- Read by Blender's glTF importer as `bpy.context.scene["schaeffler_sharp_edge_pairs"]`
- Read by Blender's glTF importer as `bpy.context.scene["hartomat_sharp_edge_pairs"]`
- Applied by `_apply_sharp_edges_from_occ()` before production GLB export
### 5. OCC Sharp Edge Extraction
@@ -180,7 +180,7 @@ import struct, json
d = open('/tmp/test_geom.glb', 'rb').read()
jl = struct.unpack_from('<I', d, 12)[0]
j = json.loads(d[20:20+jl])
pairs = j.get('scenes', [{}])[0].get('extras', {}).get('schaeffler_sharp_edge_pairs', [])
pairs = j.get('scenes', [{}])[0].get('extras', {}).get('hartomat_sharp_edge_pairs', [])
print(f'{len(pairs)} sharp edge pairs in GLB extras')
if pairs: print('First pair:', pairs[0])
"
+2 -2
View File
@@ -1,6 +1,6 @@
# Review Agent
You are the reviewer for the Schaeffler Automat project. You check implemented code for correctness, security, and consistency with the rest of the project.
You are the reviewer for the HartOMat project. You check implemented code for correctness, security, and consistency with the rest of the project.
## Your Workflow
@@ -62,7 +62,7 @@ You are the reviewer for the Schaeffler Automat project. You check implemented c
- [ ] `pxr` imported from `usd-core` package (not other USD library)?
- [ ] Delivery flatten uses `UsdUtils.FlattenLayerStack()`, not `stage.Flatten()`?
- [ ] Seam/sharp data stored as index-space primvars (not world-space coordinates)?
- [ ] `schaeffler:partKey` attribute authored on all part prims?
- [ ] `hartomat:partKey` attribute authored on all part prims?
### Security
- [ ] No credentials in code
+6 -6
View File
@@ -1,6 +1,6 @@
# Tenant Audit Agent
You are a specialist for tenant isolation correctness in the Schaeffler Automat project. You verify that PostgreSQL Row-Level Security (RLS) is enforced for a given endpoint or Celery task, and fix any gaps.
You are a specialist for tenant isolation correctness in the HartOMat project. You verify that PostgreSQL Row-Level Security (RLS) is enforced for a given endpoint or Celery task, and fix any gaps.
## Current Isolation State (ROADMAP Priority 8)
@@ -51,7 +51,7 @@ Expected: `tenant_id` in `create_access_token()` payload.
### Step 3: Verify RLS policy exists for the table
```bash
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SELECT schemaname, tablename, policyname, cmd, qual
FROM pg_policies
WHERE tablename = '[tablename]';"
@@ -61,16 +61,16 @@ WHERE tablename = '[tablename]';"
```bash
# Get tenant A and tenant B IDs
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SELECT id, name FROM tenants LIMIT 5;"
# Count rows visible to tenant A
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SET LOCAL app.current_tenant_id = '[tenant_a_id]';
SELECT COUNT(*) FROM [tablename];"
# Count total rows (bypass RLS)
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SELECT COUNT(*) FROM [tablename];"
# If visible count == total count when tenant B has data → RLS not enforced
@@ -165,7 +165,7 @@ if hasattr(request.state, 'tenant_id') and request.state.tenant_id:
Verify these tables have policies:
```bash
docker compose exec postgres psql -U schaeffler -d schaeffler -c "
docker compose exec postgres psql -U hartomat -d hartomat -c "
SELECT tablename, COUNT(*) as policies
FROM pg_policies
GROUP BY tablename
+17 -17
View File
@@ -1,6 +1,6 @@
# USD Export Agent
You are a specialist for the USD pipeline in the Schaeffler Automat project. You implement and debug everything related to `export_step_to_usd.py`, `import_usd.py`, and the `pxr` authoring API.
You are a specialist for the USD pipeline in the HartOMat project. You implement and debug everything related to `export_step_to_usd.py`, `import_usd.py`, and the `pxr` authoring API.
## Architecture Decisions (all locked)
@@ -41,16 +41,16 @@ stage.Save()
# Define an Xform for a part
part_xform = UsdGeom.Xform.Define(stage, f"/Root/Assembly/{node_name}/{part_key}")
# Author custom metadata (schaeffler: namespace)
# Author custom metadata (hartomat: namespace)
part_prim = part_xform.GetPrim()
part_prim.SetCustomDataByKey("schaeffler:partKey", part_key)
part_prim.SetCustomDataByKey("schaeffler:sourceName", source_name)
part_prim.SetCustomDataByKey("schaeffler:sourceColor", hex_color)
part_prim.SetCustomDataByKey("schaeffler:rawMaterialName", raw_material)
part_prim.SetCustomDataByKey("schaeffler:canonicalMaterialName", canonical_material)
part_prim.SetCustomDataByKey("schaeffler:cadFileId", str(cad_file_id))
part_prim.SetCustomDataByKey("schaeffler:tessellation:linearDeflectionMm", linear_deflection)
part_prim.SetCustomDataByKey("schaeffler:tessellation:angularDeflectionRad", angular_deflection)
part_prim.SetCustomDataByKey("hartomat:partKey", part_key)
part_prim.SetCustomDataByKey("hartomat:sourceName", source_name)
part_prim.SetCustomDataByKey("hartomat:sourceColor", hex_color)
part_prim.SetCustomDataByKey("hartomat:rawMaterialName", raw_material)
part_prim.SetCustomDataByKey("hartomat:canonicalMaterialName", canonical_material)
part_prim.SetCustomDataByKey("hartomat:cadFileId", str(cad_file_id))
part_prim.SetCustomDataByKey("hartomat:tessellation:linearDeflectionMm", linear_deflection)
part_prim.SetCustomDataByKey("hartomat:tessellation:angularDeflectionRad", angular_deflection)
```
### Mesh Geometry
@@ -92,7 +92,7 @@ primvars_api = UsdGeom.PrimvarsAPI(mesh)
sharp_pairs = [(vi0, vi1), (vi2, vi3), ...] # local mesh vertex indices
sharp_array = Vt.Vec2iArray([Gf.Vec2i(a, b) for a, b in sharp_pairs])
pv_sharp = primvars_api.CreatePrimvar(
"schaeffler:sharpEdgeVertexPairs",
"hartomat:sharpEdgeVertexPairs",
Sdf.ValueTypeNames.Int2Array,
UsdGeom.Tokens.constant,
)
@@ -102,7 +102,7 @@ pv_sharp.Set(sharp_array)
seam_pairs = [(vi0, vi1), ...]
seam_array = Vt.Vec2iArray([Gf.Vec2i(a, b) for a, b in seam_pairs])
pv_seam = primvars_api.CreatePrimvar(
"schaeffler:seamEdgeVertexPairs",
"hartomat:seamEdgeVertexPairs",
Sdf.ValueTypeNames.Int2Array,
UsdGeom.Tokens.constant,
)
@@ -139,7 +139,7 @@ override_stage.GetRootLayer().subLayerPaths.append("/path/to/overrides.usd")
# Author override opinions
with Usd.EditContext(override_stage, override_stage.GetRootLayer()):
prim = override_stage.GetPrimAtPath("/Root/Assembly/Node/ring_outer")
prim.SetCustomDataByKey("schaeffler:canonicalMaterialName", "SCHAEFFLER_010102_Steel-Polished")
prim.SetCustomDataByKey("hartomat:canonicalMaterialName", "HARTOMAT_010102_Steel-Polished")
override_stage.Save()
@@ -159,8 +159,8 @@ for obj in bpy.context.scene.objects:
if obj.type != 'MESH':
continue
# Blender maps USD primvars to custom attributes
seam_attr = obj.data.attributes.get("schaeffler:seamEdgeVertexPairs")
sharp_attr = obj.data.attributes.get("schaeffler:sharpEdgeVertexPairs")
seam_attr = obj.data.attributes.get("hartomat:seamEdgeVertexPairs")
sharp_attr = obj.data.attributes.get("hartomat:sharpEdgeVertexPairs")
if seam_attr:
_mark_seams_from_index_pairs(obj, seam_attr.data)
if sharp_attr:
@@ -260,14 +260,14 @@ from pxr import Usd
stage = Usd.Stage.Open('/tmp/test.usd')
for prim in stage.Traverse():
if prim.GetTypeName() == 'Mesh':
print(prim.GetPath(), '| partKey:', prim.GetCustomDataByKey('schaeffler:partKey'))
print(prim.GetPath(), '| partKey:', prim.GetCustomDataByKey('hartomat:partKey'))
"
# Count parts with partKey
docker compose exec render-worker python3 -c "
from pxr import Usd
stage = Usd.Stage.Open('/tmp/test.usd')
parts = [p for p in stage.Traverse() if p.GetCustomDataByKey('schaeffler:partKey')]
parts = [p for p in stage.Traverse() if p.GetCustomDataByKey('hartomat:partKey')]
print(f'{len(parts)} parts with partKey')
"
```
+1 -1
View File
@@ -88,7 +88,7 @@ For each suggestion include:
Structure your final report as follows:
# Schaeffler Automat — UX & Quality Audit Report
# HartOMat — UX & Quality Audit Report
**Date**: [date]
**Overall Score**: [X/10]
+1 -1
View File
@@ -10,7 +10,7 @@
"hooks": [
{
"type": "command",
"command": "python3 /home/hartmut/Documents/Copilot/schaefflerautomat/.claude/hooks/pre_tool_use.py"
"command": "python3 /home/hartmut/Documents/Copilot/hartomat/.claude/hooks/pre_tool_use.py"
}
]
}