Sprint 23/24 — Tauri v2 앱 래핑 + salsa 0.16 증분 쿼리 백엔드
All checks were successful
Publish ParaWiki / build-and-deploy (push) Successful in 34s

Sprint 23: cimery-app을 Tauri v2 앱으로 전환.
- tauri.conf.json, capabilities/default.json, frontend/index.html 추가
- src/commands.rs: 7개 IPC 커맨드 (launch_viewer, 프로젝트 관리, USD/CSV 익스포트)
- 뷰어 사이드카: std::process::Command 방식 (PATH + exe-dir 탐색)
- release.yml: 3단계 멀티플랫폼 릴리스 워크플로로 교체

Sprint 24: cimery-incremental에 salsa 0.16 백엔드 추가.
- salsa_db.rs: BridgeQueryGroup + SalsaIncrementalDb<K>
- --features salsa-backend 로 활성화 (기본값: 수동 tracking, WASM 안전)
- IR 전 구조체 + Mesh + KernelError에 PartialEq/Eq 추가
- 테스트 20개 전부 통과 (수동 12 + salsa 8)
- cargo check --workspace 0 errors/warnings

기타: viewer/dsl 컴파일 경고 제거, wiki 실행 가이드 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
minsung
2026-04-15 09:09:47 +09:00
parent 1f9ca3a00f
commit 824c18610b
24 changed files with 1743 additions and 138 deletions

View File

@@ -36,7 +36,7 @@ impl std::fmt::Display for FeatureId {
///
/// All values are raw primitives — no unit types here (kernel doesn't need them).
/// Convention: linear = metres, structural = millimetres.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GirderIR {
pub id: FeatureId,
/// Station along alignment [m].
@@ -64,7 +64,7 @@ impl GirderIR {
// ─── Section params ───────────────────────────────────────────────────────────
/// Cross-section geometry. Tag is the section type name.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "kind")]
pub enum SectionParams {
PscI(PscISectionParams),
@@ -82,7 +82,7 @@ pub enum SectionParams {
/// #[param(unit="mm", range=120..=300, default=180)] bottom_flange_thickness
/// #[param(unit="mm", range=150..=350, default=200)] web_thickness
/// #[param(unit="mm", range=0..=100, default=50)] haunch
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PscISectionParams {
pub total_height: f64,
pub top_flange_width: f64,
@@ -109,7 +109,7 @@ impl PscISectionParams {
}
/// PSC U-girder section [all mm].
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PscUSectionParams {
pub total_height: f64,
pub top_width: f64,
@@ -119,7 +119,7 @@ pub struct PscUSectionParams {
}
/// Steel box girder section [all mm].
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SteelBoxParams {
pub total_height: f64,
pub top_width: f64,
@@ -130,7 +130,7 @@ pub struct SteelBoxParams {
}
/// Steel plate I-girder section [all mm].
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SteelPlateIParams {
pub total_height: f64,
pub flange_width: f64,
@@ -141,7 +141,7 @@ pub struct SteelPlateIParams {
// ─── Alignment IR ────────────────────────────────────────────────────────────
/// Single station point along an alignment.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AlignmentStation {
/// Station distance along alignment [m].
pub station: f64,
@@ -154,7 +154,7 @@ pub struct AlignmentStation {
}
/// Road/bridge alignment specs.
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct AlignmentSpecs {
#[serde(default)]
pub r#type: String,
@@ -167,7 +167,7 @@ pub struct AlignmentSpecs {
}
/// Alignment IR — parsed from cimery's own JSON format (ADR-002 R).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AlignmentIR {
pub name: String,
#[serde(default)]
@@ -219,7 +219,7 @@ impl AlignmentIR {
/// Fully-resolved Deck Slab (바닥판) specification.
/// Structural dimensions in mm, alignment in m.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DeckSlabIR {
pub id: FeatureId,
pub station_start: f64, // m
@@ -246,7 +246,7 @@ impl DeckSlabIR {
// ─── Bearing IR ───────────────────────────────────────────────────────────────
/// Fully-resolved Bearing (받침) specification.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BearingIR {
pub id: FeatureId,
pub station: f64, // m — position along alignment
@@ -262,7 +262,7 @@ pub struct BearingIR {
// ─── Cap Beam IR ──────────────────────────────────────────────────────────────
/// Pier cap beam (교각 코핑).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CapBeamIR {
pub length: f64, // mm — total along transverse
pub width: f64, // mm — along span
@@ -274,7 +274,7 @@ pub struct CapBeamIR {
// ─── Pier IR ──────────────────────────────────────────────────────────────────
/// Fully-resolved Pier (교각) specification.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PierIR {
pub id: FeatureId,
pub station: f64, // m
@@ -294,7 +294,7 @@ pub struct PierIR {
// ─── Wing Wall IR ─────────────────────────────────────────────────────────────
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WingWallIR {
pub length: f64, // mm — along wing wall axis
pub height: f64, // mm — at connection with breast wall
@@ -304,7 +304,7 @@ pub struct WingWallIR {
// ─── Abutment IR ──────────────────────────────────────────────────────────────
/// Fully-resolved Abutment (교대) specification.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AbutmentIR {
pub id: FeatureId,
pub station: f64, // m
@@ -327,7 +327,7 @@ pub struct AbutmentIR {
///
/// Cross beams provide lateral bracing between girders at regular intervals.
/// All dimensions in mm; station in m.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CrossBeamIR {
pub id: FeatureId,
/// Station along alignment [m] — position of this cross beam set.
@@ -361,7 +361,7 @@ impl CrossBeamIR {
///
/// Placed at the ends of a span or at pier locations to allow relative movement.
/// All dimensions in mm; station in m.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ExpansionJointIR {
pub id: FeatureId,
/// Station along alignment [m].
@@ -377,6 +377,29 @@ pub struct ExpansionJointIR {
pub movement_range:f64,
}
// ─── Eq impls ─────────────────────────────────────────────────────────────────
//
// IR values are validated by builders to never contain NaN or ±Inf.
// Implementing Eq on top of PartialEq is therefore safe: PartialEq IS a
// total equivalence relation for the valid IR domain.
impl Eq for GirderIR {}
impl Eq for SectionParams {}
impl Eq for PscISectionParams {}
impl Eq for PscUSectionParams {}
impl Eq for SteelBoxParams {}
impl Eq for SteelPlateIParams {}
impl Eq for AlignmentStation {}
impl Eq for AlignmentIR {}
impl Eq for DeckSlabIR {}
impl Eq for BearingIR {}
impl Eq for CapBeamIR {}
impl Eq for PierIR {}
impl Eq for WingWallIR {}
impl Eq for AbutmentIR {}
impl Eq for CrossBeamIR {}
impl Eq for ExpansionJointIR {}
// ─── Tests ────────────────────────────────────────────────────────────────────
#[cfg(test)]