{"title":"올스틸 새 OS — 시스템 구조","generated_at":"2026-06-05 00:45 UTC","backend_store":"db","layers":[{"name":"api","desc":"HTTP 어댑터 (얇음, services 만 호출)","modules":"routes · schemas · structure"},{"name":"services","desc":"서비스-우선 — 비즈니스 로직 경계","modules":"spec · price · material · party · order · stores"},{"name":"core","desc":"철강 모르는 일반 앵커·파이프라인 (내구 자산)","modules":"spec · material · registry · pricing · party · order"},{"name":"domain/steel","desc":"철강 지식 도메인 팩 (코어 수정 없이 추가)","modules":"shapes · ops · standard_tables · config · materials"},{"name":"persistence","desc":"DB 저장소 — SQLAlchemy sync only","modules":"models · mappers · db_stores"}],"entities":[{"name":"Party","layer":"core","note":"고객·거래처 통합 앵커 (tail-8 매칭)","fields":[{"name":"id","type":"str"},{"name":"name","type":"str"},{"name":"kind","type":"str"},{"name":"phone","type":"Optional[str]"},{"name":"email","type":"Optional[str]"},{"name":"tier","type":"str"},{"name":"memo","type":"Optional[str]"},{"name":"created_at","type":"Optional[str]"},{"name":"updated_at","type":"Optional[str]"}]},{"name":"SpecObject","layer":"core","note":"4분야 통합 사양객체 앵커","fields":[{"name":"id","type":"str"},{"name":"category","type":"str"},{"name":"kind","type":"Optional[str]"},{"name":"name","type":"str"},{"name":"geometry","type":"Geometry"},{"name":"material_code","type":"str"},{"name":"process_chain","type":"list[ProcessStep]"},{"name":"attachments","type":"list[Component]"},{"name":"sku_code","type":"Optional[str]"},{"name":"lineage","type":"Lineage"},{"name":"status","type":"str"},{"name":"promoted","type":"bool"},{"name":"derived","type":"Optional[Derived]"}]},{"name":"Order","layer":"core","note":"견적=주문 한 엔티티 + 상태머신","fields":[{"name":"id","type":"str"},{"name":"party_id","type":"str"},{"name":"status","type":"str"},{"name":"channel","type":"str"},{"name":"lines","type":"list[OrderLine]"},{"name":"memo","type":"Optional[str]"},{"name":"created_at","type":"Optional[str]"},{"name":"updated_at","type":"Optional[str]"}]},{"name":"OrderLine","layer":"core","note":"주문 라인 — 척추 가격 스냅샷","fields":[{"name":"spec_id","type":"str"},{"name":"quantity","type":"int"},{"name":"channel","type":"str"},{"name":"breakdown","type":"Breakdown"}]},{"name":"Material","layer":"core","note":"재질 마스터 (비중·소재단가)","fields":[{"name":"code","type":"str"},{"name":"name","type":"str"},{"name":"category","type":"str"},{"name":"density","type":"float"},{"name":"base_cost","type":"float"},{"name":"props","type":"Optional[dict]"}]},{"name":"Breakdown","layer":"core","note":"가격 분해 — 단계별 감사 로그","fields":[{"name":"unit_weight","type":"float"},{"name":"total_weight","type":"float"},{"name":"material_cost","type":"float"},{"name":"process_cost","type":"float"},{"name":"cost","type":"float"},{"name":"price","type":"dict[str, float]"},{"name":"weight_source","type":"str"},{"name":"lines","type":"list[dict]"}]},{"name":"Project","layer":"core","note":"철골 공사 — 협의~시공 라이프사이클 추적","fields":[{"name":"id","type":"str"},{"name":"name","type":"str"},{"name":"party_id","type":"Optional[str]"},{"name":"client_name","type":"Optional[str]"},{"name":"location","type":"Optional[str]"},{"name":"tonnage","type":"Optional[float]"},{"name":"contract_amount","type":"Optional[float]"},{"name":"period_from","type":"Optional[str]"},{"name":"period_to","type":"Optional[str]"},{"name":"stage","type":"str"},{"name":"status","type":"str"},{"name":"summary","type":"Optional[str]"},{"name":"created_at","type":"Optional[str]"},{"name":"updated_at","type":"Optional[str]"}]},{"name":"ProjectNote","layer":"core","note":"공사 협의/요구사항/이슈 기록","fields":[{"name":"id","type":"str"},{"name":"project_id","type":"str"},{"name":"kind","type":"str"},{"name":"title","type":"str"},{"name":"body","type":"str"},{"name":"verdict","type":"str"},{"name":"status","type":"str"},{"name":"counterpart","type":"Optional[str]"},{"name":"occurred_at","type":"Optional[str]"},{"name":"created_at","type":"Optional[str]"}]}],"endpoints":[{"method":"GET","path":"/","tag":""},{"method":"GET","path":"/assets/ui.css","tag":""},{"method":"GET","path":"/assets/ui.js","tag":""},{"method":"GET","path":"/health","tag":""},{"method":"GET","path":"/material","tag":"material"},{"method":"GET","path":"/material/{code}","tag":"material"},{"method":"POST","path":"/order","tag":"order"},{"method":"GET","path":"/order","tag":"order"},{"method":"GET","path":"/order/{order_id}","tag":"order"},{"method":"POST","path":"/order/{order_id}/lines","tag":"order"},{"method":"POST","path":"/order/{order_id}/transition","tag":"order"},{"method":"GET","path":"/party","tag":"party"},{"method":"POST","path":"/party","tag":"party"},{"method":"POST","path":"/party/merge","tag":"party"},{"method":"POST","path":"/party/upsert","tag":"party"},{"method":"GET","path":"/party/{party_id}","tag":"party"},{"method":"POST","path":"/price/compute","tag":"price"},{"method":"GET","path":"/project","tag":"project"},{"method":"POST","path":"/project","tag":"project"},{"method":"PATCH","path":"/project/notes/{note_id}","tag":"project"},{"method":"GET","path":"/project/stages","tag":"project"},{"method":"GET","path":"/project/{project_id}","tag":"project"},{"method":"PATCH","path":"/project/{project_id}","tag":"project"},{"method":"POST","path":"/project/{project_id}/notes","tag":"project"},{"method":"GET","path":"/project/{project_id}/notes","tag":"project"},{"method":"POST","path":"/project/{project_id}/stage","tag":"project"},{"method":"GET","path":"/projects","tag":"web"},{"method":"GET","path":"/quote","tag":"web"},{"method":"GET","path":"/spec","tag":"spec"},{"method":"POST","path":"/spec","tag":"spec"},{"method":"GET","path":"/spec/{spec_id}","tag":"spec"},{"method":"POST","path":"/spec/{spec_id}/promote","tag":"spec"},{"method":"GET","path":"/structure","tag":"structure"},{"method":"GET","path":"/structure.json","tag":"structure"}],"order_states":{"draft":["cancelled","quoted"],"quoted":["cancelled","draft","ordered"],"ordered":["cancelled","completed"],"completed":[],"cancelled":[]},"status":{"done":["척추 가격엔진(결정론)","상거래 Party·Order","API 어댑터","DB 영속화(PostgreSQL)","TLS/HTTPS","간단 프론트(/quote)","철골 공사(/projects 협의추적)"],"gaps":["견적 가격 실값(ERP 포팅)","인증","MCP 어댑터","도메인 placeholder 실데이터","Alembic 마이그레이션","고객 워크스페이스(채널 인입)"],"tests":{"spine":4,"commerce":4,"api":8}},"diagrams":{"architecture":"graph TD\n  API[api 어댑터] --> SVC[services]\n  SVC --> CORE[core 앵커·파이프라인]\n  SVC --> DOM[domain/steel 철강지식]\n  SVC --> PERS[persistence DB]\n  DOM --> CORE\n  PERS --> CORE","data_model":"graph LR\n  PARTY[Party 고객·거래처]\n  SPEC[SpecObject 사양]\n  ORDER[Order 견적=주문]\n  MAT[Material 재질]\n  BRK[Breakdown 가격분해]\n  PROJ[Project 철골공사]\n  NOTE[ProjectNote 협의기록]\n  ORDER -->|party_id| PARTY\n  ORDER -->|lines spec_id+수량| SPEC\n  SPEC -->|material_code| MAT\n  SPEC -->|price.compute| BRK\n  PROJ -->|발주처 party_id| PARTY\n  NOTE -->|project_id| PROJ","order_state":"stateDiagram-v2\n  [*] --> draft\n  draft --> cancelled\n  draft --> quoted\n  quoted --> cancelled\n  quoted --> draft\n  quoted --> ordered\n  ordered --> cancelled\n  ordered --> completed"}}