refactor: rebrand project to HartOMat
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 0–4 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,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,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
|
||||
|
||||
|
||||
@@ -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`
|
||||
|
||||
|
||||
@@ -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])
|
||||
"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
"
|
||||
```
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user