## ADR-004 (Output/reports/ADR-004-sprint-25-39-decisions.md) Sprint 25~39 기간의 **15개 아키텍처 결정** 정리: - D1~D9: 거더교 MVP 확장 (단면 분기·다경간·Skew 관례·방호벽·격벽·Camber·헌치·UI) - D10~D13: IFC4X3 Add2 익스포터 4 결정 (크레이트 분리·형상 전략 3단계·GUID·Camber 근사) - D14: proc-macro 스캐폴딩 (전면 #[param] 는 Feature 10+ 안정 후) - D15: 변단면 거더 알고리즘 (소핏 lift + Y 선형보간) - 미결 6항목 (Pset 확장·LinearPlacement·ElementAssembly·IfcPile·#[param] 전면·변단면 IFC) - 테스트 커버리지 101개 현황표 ## IFC 스냅샷 테스트 (crates/ifc/tests/snapshot_tests.rs) insta 기반 회귀 방지, 8개 baseline: - mask_guids(): 22자 IFC GUID 를 'GUID' 로 정규화 (결정적 비교 가능) - 시나리오: 기본 단경간 PSC-I / 2경간 π형 / skew 15° / camber 50mm / Rectangle 단면 / parapets off - mask_guids 자체 유닛 테스트 2개 ## Mesh helper 유닛 테스트 (crates/viewer/src/bridge_scene.rs helper_tests) 순수 함수 9개 검증: - apply_camber_mesh: zero 항등·midspan 도달값·경간 밖 미영향 - rotate_y_around_z: 0 회전 항등·90° 피봇 회전·정점 개수 보존 - apply_variable_depth: zero 항등·소핏 lift · 지점 0 lift ## clippy lib 경고 15+ → 0 - map_identity (kernel/expansion_joint.rs) - unnecessary_lazy_evaluations ×4 (dsl/abutment·pier·csv_template — auto-fix) - too_many_arguments (usd save_scene — allow with justification) - clamp-like 패턴 ×7 (viewer bridge_scene/incremental_scene 의 .max(1).min(N) → .clamp(1, N)) - redundant_closure ×2 (project_file 의 `|e| Error::other(e)` → `Error::other`) - redundant_guard ×1 (viewer KeyboardInput match guard → 패턴 내 직접 매치) cargo clippy --workspace --lib: 0 경고. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
115 lines
16 KiB
Markdown
115 lines
16 KiB
Markdown
# PROGRESS.md — 완료 내역
|
||
|
||
시간 역순(최신이 위). 에이전트 시작 시 필독. 작업 완료 시 한 줄 추가.
|
||
|
||
## 작성 규칙
|
||
- 형식: `- YYYY-MM-DD [유형] 한 줄 설명`
|
||
- 유형: `adr` · `wiki` · `guide` · `meta`(구조·규칙) · `raw`(원본 수집) · `code`(cimery 코드) · `infra`
|
||
- 스냅샷 섹션은 의미 있는 변화가 생기면 갱신.
|
||
|
||
---
|
||
|
||
## 타임라인
|
||
|
||
### 2026-04-15 (계속)
|
||
- adr — ADR-004 작성. Sprint 25~39 15개 아키텍처 결정 정리 (단면 분기·다경간·피어 MVP·Skew·방호벽·격벽·Camber·헌치·UI·IFC 형상 전략·GUID·proc-macro 스캐폴딩·변단면 알고리즘). 미결 항목 6개(Pset 확장·LinearPlacement·ElementAssembly·IfcPile·`#[param]` 전면·변단면 IFC). 테스트 101개 현황 정리.
|
||
- code — 테스트·경고 정리 (엔지니어링 로직 외 품질 작업).
|
||
- `cimery-ifc` insta 스냅샷 테스트 8개 신설 (`tests/snapshot_tests.rs`): GUID 마스킹 `mask_guids()` 로 결정적 비교. 시나리오 6종(기본·다경간·skew·camber·Rectangle·parapets off) + 마스킹 유닛 2개.
|
||
- `cimery-viewer` mesh helper 단위 테스트 9개 신설 (`bridge_scene::helper_tests`): `apply_camber_mesh` 3 / `rotate_y_around_z` 3 / `apply_variable_depth` 3. 각 순수 함수의 경계 조건·항등 변환 검증.
|
||
- clippy lib 경고 15+ → 0: `map_identity`, `unnecessary_lazy_evaluations`, `too_many_arguments`(allow), `clamp-like` 패턴 7곳, `redundant_closure`, `redundant_guard` 일괄 정리.
|
||
- code — Sprint 36~39: IFC Alignment + Camber + proc-macro 스캐폴딩 + 변단면 거더.
|
||
- Sprint 36 (IFC Phase 3b): IfcAlignment + 직선 horizontal/constantgradient vertical segment + IfcRelNests 계층. `write_straight_alignment()` helper. Site 가 Bridge·Alignment 동시 aggregate.
|
||
- Sprint 37 (IFC Camber): `BridgeExportParams.camber_mid_mm` 추가. camber > 0 일 때 거더를 `CAMBER_SEGMENTS`(=10)개 세그먼트로 분할, 각 세그먼트 Y 오프셋에 포물선 값 적용. Pset 는 첫 세그먼트에만 부착(전체 거더 대표). viewer scene_params_to_ifc 에 매핑.
|
||
- Sprint 38 (proc-macro 스캐폴딩): `cimery-macros` 크레이트 신설 (proc-macro=true, syn/quote/proc-macro2). `#[derive(ParamSummary)]` 구현 — struct named field 개수·이름 compile-time 상수 생성. 테스트 3개 (count/names/empty). ADR-002 D `#[param(unit,range,default)]` 전면 구현은 후속 스프린트.
|
||
- Sprint 39 (변단면 거더): `SceneParams.variable_depth_mm`(0~800mm) 추가. `apply_variable_depth()` — 경간 [z0,z1]에서 포물선 soffit lift 를 정점 Y 에 선형 보간 적용(`y_new = y + lift(u)·(1 - y/h)`). 거더 상면은 고정, 소핏이 중앙부에서 올라가 web 축소 → 연속교 관례 형상. camber 와 독립 조합 가능.
|
||
- code — Sprint 35: IFC 뷰어 통합 + Pset_BeamCommon.
|
||
- `cimery-viewer` 에 `cimery-ifc` 의존성 추가. `project_file::scene_params_to_ifc()` 변환 함수 (SceneParams → BridgeExportParams 전 필드 매핑).
|
||
- 프로젝트 섹션에 "📤 IFC4X3 익스포트" 버튼. `projects/bridge.ifc` 로 저장, 현재 파라미터(경간 수·교각 형식·skew·헌치·단면 등) 그대로 반영.
|
||
- `write_pset_beam_common()` 추가: Reference(이름) + Span(mm) + LoadBearing + IsExternal 4 속성, `IFCRELDEFINESBYPROPERTIES` 로 거더 각 beam 에 연결.
|
||
- `IfcSectionKind` public re-export. 테스트 17개 통과.
|
||
- code — Sprint 34: IFC4X3 Add2 익스포터 Phase 2. 정확도·커버리지 확장.
|
||
- PSC-I 실제 14점 단면 `IFCARBITRARYCLOSEDPROFILEDEF` + `IFCPOLYLINE` 구현 (도심 중심화 Y 평행이동). `IfcSectionKind` enum 으로 단면 종류 분기.
|
||
- Skew 회전 `write_local_placement_skewed()`: `IFCAXIS2PLACEMENT3D` RefDirection 을 Y축 회전 X축으로 설정. 교대·피어·받침·신축이음에 적용. 거더·데크는 직선 유지.
|
||
- 헌치 `haunch_depth` 반영: 데크 Y 위치 = `bearing_h + girder_h + haunch_depth + slab/2`.
|
||
- 방호벽 `IFCRAILING` (좌/우) 추가.
|
||
- `BridgeExportParams` 확장: section_kind, skew_deg, haunch_depth, show_parapets, show_joints.
|
||
- 테스트 6개 추가(16개 전체 통과): PSC-I 사용 확인, 방호벽 on/off, Rectangle fallback, skew 회전 검증, haunch 반영.
|
||
- code — Sprint 33: IFC4X3 Add2 익스포터 Phase 1. `cimery-ifc` 크레이트 신설. STEP Part21 writer(`IfcWriter`, header+data+finish) + IfcGloballyUniqueId 생성(UUIDv4 → base64 22자) + `export_bridge()` API. 엔티티: IfcProject→IfcSite→IfcBridge 계층(IfcRelAggregates 관계) + 거더(IFCBEAM, span_count×girder_count 개) + 데크(IFCSLAB) + 피어(IFCCOLUMN, 내부 지점) + 교대(IFCFOOTING) + 받침(IFCBEARING — IFC4X3 신규 엔티티). 형상: IfcExtrudedAreaSolid + IfcRectangleProfileDef 단순화(Phase 2 에서 실제 단면). 단위: mm. 배치: IfcLocalPlacement 월드 원점 기준. 테스트 10개 통과. `cimery-app`에 `export_ifc_default` IPC 커맨드 추가.
|
||
- code — Sprint 31~32: 헌치 + UI 재정리.
|
||
- Sprint 31: 데크 헌치 (Haunch). `SceneParams.haunch_depth` (0~300mm) 추가. 거더 상부와 데크 soffit 사이 600mm 폭 × haunch_d 높이 블록을 거더마다 배치. 데크 위치는 `girder_h + haunch_depth + slab_thickness` 로 이동 (기존 6개 참조 일괄 수정). camber + skew 동시 적용.
|
||
- Sprint 32: 속성 패널 카테고리 재정리 (누적 11개 슬라이더 섞여 혼잡). 5개 CollapsingHeader 로 분리: 상부구조·바닥판·선형/기하·하부구조·추가부재·표시. `ps!($ui, ...)` 매크로 hygiene 수정(ui 명시적 매개변수화).
|
||
- ProjectFile: haunch_depth 필드.
|
||
- code — Sprint 29~30: 거더교 MVP 추가 확장.
|
||
- Sprint 29: 지점부 격벽 (Diaphragm). `SceneParams.show_diaphragms` 토글(default true). 모든 지점(교대·교각) 에서 인접 거더 사이 RC 벽 자동 배치. 두께 300mm(span 방향), 높이 = girder_h, 폭 = spacing - 250mm(web clearance). skew 회전 동시 적용. `build_bridge_scene` + `build_selectable_scene` 양쪽.
|
||
- Sprint 30: 솟음 (Camber). `SceneParams.camber_mid_mm`(0~200mm) 추가. `apply_camber_mesh()` 헬퍼 — 경간 [z0, z1] 내 포물선 Y 오프셋 `4·mid·u·(span-u)/span²`. 거더·데크에 경간마다 독립 적용. 지점에서는 0. UI "솟음(mm)" 슬라이더.
|
||
- ProjectFile: `show_diaphragms`·`camber_mid_mm` 필드 (default 값).
|
||
- code — Sprint 25~28: 거더교 MVP 완성도 보강.
|
||
- Sprint 25: `build_selectable_scene` 의 `SectionType::PscI` 하드코딩 제거 → `p.section_type` 분기(PscI/SteelBox).
|
||
- Sprint 26: 다경간 + 교각 배치. `SceneParams.span_count`(1~5) + `pier_type`(T형 SingleColumn / π형 MultiColumn) 추가. `span_m` 의미 변경: 경간당 길이. 씬 빌더가 경간마다 거더 세트 복제, 내부 지점에 피어 배치, 모든 지점에 받침·신축이음, 양 끝에 교대. `pier_ir_for_params()` 헬퍼(wiki Phase 1 MVP — CSB 2m·TB 2.5m 기본값).
|
||
- Sprint 27: Skew 지원. `SceneParams.skew_deg`(-30~30°) 추가. `rotate_y_around_z()` 헬퍼로 교대·교각·받침·신축이음 Y축 회전. 거더·데크는 직선 유지(precast 관례).
|
||
- Sprint 28: 방호벽 (Parapet) 기본 형상. 데크 양 엣지에 1200mm×500mm RC 박스 전 구간 연속, Y=데크 상면 기준.
|
||
- ProjectFile v2: `span_count`·`pier_type`·`skew_deg` 필드 (v1 호환 default).
|
||
- UI 리본: "경간 수" 슬라이더, "교각 형식" T/π 선택, "경사각(°)" 슬라이더.
|
||
- 뷰어 타이틀에 build timestamp 주입(`build.rs`), stale 바이너리 판별 지원.
|
||
- Ortho 카메라 추가 (키 `O` / egui 버튼): perspective ↔ 평행 투영 토글.
|
||
- raw — raw/engineer-knowledge/cet-hmeg-pier-2021/ 신설. 한맥기술(2021) PierZainer 분석 리포트 v3 + Excel 수식 분석 + 9개 도면 + 발표/에러 리포트 인입(약 18 파일).
|
||
- wiki — 교각 6개 페이지 컴파일: [[교각 형식 분류]] · [[교각 4 레이어 구조]] · [[교각 파라미터 카탈로그]] · [[교각 자동계산 수식]] · [[교각 3점 기준좌표계]] · [[기둥 단면 형상 카탈로그]]. index.md "도메인: 교량" 카테고리 신규 6항목 추가, log.md 7건 기록.
|
||
- code — Sprint 24: salsa 0.16 증분 쿼리 백엔드. `--features salsa-backend`로 활성화. `SalsaIncrementalDb<K>` — salsa `#[query_group]` + IR Eq 지원. 기존 `IncrementalDb` (수동) 완전 보존. 동일 공개 API. 테스트 20개 전부 통과 (수동 12 + salsa 8). `cimery-ir` 전 IR 구조체에 `PartialEq` 추가 + 수동 `Eq` impl (빌더 검증 도메인). `Mesh + KernelError`도 동일. `cargo check --workspace` 0 warnings. WASM: 수동 backend 유지, salsa는 WASM 안정화 후 기본값 승격 예정.
|
||
- code — Sprint 23: Tauri v2 앱 래핑. `cimery-app`에 tauri v2 + tauri-plugin-dialog 적용. `tauri.conf.json`(창 설정·번들 설정) + `capabilities/default.json` + `frontend/index.html`(런처 UI: 홈·프로젝트·USD익스포트·CSV템플릿) + `src/commands.rs`(IPC: launch_viewer·new_project·open_project_dialog·save_project_dialog·export_usd_default·export_csv_template) + `build.rs`(tauri_build). `cargo check --workspace` 0 errors. 뷰어는 same-dir 바이너리 탐색 + PATH fallback으로 사이드카 실행. `.github/workflows/release.yml` Tauri bundle 3단계(viewer→tauri-bundle→release) 워크플로로 교체. Tauri v2 앱 래핑. `cimery-app`에 tauri v2 + tauri-plugin-dialog 적용. `tauri.conf.json`(창 설정·번들 설정) + `capabilities/default.json` + `frontend/index.html`(런처 UI: 홈·프로젝트·USD익스포트·CSV템플릿) + `src/commands.rs`(IPC: launch_viewer·new_project·open_project_dialog·save_project_dialog·export_usd_default·export_csv_template) + `build.rs`(tauri_build). `cargo check --workspace` 0 errors. 뷰어는 same-dir 바이너리 탐색 + PATH fallback으로 사이드카 실행. `.github/workflows/release.yml` Tauri bundle 3단계(viewer→tauri-bundle→release) 워크플로로 교체.
|
||
|
||
### 2026-04-14
|
||
- wiki — [[cimery 실행 가이드]] 작성. 빌드·테스트·뷰어·USD·WASM·CI/CD·크레이트 구조 전체 실행 명령 문서화.
|
||
- code — Sprint 20: 테스트 4층 완성. Layer1 IR 스냅샷(insta, 7종), Layer2 기하 불변량(19개), Layer3 두-커널 크로스체크(7개), Layer4 proptest(7개). 총 61개 테스트 전부 통과.
|
||
- code — Sprint 22: WASM/PWA 빌드 지원. viewer feature `wasm`, `wasm-bindgen`/`web-sys`/`console_error_panic_hook` 의존성, `.github/workflows/wasm.yml` Cloudflare Pages 배포 워크플로.
|
||
- code — Sprint 21: USD 전체 메시 익스포트. `cimery-usd` PureRustKernel 실제 기하 변환, `BridgeExporter` 증분 캐시, 전체 씬 익스포트 파이프라인.
|
||
- code — Sprint 19: CrossBeam + ExpansionJoint. IR/DSL/kernel/scene 전 계층. `CrossBeamIR`, `ExpansionJointIR`, DSL 빌더 검증, `sweep_profile_flat_x()`, 씬 파라미터 확장.
|
||
- code — Sprint 18: OcctKernel 교각·교대 B-rep. 16각형 기둥 + 코핑 + 날개벽 Workplane::xz().sketch().extrude() 구현.
|
||
- code — Sprint 17: 선형 기반 좌표 변환. `AlignmentTransform` + `AlignmentScene`, 국소 프레임 → 세계 좌표 변환.
|
||
- code — Sprint 16: CI/CD. Gitea `.gitea/workflows/ci.yml`, GitHub `.github/workflows/ci.yml` + `release.yml` 멀티플랫폼 빌드·릴리스.
|
||
- code — Sprint 15: IncrementalDb 전 Feature 타입 확장. girder 전용 → 5종(girder·deck·bearing·pier·abutment·cross_beam·expansion_joint), 20개 단위 테스트.
|
||
- code — Sprint 14: egui 리본 UI. TopBottomPanel 리본, 260px SidePanel CollapsingHeader 섹션(상부구조·추가부재·표시·선형·프로젝트·단축키).
|
||
- code — Sprint 8: IncrementalDb 스캐폴드 (안정 ID, girder 캐시).
|
||
- code — Sprint 7: CSV 라운드트립 — girder_to_csv_template() + girder_from_csv(), 테스트 3개.
|
||
- code — Sprint 6: AlignmentIR JSON 로더 + test alignment BR-001.
|
||
- code — Sprint 5: egui 속성 패널 + Apply 버튼. 한글 폰트(Malgun Gothic). 파라메트릭 씬 재생성.
|
||
- code — Sprint 4: Full bridge scene (Girder×5 + DeckSlab + Bearing×10 + Abutment×2). Pan+ZoomExtents+표준뷰.
|
||
- code — OcctKernel viewer 연결 완료. PSC-I B-rep I형 단면 렌더 확인 (스크린샷).
|
||
- code — OcctKernel 구현 완료 (`--features occt`). PSC-I B-rep sweep + BRepMesh 테셀레이션. 빌드 확인.
|
||
- code — cimery Sprint 1 구현 완료. 8 crates (core/ir/dsl/kernel/incremental/evaluator/usd/viewer), `cargo test --workspace` 32개 전부 통과. DSL→IR→salsa-style-db→evaluator→StubKernel→USD 파이프라인 검증.
|
||
- meta — Revit API 가이드 Output/guides/revit-api-guide.md 추가됨.
|
||
- meta — PLAN.md · PROGRESS.md 도입. 에이전트 간 작업 조정 프로토콜 확립.
|
||
- meta — CLAUDE.md 린화. 상세 지침을 `Output/guides/cimery-dev-guide.md` · `obsidian-cli.md`로 분리. 프롬프트 토큰 절감.
|
||
- adr — ADR-003 작성. 12개 후속 아키텍처 결정 (UI·IFC·CI/CD·USD·Alignment·Plugin·Feature 카탈로그·FEM·LOD·리본·선택/필터·설정). 병렬 조사 에이전트 기반.
|
||
- adr — ADR-002 작성. Feature DSL 아키텍처 20개 기본 결정 (Internal Rust DSL·IR·salsa·Lazy/Reactive·evaluator·테스트 4층·Revit UX 호환).
|
||
- adr — ADR-001 작성. 기술 스택 확정 (Rust + Tauri v2 + PWA 듀얼, OpenCascade.js/opencascade-rs, wgpu→WebGPU, `GeomKernel` trait).
|
||
- meta — Cloudflare Pages 자동 배포 워크플로 (`.gitea/workflows/publish.yml`, Quartz 4 빌드 → parawiki.pages.dev).
|
||
- meta — Pages 프로젝트 자동 생성 단계 추가.
|
||
- infra — Gitea Actions Runner 동작 확인용 ping 워크플로 추가.
|
||
- wiki — 위키 페이지 8건 컴파일: [[Revit 파라메트릭 아키텍처]] · [[GCS 기하학적 구속조건 솔버]] · [[PCE 파라메트릭 변경 엔진]] · [[파라메트릭 취약성 Davis 5가지]] · [[Revit 조립 단위 분류]] · [[특징 형상 기반 모델링 FBM]] · [[증분형 갱신 알고리즘 LPG]] · [[선형 GIS 기반 좌표계]].
|
||
- meta — 위키 구조 초기화 (`raw/` · `wiki/` · `Output/`, Karpathy LLM Wiki 패턴).
|
||
|
||
---
|
||
|
||
## 현재 스냅샷 (Snapshot — 2026-04-15)
|
||
|
||
### 지식 저장소 (ParaWiki)
|
||
- 위키 페이지 **8건** (`wiki/index.md` 관리).
|
||
- ADR **3건** (`Output/reports/`).
|
||
- 개발 가이드 **2건** (`Output/guides/`).
|
||
- `wiki/log.md` 운영 중.
|
||
- `raw/` 수집 미개시 (PLAN.md 백로그 참조).
|
||
|
||
### cimery 코드
|
||
- **Sprint 1~23 완료.** `cargo check --workspace` 0 errors. `cargo test -p cimery-kernel` 61개 전부 통과.
|
||
- 전체 파이프라인: DSL → IR → PureRustKernel → 전체 교량 씬 렌더 (egui+wgpu) → USD 익스포트 → 선형 좌표 변환.
|
||
- OcctKernel(`--features occt`): 교각 B-rep + 교대 B-rep 구현 완료.
|
||
- **Tauri v2 앱 (Sprint 23):** `cimery-app`이 Tauri v2 앱으로 전환. 런처 WebView UI + 7개 IPC 커맨드(뷰어 실행·프로젝트 관리·USD/CSV 익스포트). `cargo tauri build`로 Win MSI/NSIS·macOS DMG·Linux Deb/AppImage 생성 가능.
|
||
- **salsa 0.16 백엔드 (Sprint 24):** `SalsaIncrementalDb` — `--features salsa-backend` 활성화, 수동 tracking과 동일 API. 모든 IR + Mesh에 `PartialEq + Eq` 추가. `cargo check --workspace` 0 warnings.
|
||
- CI/CD: Gitea Actions + GitHub Actions 3단계 릴리스(viewer sidecar→Tauri bundle→GitHub Release) 완료. WASM PWA 포함.
|
||
- 테스트 4층: IR 스냅샷 · 기하 불변량 · 두-커널 크로스체크 · proptest 전부 완료.
|
||
|
||
### 아키텍처 결정 완성도
|
||
- 기본 구조 결정(DSL·기술 스택·후속 12개) **완료**.
|
||
- 구현 고려사항(함정·체크리스트) 정리 완료.
|
||
- **미결·재검토:** FEM B9(자체 솔루션 보유 반영), IFC 5+USD 실제 표준화 진전 모니터링.
|