본문으로 건너뛰기

변경 이력 (Changelog)

Caffeine Framework의 버전별 변경 사항입니다.

개요​

이 문서는 NuGet.org에 공식 배포된 버전의 변경 이력을 기록합니다.

최신 NuGet 버전: v3.2.0 (2026-03-26) — AAS Ecosystem (Auto Twin + Multi-Driver + PassiveIngest)

v2.0.9은 Caffeine Framework의 첫 NuGet.org 공개 릴리스입니다. 이전 버전(v2.0.8 이하)은 내부 개발 빌드로 공개 배포되지 않았습니다.


[2.3.0] - 2026-04-17​

Added​

  • FIR-046: AddCaffeineInfrastructure(config, Action<InfraOptions>?) overload — Feature Module 선택적 활성화.
  • FIR-038: IBridgeAdvertiser.UpdateAdvertisementAsync DIM 본문 제거 (순수 추상) + ZeroconfBridgeAdvertiser diff 기반 분기 (Identity 변경 vs Updatable-only). NullBridgeAdvertiser 신규.
  • FIR-041: IOtaUpdateService.DeployAsync(OtaDeploymentPlan) + IObservable<OtaProgressEvent> Progress 병존 추가. OtaStage, OtaProgressEvent, OtaCanarySchedule, OtaDeploymentPlan, OtaProgressCalculator 신규 Core 타입. Canary/Phase1~3 점진 롤아웃 + MaxFailureRate 초과 시 자동 Aborted.

Documented​

  • FIR-040: ITagToSubmodelMapper.Map(..., equipmentCategory) 카테고리별 매핑은 NexMind REQ-11 (v2.2.x 이전) 구현 과정에서 선행 반영되어 v2.3.0 에서 공식 항목으로 기록. 동일 Temperature 가 Compressor 와 PackagingMachine 등 카테고리에 따라 서로 다른 TagMappingRule 로 해석됨.
  • FIR-039: NetworkComplianceSubmodelProvider 및 관련 INetworkComplianceChecker / IdtaSemanticIds.NetworkCompliance / AasConstants.SubmodelTypes.NetworkCompliance 는 AAS IEC 63278 초기 구현 과정에서 선행 반영되어 v2.3.0 에서 공식 항목으로 기록. 9 개 Provider 의 공통 ISubmodelProvider.BuildSubmodelAsync 컨벤션을 따르며, SemanticId 는 IDTA URL 포맷 (https://admin-shell.io/idta/SM/NetworkCompliance/1/0) 을 유지.

Upgrade Notes (v2.3.0)​

FIR-046: 선택적 Feature Module 활성화​

v2.3.0 이전에는 모든 인프라 모듈이 일괄 등록되었습니다.

// v2.3.0 이전 — 12개 모듈 전부 등록
services.AddCaffeineInfrastructure(configuration);

v2.3.0부터 Action<InfraOptions> overload로 필요한 모듈만 활성화할 수 있습니다.

// v2.3.0 — NexMind 예시: InfluxDB 제외, TypeDB 유지
services.AddCaffeineInfrastructure(configuration, opt =>
{
opt.UseInfluxDb = false; // TimescaleDB로 교체 예정 (FIR-042 Phase C 대기)
opt.UseTypeDb = true; // 지식 그래프는 유지
});

상호 의존성 검증은 DI 등록 시점에 자동 수행됩니다.

조건결과
UseAlerting=true && UseRedis=falseInvalidOperationException (시작 차단)
UseTimescaleDb=true (v2.3.0)InvalidOperationException — FIR-042 Phase C 이후 지원
UseInfluxDb=false && UseTimescaleDb=falseWarning 로그 — TraceWriter no-op
UseMachineLearning=true && UseObservability=falseWarning 로그 — ML 메트릭 누락

기본값은 모두 true이므로 Action<InfraOptions>를 생략하면 기존 동작과 동일합니다. 전체 플래그 목록은 infrastructure.md#infra-options를 참조하세요.

FIR-038: IBridgeAdvertiser.UpdateAdvertisementAsync​

Bridge.Host에서 광고 메타데이터를 변경할 때 UpdateAdvertisementAsync를 사용합니다. 구현체는 Identity 필드(BridgeId, DriverType, Port) 변경 여부를 diff로 판단해 최소 단절만 유발합니다.

// FriendlyName·Location 등 Updatable 필드만 변경 — 재등록 없이 TXT 레코드만 갱신
var updated = current with { FriendlyName = "Conveyor Line B" };
await _advertiser.UpdateAdvertisementAsync(updated, ct);

// BridgeId가 변경된 경우 — 내부적으로 Stop → Start (단절 발생, 로그에 경고)
var reregistered = current with { BridgeId = newBridgeId };
await _advertiser.UpdateAdvertisementAsync(reregistered, ct);

광고가 불필요한 환경(테스트, 단독 실행)에서는 NullBridgeAdvertiser를 DI에 등록하면 됩니다. NullBridgeAdvertiser는 모든 호출을 no-op으로 처리합니다.

FIR-040: ITagToSubmodelMapper — equipmentCategory 파라미터​

v2.3.0에서 Map 메서드에 선택적 equipmentCategory 파라미터가 추가되었습니다. 동일한 SemanticId라도 장비 유형에 따라 다른 매핑 규칙을 적용할 수 있습니다.

// 기존 호출 — 하위 호환 (null 카테고리로 동작)
mapper.Map(tagValue, equipmentId, "0173-1#02-AAV232#002");

// v2.3.0 — 카테고리별 규칙 적용
mapper.Map(tagValue, equipmentId, "0173-1#02-AAV232#002", "Compressor");
mapper.Map(tagValue, equipmentId, "0173-1#02-AAV232#002", "PackagingMachine");
// 동일 Temperature SemanticId, 서로 다른 TagMappingRule 반환

v2.2.x에서 카테고리 구분을 위해 사용하던 워크어라운드(Wrapper 타입, 별도 매퍼 등록)는 제거해도 됩니다.

FIR-041: IOtaUpdateService — Fleet 점진 배포​

DeployAsync + Progress Rx 스트림으로 Canary → Phase1~3 → Complete 단계를 관찰합니다.

var plan = new OtaDeploymentPlan
{
FirmwareArtifact = "harbor.internal/firmware/bridge-agent:2.3.0",
TargetDevices = new[] { "bridge-01", "bridge-02", "bridge-03" },
MaxFailureRate = 0.05, // 5% 초과 시 자동 Aborted
// Canary 기본값: OtaCanarySchedule.Default (5% → 25% → 60% → 100%)
};

var disposables = new CompositeDisposable();

_otaService.Progress
.Subscribe(ev => _logger.LogInformation("[OTA] {Stage} {DeviceId} {Pct:P0}",
ev.Stage, ev.DeviceId, ev.ProgressPercent))
.DisposeWith(disposables);

await _otaService.DeployAsync(plan, ct);
disposables.Dispose();

Canary 비율을 커스터마이즈하려면 OtaCanarySchedule을 직접 생성합니다.

var plan = new OtaDeploymentPlan
{
FirmwareArtifact = "harbor.internal/firmware/bridge-agent:2.3.0",
TargetDevices = devices,
Canary = new OtaCanarySchedule(
CanaryPercent: 0.02, // 2% Canary
Phase1Percent: 0.20,
Phase2Percent: 0.50,
Phase3Percent: 1.00),
};

FIR-039: NetworkComplianceSubmodelProvider​

ISubmodelProvider 구현체를 DI에 등록하면 AAS 서브모델 조회 시 자동으로 포함됩니다.

// DI 등록
services.AddScoped<INetworkComplianceChecker, DefaultNetworkComplianceChecker>();
services.AddScoped<ISubmodelProvider, NetworkComplianceSubmodelProvider>();

// AAS API를 통한 조회
// GET /api/v1/aas/{id}/submodels
// 응답에 SemanticId="https://admin-shell.io/idta/SM/NetworkCompliance/1/0" 서브모델 포함

[Tool] Simulator Hub — GUI 기반 올인원 PLC 시뮬레이터 (2026-04-01)​

PlcSimulator CLI를 라이브러리(Caffeine.Simulator.Lib)로 추출하고, Blazor Server 기반 GUI 앱(Caffeine.Tools.SimulatorApp)을 추가했습니다.

주요 기능​

  • Caffeine.Simulator.Lib: PlcSimulator 핵심 코드를 재사용 가능한 클래스 라이브러리로 분리
    • IPlcInstance 인터페이스 + MC/XGT 구현체
    • PlcInstanceManager: 멀티 인스턴스 관리, 포트 중복 검사, Rx 이벤트 스트림
    • PlcMemory: thread-safe 메모리 (maxAddress 가드 추가)
  • Caffeine.Tools.SimulatorApp: Blazor Server 웹 UI (http://localhost:5050)
    • 대시보드: PLC 카드 그리드, 시작/정지/추가/삭제
    • 메모리 편집기: 5열 테이블 (Hex/Decimal/Float/ASCII), 인라인 편집
    • 실시간 모니터링: SVG 스파클라인 차트, 다중 Watch 목록
    • 설정 영속화: simulator_config.json 자동 저장/복원

실행​

dotnet run --project tools/Caffeine.Tools.SimulatorApp/

문서​


[Tool] PLC Simulator — 가상 PLC 프로토콜 서버 (2026-03-31)​

실제 PLC 장비 없이 MC(SLMP) 및 XGT(FEnet) 프로토콜을 TCP로 제공하는 가상 PLC 시뮬레이터입니다.

주요 기능​

  • 듀얼 프로토콜: MC(SLMP) 3E Binary Frame (포트 5007) + XGT FEnet (포트 2004)
  • 자동 시뮬레이션: 사인파, 카운터, 온도, Alive 비트 등 다양한 패턴 자동 생성
  • 7개 디바이스 코드: D, W, R, ZR (워드), M, X, Y (비트)
  • CLI 인수: --mc-port, --xgt-port, --interval, --no-sim

실행​

dotnet run --project tools/Caffeine.Tools.PlcSimulator/

문서​


[Fix] Admin 모니터링 폴링 안정화 (2026-03-31)​

로그인/로그아웃 시 모니터링 API 폴링의 안정성을 개선했습니다.

수정 사항​

  • ISSUE-001: 로그인 전 모니터링 API 401 대량 폴링 방지 — 인증 상태 확인 후에만 폴링 시작
  • ISSUE-002: 로그아웃 시 모니터링 폴링 정지 누락 — 로그아웃 이벤트에서 타이머 해제
  • BridgeDiscovery.razor: JsonDocument dispose 누수 수정 + BridgeId slice 안전화

[Testing] E2E Playwright Suite — Admin + Remote Edge Integration (2026-03-31)​

End-to-End 테스팅 스위트를 Playwright로 구현하여 Admin 대시보드와 원격 Edge 기기의 통합 검증을 자동화했습니다.

E2E Test Coverage​

  • 로컬 Admin 테스트 (29개): 인증, 네비게이션 (14 라우트), 테마/언어 전환, Blazor 런타임, UI 구조 검증
  • 원격 Edge 통합 테스트 (31개): Edge API (/health, /api/bridge/status), 기기 발견, Admin ↔ Edge 통신 검증
  • 헤드리스 모드: CI/CD 파이프라인 통합 준비 (Chromium headless: true)
  • 콘솔 에러 모니터링: 0 critical errors 검증
  • Design Match Rate: 100% (60/60 테스트 통과)

주요 특징​

  • Playwright 자동 선택자 검증 (실제 DOM 기반)
  • Remote Edge (192.168.219.117:5100) 연동 테스트
  • Blazor JS interop, MudBlazor 컴포넌트 검증
  • 다크모드/라이트모드, 한국어/영어 전환 검증
  • 14개 Admin 라우트 전체 커버

문서​

  • Completion Report: docs/04-report/features/e2e-playwright-testing.report.md
  • Gap Analysis: docs/03-analysis/e2e-playwright-testing.analysis.md

Next Steps​

  • GitHub Actions CI 통합 계획 (npm run e2e:headless)
  • Edge 기기 Mock 서버 구성
  • 부정 케이스(error scenarios) 테스트 추가

[WIP] v3.5.0 — Bridge Host UI v2 + Edge→Engine 데이터 파이프라인 (2026-03-30)​

Edge(Bridge Host) UI를 전면 개편하여 설비 벤더사 엔지니어의 커미셔닝 경험을 개선하고, Edge→Engine 데이터 파이프라인의 4단계 연쇄 실패를 수정했습니다.

Bridge Host UI v2​

  • 모니터링 탭 신규: 드라이버 상태 카드 + 실시간 태그 값 (1초 폴링) + 오프라인 버퍼 게이지
  • AAS 편의 기능: 장비 유형 템플릿 (Pump/Motor/CNC/Robot/Conveyor/PLC), IRDI 검색 팝업, IRDI 형식 검증, AAS 설정 JSON Export/Import
  • 태그 Bulk Import/Export: CSV 파일 가져오기/내보내기 버튼 (기존 bulk API 활용)
  • 감사 로그 필터: 액션 유형 드롭다운 + 검색어 필터
  • 다크 모드 토글: ☀️/🌙 버튼, localStorage 영속, 시스템 설정 자동 감지
  • 모니터링 API 3개: GET /api/bridge/monitoring/status, /tags, /buffer

데이터 파이프라인 수정​

  • Driver ID 통일: TagManager 등록 시 manifest.DriverId 사용 (BridgeId가 아닌 실제 gRPC driver-id)
  • ScanPlan 동적 푸시: Bind 후 활성 gRPC 스트림으로 ScanPlan 즉시 전송
  • Bridge transport driverId: 레거시 Driver:Id 대신 Drivers[0].Id 사용
  • GET /manifest 태그 포함: manifest 조회 시 빈 배열 대신 실제 태그 반환
  • Admin 모니터링 ID 수정: EdgeDetail/TagDetail에서 DriverId 폴백 패턴 적용
  • Bool 태그 Length 수정: 2→1 바이트로 정확화

[WIP] v3.4.0 — 통합 알람 인텔리전스 대시보드 (2026-03-29)​

알람 클릭 시 AI 조치 가이드, AAS 디지털 트윈, TypeDB 인과분석, RUL 예측, 이상탐지를 한 화면에서 병렬 로드하는 통합 대시보드.

새로운 기능​

알람 인텔리전스 대시보드​

  • 통합 인텔리전스 페이지 (/alarms/intelligence): 알람 선택 시 5개 패널 자동 확장
  • AI 조치 가이드: 기존 RecommendationPanel 재사용, 알람별 맞춤 추천
  • AAS 디지털 트윈 연동: Engine REST API로 설비 트윈 데이터 로드
  • TypeDB 인과분석: ContextSnapshot에서 AI_Insight 항목 파싱 및 표시
  • RUL 예측 표시: PredictiveMaintenanceController에서 잔여 수명 로드
  • 이상탐지 컨텍스트: Z-score, 상관 이상 점수, 이상 태그 표시

알람 해결 피드백​

  • POST /api/v1/alarms/{code}/resolution: 조치 완료/실패 피드백 저장
  • GET /api/v1/alarms/{code}/resolutions: 해결 이력 조회
  • SQLite AlarmResolutions 테이블 자동 생성

알람 트렌드​

  • GET /api/v1/alarms/trend: 시간대별 알람 발생 건수 (Severity별 분류)

데모 시나리오 통합​

  • 대시보드에서 직접 Overheat/PressureDrop/RandomSpike/Normal 시나리오 실행

[WIP] v3.3.0 — AAS 서브모델 등록 + Bridge AAS Config (2026-03-29)​

Bridge Host에서 AAS 서브모델 정보를 직접 등록하고 Admin에서 Pull하여 디지털 트윈을 생성하는 아키텍처.

새로운 기능​

Bridge AAS Config​

  • Bridge Config UI에 AAS 탭 추가 (Nameplate 입력 + 서브모델 선택 + 시맨틱 매핑)
  • REST API: GET/PUT /api/bridge/config/aas (admin 권한 필요), GET /api/bridge/config/aas/export (인증 불필요)
  • bridge_config.json에 "aas" 섹션 추가 (하위 호환: 기존 파일은 빈 기본값)
  • 시맨틱 자동 매핑: SensorProperty 기반 ECLASS IRDI 기본 테이블 제공

AAS 서브모델 Viewer​

  • AAS 대시보드에서 서브모델 카드 클릭 시 실제 내용 표시 (SubmodelTab 연결)
  • OperationalDataSubmodelProvider: 빈 껍데기 → Tag 기반 스켈레톤 반환
  • REST API: GET /api/aas/shells/{id}/submodels, GET /api/aas/shells/{id}/submodels/{type}

Admin 위저드 Bridge AAS Pull​

  • 설비 구성 위저드 Step 3에서 Bridge의 /api/bridge/config/aas/export 자동 조회 (인증 불필요)
  • Nameplate, 서브모델 선택, 시맨틱 매핑이 Bridge에서 Pull되어 자동 채움
  • 감사 로그에 AAS 설정 변경 기록

[WIP] v2.2.2-edge-resilience — Edge 디바이스 복원력 및 생명주기 관리 (2026-03-28)​

엣지 디바이스 무인 설치 및 자동 복구 기능. systemd 기반 서비스 관리, 주기적 heartbeat, Engine 동적 재연결, 헬스 체크 통합.

새로운 기능​

CLI 명령어: cafe edge​

  • cafe edge install — systemd 서비스 자동 등록 (6단계: 환경검증→바이너리배치→.env→Docker→systemd→시작)
    • --source 옵션: 오프라인 배포 팩 또는 바이너리 디렉토리 지정
    • --path 옵션: 설치 경로 커스텀 (기본: /opt/caffeine/bridge-host)
    • --skip-docker 옵션: 외부 MQTT/Redis 환경 지원
    • --upgrade 옵션: 기존 설치 백업 → 교체 → 재시작
  • cafe edge status — 서비스 상태 + Health endpoint 조회 (running/enabled/memory/lastStarted)
  • cafe edge uninstall — 클린 제거
    • --keep-data 옵션: 오프라인 버퍼 데이터 유지
  • cafe edge logs — journalctl 래핑 (-f, -n 옵션 지원)

Heartbeat + Engine 동적 재연결​

  • 주기적 Heartbeat: 60초 간격으로 Engine 연결 상태 모니터링
  • 자동 재스캔: Heartbeat 3회 연속 실패 시 mDNS 재스캔 자동 트리거
  • 동적 URL 전환: Engine URL 변경 감지 → 즉시 전환 (event-driven)
  • DiscoveredEngineUrl static property: thread-safe 스태틱 상태 관리
  • EngineUrlChanged 이벤트: DefaultDeviceProvisioner 구독 → URL 변경 적용

Health Check 통합​

  • EngineConnectivityHealthCheck: IHealthCheck 구현
    • Healthy: Engine 발견 + 연결 정상
    • Degraded: Engine 발견 + 연결 끊김 (재스캔 중)
    • Unhealthy: Engine 미발견
  • 데이터: engineUrl, isConnected, discoveryMethod (manual/mDNS/none)
  • 엔드포인트: /health, /health/live, /health/ready

systemd Unit File (조건부)​

[Unit]
Description=Caffeine Bridge Host - Edge Gateway
After=docker.service network-online.target # --skip-docker 시 network-online.target만
Requires=docker.service # --skip-docker 시 생략

[Service]
Type=notify
Restart=always
RestartSec=5
WatchdogSec=90
StartLimitIntervalSec=300
StartLimitBurst=5
MemoryMax=512M
CPUQuota=80%
NoNewPrivileges=true
ProtectSystem=strict

.env 환경변수 자동 생성​

Driver__Id=Edge-01
Driver__Type=Simulation
Engine__Url= # 비워두면 mDNS 자동 검색
Mqtt__Host=localhost
Redis__Host=localhost
OfflineBuffer__Enabled=true
OfflineBuffer__MaxSizeMb=512
OfflineBuffer__MessageTtlHours=48

테스트​

  • EdgeServiceTests: 19개 (systemd unit file 생성/보안 설정/리소스 제한/.env 생성/Docker Compose)
  • EngineConnectivityHealthCheckTests: 5개 (3-state 헬스 체크 + discoveryMethod)
  • 전체: 24개 테스트 100% 통과

빌드​

메트릭결과
빌드 오류0 ✅
테스트 실패0 ✅
Match Rate93% (PASS) ✅

파일 변경​

파일유형줄수
src/Caffeine.Cli/Commands/EdgeCommand.csNEW~270
src/Caffeine.Cli/Services/EdgeService.csNEW~310
src/Caffeine.Infrastructure/Discovery/EngineDiscoveryBackgroundService.csMOD+120
src/Caffeine.Bridge.Host/Health/EngineConnectivityHealthCheck.csNEW~42
tests/Caffeine.Cli.Tests/Services/EdgeServiceTests.csNEW~220
tests/Caffeine.Bridge.Host.Tests/Health/EngineConnectivityHealthCheckTests.csNEW~105
기타MOD+10

NOT in Scope (v2 이상)​

  • Admin UI Edge Fleet 페이지
  • macOS launchd 지원
  • mTLS 보안 강화
  • 원격 OTA 업데이트

배포 시나리오​

시나리오복구 흐름
Bridge 크래시systemd Restart=always → 5초 후 자동 재시작 ✅
디바이스 재부팅systemd boot → Docker auto-start → Bridge auto-start ✅
Engine 끊김heartbeat 3회 실패 → mDNS 재스캔 → URL 전환 ✅
네트워크 단절OfflineBuffer 활성화 → 48시간 메시지 보관 ✅

v3.2.0 — AAS Ecosystem (2026-03-26)​

IEC 63278 디지털 트윈 에코시스템 통합. Auto Twin 자동 생성/동기화, Bridge Multi-Driver 아키텍처, PassiveIngest HTTP 수신 드라이버를 포함한다.

주요 기능​

AAS Auto Twin (IEC 63278)​

  • IAutoTwinService: 장비 매니페스트로부터 AAS Shell + Submodels 자동 생성·동기화
  • AutoTwinBackgroundWorker: System.Reactive 기반 이벤트 구독 — 장비 등록/변경/삭제에 실시간 반응
  • EventPublishingEquipmentRepository: Decorator 패턴으로 IRepository<EquipmentManifest> CRUD 시 이벤트 자동 발행
  • AutoTwinOptions: SyncOnStartup (기본 true), AutoDeleteOnRemoval (기본 true)
  • Fluent API: .AddCaffeineAas().AddAutoTwin() 한 줄 등록
  • 시작 시 전체 동기화: 누락된 Twin 생성, 고아 Shell 정리

Bridge Host Multi-Driver 아키텍처​

  • DriverPipeline: (Driver + Scheduler + SharedWriter) 합성체 — Active/Passive 분기
  • DriverPipelineFactory: Options["PipelineType"] 기반 파이프라인 생성
  • IDriverPipelineRegistry: O(1) 드라이버 파이프라인 조회
  • BridgeWorker: N개 이종 드라이버 동시 운영, BoundedChannel(50K, DropOldest)
  • 설정: "Drivers": [...] 배열형 (기존 단수형 하위호환 유지)

PassiveIngest 드라이버​

  • PassiveIngestDriver: HTTP POST로 RS-232/HMI 장비 데이터 수신
  • POST /api/bridge/ingest/{driverId}: 외부 시스템 연동 엔드포인트
  • IngestSecurityMiddleware: Bearer Token + IP Whitelist (CIDR) + Rate Limiting (100 req/s)
  • 헬스 체크: 30초/60초 기준 Healthy → Degraded → Unhealthy

테스트​

  • Auto Twin: 22개 테스트 (AutoTwinService 13, BackgroundWorker 8, Builder 1)
  • EventPublishingEquipmentRepository: 6개 테스트
  • Multi-Driver Pipeline: 18개 테스트
  • PassiveIngest: 24개 테스트

NuGet 패키지​

패키지버전변경
NEXCODE.Caffeine.AAS3.2.0Auto Twin + EventPublishingEquipmentRepository
NEXCODE.Caffeine.Aas.Mapping3.2.0ManifestToAasConverter 개선
Caffeine.Bridge.Host3.2.0Multi-Driver + PassiveIngest

마이그레이션​

// 기존: AAS 모듈만 등록
builder.Services.AddCaffeineAas();

// v3.2.0: Auto Twin 활성화
builder.Services.AddCaffeineAas()
.AddAutoTwin(); // 이벤트 기반 자동 트윈 동기화

배포 시스템 개선 (2026-03-27)​

오프라인 배포 팩 시스템과 CLI 배포 명령의 안정성·사용성을 대폭 개선.

배포 프로파일 재설계​

  • app → server (중앙 서버 배포): 이름과 설명 명확화 — Docker 이미지 기반 통합 배포
  • edge (엣지 Docker): Bridge.Host Docker 컨테이너, ENGINE_URL 수동 연결
  • edge-native (엣지 Runtime): Bridge.Host 네이티브 실행, 양방향 mDNS 자동 검색
  • 프로파일을 개발 환경(minimal/standard/full/full+monitoring)과 배포 환경(server/edge/edge-native)으로 명확히 구분

Engine mDNS 광고 + Bridge Engine 자동 검색​

  • IEngineAdvertiser + ZeroconfEngineAdvertiser: Engine이 _caffeine-engine._tcp 서비스를 mDNS로 광고
  • IEngineDiscovery + ZeroconfEngineDiscovery: Bridge.Host가 Engine을 mDNS로 자동 검색
  • EngineDiscoveryBackgroundService: Bridge 시작 시 3회 재시도로 Engine 검색, 발견 시 ENGINE_URL 자동 설정
  • Runtime(네이티브) 실행 시 .env ENGINE_URL 설정 불필요 — mDNS로 자동 연결

publish_pack.sh --runtime 옵션​

  • --runtime linux-x64|linux-arm64|win-x64|osx-arm64 옵션으로 Bridge.Host self-contained 바이너리 팩 포함
  • PublishSingleFile=true로 단일 실행 파일 생성
  • .NET Runtime 설치 없이 Edge PC에서 직접 실행 가능

cafe setup clean 명령 추가​

Docker 컨테이너·볼륨·런타임 데이터를 단계별로 정리하는 안전한 초기화 명령:

  • 현재 상태를 테이블로 표시 후 사용자 확인 (기본값 No)
  • --all 옵션으로 .env 파일 + NuGet 소스까지 완전 초기화

오프라인 팩 안정성 개선​

  • publish_pack.sh macOS bash 3.2 호환성 수정 (declare -A, grep -oP, 변수명+한글 충돌)
  • Docker 이미지 :latest 태그 자동 추가 (버전 태그 + latest 양쪽 포함)
  • .env에 CAFFEINE_VERSION 자동 기록 (팩 버전 ↔ Docker 이미지 태그 자동 일치)
  • macOS ._ 리소스 포크 파일 Docker 이미지 로드에서 자동 제외
  • COPYFILE_DISABLE=1로 tar 생성 시 ._ 파일 포함 방지

Dockerfile 수정​

  • 4개 Dockerfile에 --platform=linux/amd64 추가 (grpc.tools protoc ARM64 SIGSEGV 우회)
  • Engine Dockerfile: Caffeine.AAS.csproj restore 단계 누락 수정
  • Admin Dockerfile: ErrorOnDuplicatePublishOutputFiles=false (appsettings 충돌 해결)
  • Admin Dockerfile: UTF-8 BOM 제거

Demo Live Stage — 고객 시연용 라이브 대시보드 (2026-03-26)​

Caffeine Admin에 Demo Live Stage 대시보드 추가. SignalR 실시간 아키텍처 시각화 + 8단계 가이드 + 4종 시나리오 자동 전환으로 3-PC 분산 환경에서 "제로→라이브 데이터" 10분 시연 가능. 설비 업체(AAS 표준) + 공장 엔지니어(비표준 설비 통합) 양쪽 페르소나 동시 대응.

주요 기능​

Demo Stage 페이지 (/demo-stage)​

  • SVG 아키텍처 맵: 5개 노드(Engine, Edge×2, Bridge×N) + 5개 상태(Loading/Active/Error/Connecting/Inactive)
  • 시나리오 선택 오버레이: 2가지 페르소나 (설비 업체 / 공장 엔지니어)
  • 8단계 가이드: 아키텍처 → Edge 실행 → Bridge 발견 → 장비 등록 → 실시간 모니터링 → AI 분석 → 마무리
  • 실시간 통계: EPS(초당 이벤트) / 장비 수 / 알람 / Bridge 카운트
  • 시나리오 전환: Normal → Overheat → PressureDrop → RandomSpike (1클릭)

DemoStateService (Singleton)​

  • 시나리오 선택 상태 관리 (SelectedCase / CurrentStep / CurrentScenario)
  • 노드 상태 추적 (Nodes: Dict<nodeId, DemoNode>)
  • OnStateChanged 이벤트로 UI 자동 갱신

DemoHub (SignalR)​

  • OnAlarmRaised: 알람 발생 실시간 수신
  • OnIngestionStats: 수집 통계 업데이트
  • OnEquipmentRegistered: 장비 등록 알림
  • 자동 재연결: [0ms, 2s, 5s] 단계적 폴백

SimulatorEngine 4종 시나리오​

  • Normal: 온도 20±10°C, 압력 1000~1020 hPa
  • Overheat: 평균 온도 70°C 이상
  • PressureDrop: 평균 압력 850 hPa 이하
  • RandomSpike: 15% 확률로 50°C 초과 스파이크

파일 및 테스트​

구성파일수
신규DemoStage.razor (398줄)1
DemoStateService.cs (120줄)1
DemoHub.cs (45줄)1
DemoScenarioController.cs (35줄)1
테스트: DemoStateServiceTests9
테스트: ScenarioGenerationTests7
수정NavMenu, Program.cs×2, SimulatorEngine, Dockerfile5

테스트: 16/16 통과 (0 실패)

설계 결정​

  1. ICaffeineEventBus → SignalR 브릿지: gRPC 계약 무변경. Admin-specific 실시간 기능 격리
  2. DemoStateService Singleton: 페이지 재로딩 후에도 상태 유지
  3. MQTT 시나리오 제어: 다중 Edge 시뮬레이터 동시 제어 가능
  4. 네트워크 복원력: WithAutomaticReconnect로 순간 끊김 복구

사용 시나리오​

10분 라이브 시연:

  1. 데모 시작 (Admin /demo-stage)
  2. Case 선택 (설비 업체 / 공장 엔지니어)
  3. Edge 시뮬레이터 Docker 실행
  4. Bridge 자동 발견 (노드 활성화)
  5. 장비 등록/태그 추가
  6. 시나리오 전환 (Overheat) → 알람 실시간 표시
  7. AI 분석 대시보드 이동
  8. 마무리 (모든 노드 활성화 맵 표시)

[Internal] Test Coverage 90%+ Achieved - 2026-03-25​

테스트 커버리지 대규모 개선 완료. 전체 라인 커버리지 95.3% 달성 (목표 90% 초과).

주요 성과​

  • 전체 커버리지: 91.0% → 95.3% (+4.3pp)
  • Core: 99.4%, Admin: 98.2%, Cli: 97.7%, Client: 97.5%
  • Engine: 95.4%, Infrastructure: 91.1% — 모든 어셈블리 90%+ 달성
  • 신규 테스트: 100+ 케이스 추가 (6개 파일+)
  • 빌드: 0 에러, 테스트: 0 실패

버그 수정​

  • LseDriverCoverageTests: InlineData 기대값 오류 수정
  • ProvisioningBackgroundServiceTests: NSubstitute 구문 수정
  • AnsiConsole 전역 상태 오염: 문제 파일 2개 삭제 → SetupCommandTests 15건 연쇄 실패 해결

기술 개선​

  • stale 아티팩트 정리: cobertura.xml 병합 오류 (55.2% 오보) 해결
  • 커버리지 측정 신뢰성: dotnet clean + TestResults 정리 필수화
  • Rx 파이프라인 테스트 패턴: AlarmServiceRxPipelineTests 기준 확립
  • NSubstitute Best Practice: ReceivedWithAnyArgs() + Invocations 검사 패턴 확립

문서​

  • docs/04-report/test-coverage-90.report.md — 완료 보고서 (PDCA Match Rate 95%)
  • CI: dotnet clean 자동화 예정 (다음 스프린트)

[v3.0.5] - 2026-03-24​

NexMind v1.0 피드백(FIR-034) 3건 + AAS 플랫폼 확장 5건 구현입니다.

새로운 기능​

  • REQ-09: IBridgeAdvertiser.UpdateAdvertisementAsync() — FriendlyName, Location 등 런타임 변경 시 TXT 레코드 동적 갱신. Default Interface Method로 하위 호환
  • REQ-10: NetworkComplianceSubmodelProvider — 9번째 AAS SubmodelProvider. INetworkComplianceChecker 진단 결과를 IEC 63278 서브모델로 변환
  • REQ-11: ITagToSubmodelMapper equipmentCategory — Map() 메서드에 equipmentCategory 파라미터 추가 (default null). 장비 카테고리별 다른 ECLASS IRDI 매핑 가능
  • EXP-04: TagDefinition.EquipmentCategory — 도메인 엔티티에 장비 카테고리 필드 추가 (기본값 "General")
  • EXP-05: Bridge Self-Description AAS — IBridgeSelfDescriptionProvider + BridgeSelfDescriptionProvider MVP. Bridge.Host를 IEC 63278 AAS Asset으로 모델링 (BridgeNameplate + NetworkCompliance 2개 서브모델)

버그 수정​

  • EXP-01: ZeroconfBridgeAdvertiser TXT 레코드에 ConfigUiPort/FriendlyName/Location 누락 수정 (REQ-04 후속). status 하드코딩("free") 버그 수정
  • EXP-02: BridgeAdvertiserBackgroundService에서 Configuration의 FriendlyName/ConfigUiPort/Location 미읽기 수정

개선​

  • EXP-03: TagToSubmodelMapper에서 equipmentId를 Qualifiers["sourceEquipment"]에 기록. 카테고리별 복합 키 규칙 조회 지원

[v3.0.4] - 2026-03-24​

NexMind 플랫폼 요구사항 8건 + 프레임워크 확장 7건 구현입니다.

새로운 기능​

  • REQ-01: ServiceRecordSubmodelProvider — AAS 서브모델 8종째 추가. 필드 엔지니어 서비스 방문 기록 (8개 기본 필드 + RAG 인덱싱 지원)
  • REQ-02: EdgeCommunicationMode — OT 보안 통신 방향 제어. UploadOnly/DownloadOnly 모드로 Edge↔Cloud 메시지 필터링
  • REQ-03: AlarmEvent.IsTrainingData — ML 학습 데이터 태깅. IAlarmRepository에 학습 데이터 전용 조회/카운트/플래그 설정 메서드 추가
  • REQ-04: BridgeAdvertisement 확장 — ConfigUiPort, FriendlyName, Location 필드 추가. BridgeInfo.ConfigUiUrl 자동 생성 헬퍼
  • REQ-05: IWritableSemanticIdCatalog — 런타임 설비 카테고리 등록 API. ISP 분리 (읽기/쓰기 인터페이스), ConcurrentDictionary 기반
  • REQ-06: ITenantHierarchy — 계층형 테넌트 인터페이스 (B2B2B). 부모/자식/조상 경로/접근 권한 4개 메서드 + Null Object 패턴
  • REQ-07: IMediaCachePolicy — 오프라인 미디어 캐시 정책 추상화. FrequencyBasedMediaCachePolicy 기본 구현 (빈도 기반 프리로드)
  • REQ-08: ISubmodelWriteHandler — AAS Submodel 역방향 쓰기. AasSubmodelBridge.AddWriteHandler<T>() 체인 패턴

확장​

  • IEdgeCloudTransport default interface methods: SetCommunicationModeAsync, CommunicationModeChanges
  • IAlarmRepository default interface methods: GetTrainingDataAsync, CountTrainingDataAsync, SetTrainingDataFlagAsync
  • SemanticIdCatalogOptions: JSON 파일 기반 커스텀 카테고리 로딩
  • InMemoryTenantHierarchy: 테스트용 계층 테넌트 구현체 (순환 참조 방어 포함)
  • AasBuilder.AddSubmodelProvider<T>(): Fluent API 서브모델 등록
  • SubmodelUpdatedEvent.UpdatedBy: 수정자 추적 프로퍼티

Admin-Engine 서비스 분리​

  • AddCaffeineEngineCore() / AddCaffeineEngineHost() 분리 — Admin에서 Engine 호스트 워커 미실행
  • EngineServiceMode: CAFFEINE_ENGINE_MODE=remote 환경변수로 gRPC 원격 프록시 전환
  • DIO/AIO/VIO 원격 프록시 (RemoteDioService, RemoteAioService, RemoteVioService)
  • IO Write 엔드포인트 Admin 권한 강화 (AuthInterceptor.AdminOnlyEndpoints 3건 추가)

테스트​

  • 신규 단위 테스트 81개 (NexMind REQ 8건 전체 커버)

[v3.0.3] - 2026-03-22​

Edge AAS Platform P1~P3 전체 구현 완료입니다.

새로운 기능​

  • P1: Bridge.Host 자체 설정 Web UI — 설비 벤더가 Engine 없이 독립 운영할 수 있는 Bridge 전용 관리 인터페이스
    • 독립 인증 시스템 (admin/viewer 역할, First-Run Setup Wizard)
    • Minimal API 13개 엔드포인트 (/api/bridge/config, /api/bridge/auth, /api/bridge/audit, /api/bridge/license)
    • SPA 기반 설정 UI: 설비 정보, 드라이버 구성, 태그 CRUD, 라이선스 관리
    • 감사 로그 (Bridge Professional 전용) — 모든 설정 변경·인증 이벤트 기록
  • P2: Admin 설비 구성 4-Step Wizard — 라인 운영자가 Bridge를 단계별로 설정하는 Admin UI 가이드
    • Step 1: Bridge 검색 (mDNS), Step 2: 설비 정보 입력, Step 3: 드라이버 선택, Step 4: 태그 매핑
    • IEngineRegistry Federation 경로 — 단일 Engine에서 멀티 Engine 통합으로 진화 가능한 인터페이스 설계
  • P3: Bridge PKV 라이선스 2-Tier — Bridge Community(무료) / Professional(구독) 독립 라이선스 체계
    • PKV 오프라인 키 기반 검증 (네트워크 불필요)
    • Engine 바인딩 시 Professional 자동 활성화, 언바인딩 시 Community 자동 복귀
    • 라이선스 상태 API (/api/bridge/license) + 활성화 API (/api/bridge/license/activate)
    • 티어별 제한 적용: 태그 수, 드라이버 수, AAS 서브모델 종류, 감사 로그 활성화 여부

테스트​

  • 신규 단위 테스트 57개 (Bridge Config UI + PKV 라이선스 + 4-Step Wizard)

[v3.0.2] - 2026-03-22​

Edge AAS Configuration Platform 아키텍처 설계 및 양면 라이선스 모델 도입입니다.

새로운 기능​

  • 양면 라이선스 모델 — Bridge(설비 벤더) + Engine(라인 운영자) 독립 라이선스 체계
    • Bridge Community: 무료 (태그 50, 드라이버 1)
    • Bridge Professional: 연간 구독 (태그 무제한, 감사 로그, 전체 서브모델)
    • Engine에 Bridge 슬롯 개념 도입 (Community 3대, Professional 20대, Enterprise 무제한)
    • 바인딩 시 Bridge Professional 자동 활성화
  • Edge AAS 아키텍처 PRD — 3-Phase 설계 문서
    • P1: Bridge.Host 자체 설정 Web UI + 독립 인증
    • P2: Engine Admin 설비 구성 Wizard (4-Step)
    • P3: 양면 라이선스 모델 + 문서 업데이트

아키텍처 결정​

  • Hybrid 분리: Bridge = 물리 계층(PLC), Engine = 논리 계층(AAS)
  • Bridge 독립 운영: 설비 벤더가 Engine 없이 자체 인증·설정·모니터링
  • Zone 그룹핑: 단일 Engine + N개 Bridge로 시작, 멀티 Engine Federation 진화 가능
  • IEngineRegistry: 인터페이스만 정의하여 향후 Federation 교체 준비

[v3.0.1] - 2026-03-22​

Bridge Discovery 기능 추가 및 SCADA 컴포넌트 모델링 확장입니다.

새로운 기능​

  • Zero-Config Bridge Discovery — mDNS/DNS-SD 기반 네트워크 자동 검색
    • IBridgeDiscovery — Rx 실시간 스트림 + ScanAsync() 스캔
    • IBridgeAdvertiser — Bridge.Host mDNS 서비스 광고
    • IBridgeBindingRepository — SQLite 기반 바인딩 상태 영속화
    • 값 객체: BridgeInfo, BridgeManifest, BridgeBindingState, BridgeBindingStatus, BridgeAdvertisement
  • Bridge Discovery REST API — Engine 측 /api/discovery/scan|bind|unbind|bindings 엔드포인트
  • Bridge Heartbeat 모니터링 — 30초 간격 자동 헬스 체크
  • Admin Bridge Discovery UI — Blazor 대시보드에서 Bridge 검색·바인딩·해제

개선​

  • AAS 서브모델 선택 UI — 바인딩 시 활성화할 서브모델을 선택 가능
  • 감사 로깅 — Bridge 바인딩/언바인딩 이벤트 감사 추적
  • SCADA 컴포넌트 인터페이스 — IComponent, IIoPart, IAddressMapper, IEquipmentRegistry 추가
  • Core 인터페이스 109개 → 116개 (Discovery 3 + Scada 4 도메인 추가)

테스트​

  • Bridge Discovery E2E 테스트 9개 (Playwright 기반 시뮬레이션 환경)
  • Bridge Discovery 단위 테스트 10개 (Heartbeat 모니터링 포함)

[v3.0.0] - 2026-03-20​

Caffeine V3 — AAS-First IIoT 플랫폼 메이저 릴리스입니다.

Breaking Changes​

  • SemanticId 체계 전환: AasConstants.SemanticIds 제거 → IdtaSemanticIds (IDTA 공식 표준)로 전면 교체
    • 일부 ECLASS IRDI 값 변경 (Temperature, Flow, Voltage, Speed, Humidity)
    • 서브모델 SemanticId: ECLASS IRDI → IDTA Submodel Template URI로 변경
  • 최소 .NET 버전: .NET 10.0 필수

새로운 기능​

  • IEC 63278 AAS(Asset Administration Shell) 통합 — 장비 디지털 트윈의 국제 표준 기반 구조화
    • IAasShell, ISubmodel, ISubmodelElement 핵심 인터페이스
    • ISubmodelProvider 기반 서브모델 빌더 패턴 (Nameplate, TechnicalData, OperationalData, AlarmCondition, MaintenanceHistory, PredictiveMaintenance, AiModelNameplate)
    • ISemanticIdCatalog — 장비 카테고리별 센서→SemanticId 자동 매핑 (Pump, Motor, Compressor, HeatExchanger, Conveyor)
    • ISemanticIdMapper + ChainedSemanticIdMapper — Caffeine 타입 ↔ ECLASS IRDI 양방향 변환
    • IAasProtocolServer — ISP-6 표준 6개 Operation (GetAas, GetAllSubmodels, GetSubmodel, GetSubmodelElements, PutSubmodel, DeleteSubmodel)
  • Caffeine.AAS.Rag — RAG 기반 AAS 서브모델 검색
  • Caffeine.AAS.Claude — Claude AI 연동 AAS 분석
  • Caffeine.ML.Pipeline — ML 파이프라인 관리
  • Caffeine.Predictive — 예측 정비 엔진
  • Caffeine.TypeDb + Caffeine.TypeDb.Client + Caffeine.TypeDb.Sync — TypeDB 지식 그래프 통합

개선​

  • IdtaSemanticIds 상수 클래스에 IDTA 공식 Submodel Template URI + ECLASS IRDI 통합
  • DefaultSemanticIdMapper IDTA 표준 IRDI로 매핑 갱신
  • 전체 어셈블리 버전 3.0.0 통일
  • NuGet 배포 목록에 V3 신규 9개 패키지 추가

Admin UI 완성도 개선​

9개 관리자 페이지의 기능 완성도를 대폭 개선했습니다.

  • 설비 상태 모니터링 (/equipment-status) — 실제 서비스 연동, 검색/상태 필터, 30초 자동 새로고침, 5개 통계 카드, 설비 상세 모달(태그 목록)
  • AI 분석 대시보드 (/iot/ai-dashboard) — ApexCharts 시계열 차트(Line+Scatter), 이중 AI 분석(Spike+ChangePoint), 15초 자동 분석, 4개 통계 카드, 20건 알림 테이블
  • 로보틱스 디바이스 (/robotics) — 디바이스 상세 모달, E-STOP 확인 다이얼로그, 검색 필터 추가
  • 함대 관리 (/robotics/fleet) — 배포 링 생성 다이얼로그(이름+우선순위), 롤아웃 다이얼로그(패키지+버전+체크섬)
  • 안전 감사 로그 (/robotics/audit) — 동적 심각도 매핑, 날짜/위반유형 필터, 4개 통계 카드
  • AAS 관리 (/aas) — 검색/종류 필터, 상세 모달(서브모델 목록), 삭제 확인 다이얼로그, 3개 통계 카드
  • 역할 관리 (/admin/roles) — 역할 생성 다이얼로그, 삭제 확인 다이얼로그, 시스템 역할 보호
  • 사용자 관리 (/admin/users) — 이름/이메일 검색, 역할/상태 필터, 4개 통계 카드
  • 알람 이력 (/alarms/history) — 페이지네이션(50건/페이지), Excel 내보내기, 6개 통계 카드

NuGet 신규 패키지​

패키지설명
NEXCODE.Caffeine.AASIEC 63278 AAS 핵심 모듈
NEXCODE.Caffeine.Aas.MappingAAS ↔ Caffeine 매핑
NEXCODE.Caffeine.AAS.RagRAG 기반 AAS 검색
NEXCODE.Caffeine.AAS.ClaudeClaude AI AAS 분석
NEXCODE.Caffeine.ML.PipelineML 파이프라인
NEXCODE.Caffeine.Predictive예측 정비
NEXCODE.Caffeine.TypeDbTypeDB 통합
NEXCODE.Caffeine.TypeDb.ClientTypeDB 클라이언트
NEXCODE.Caffeine.TypeDb.SyncTypeDB 동기화

마이그레이션​

V2에서 V3로의 마이그레이션은 마이그레이션 가이드를 참조하세요.


[v2.1.8] - 2026-03-16​

커버리지 90%+ 달성 릴리스입니다.

개선​

  • CI 임계값 상향: 80% → 90% (per-assembly 기준)
  • 어셈블리별 커버리지: AI(95.9%), Admin(90.1%), Bridge.Host(92.4%), Cli(97.3%), Drivers.Mitsubishi(100%), Drivers.Omron(100%), Engine(91.4%), Identity(92.8%), Infrastructure(90.8%)

테스트​

  • 전체 3,595개 통과, 9 skip, 0 실패

[v2.1.7] - 2026-03-16​

APNs / FCM 푸시 알림 채널 추가 릴리스입니다.

새로운 기능​

  • FIR-031: ApnsNotificationChannel — P8 ECDSA ES256 JWT 기반 Apple Push Notification Service 채널 (Caffeine.Infrastructure)
    • P8 파일 기반 ES256 JWT 서명, HTTP/2 전용 전송
    • JWT 50분 캐시 (만료 60분 기준 여유 보정)
    • NotificationChannelType.Apns = 9 추가
  • FIR-032: FcmNotificationChannel — Google Service Account JSON → RS256 JWT → OAuth2 기반 Firebase Cloud Messaging 채널 (Caffeine.Infrastructure)
    • SA JSON 파일에서 RS256 JWT 생성 후 OAuth2 액세스 토큰 교환
    • 토큰 55분 캐시 (만료 60분 기준 여유 보정)
    • NotificationChannelType.Fcm = 8 추가
  • FIR-032: Polly 통합 — AddResilientFcm(), AddResilientApns() 확장 메서드 추가, 파이프라인 11→13개
  • FIR-032: 심각도 라우팅 업데이트:
    • Critical → 7채널 (Email + Teams + SMS + TTS + SignalR + FCM + APNs)
    • Error → 6채널 (Teams + Kakao + Telegram + SignalR + FCM + APNs)

기각​

  • FIR-033: ML.NET SSA ONNX 변환 — ML.NET이 SSA(Singular Spectrum Analysis) 모델의 ONNX 내보내기를 미지원하므로 기각. Framework 책임 범위 밖으로 판단

테스트​

  • 신규 16개 (FCM 7 + APNs 9), 전체 4,651개 통과

[v2.1.6] - 2026-03-15​

IAlarmRepository, IAnomalyDetectionService Graceful Degradation 릴리스 — Infrastructure 미등록 시 No-op 기본 구현체로 안전하게 폴백합니다.

버그 수정​

  • FIR-029: IAlarmRepository Null Object 기본 등록 — IAlarmRepository가 미등록된 환경에서 ML 서비스 DI 해소가 실패하던 문제 수정 (Caffeine.Infrastructure)
    • IAlarmRepository No-op 기본 구현체 추가 — Graceful Degradation 지원
    • Infrastructure 초기화 시 기본 구현체 자동 등록 (실제 구현체로 자연스럽게 대체 가능)
  • FIR-030: IAnomalyDetectionService Null Object 기본 등록 — Infrastructure 단독 사용 시 IAnomalyDetectionService DI 실패하던 문제 수정 (Caffeine.Infrastructure)
    • IAnomalyDetectionService No-op 기본 구현체 추가
    • Engine 구성 시 SSA 기반 실제 구현체로 자동 대체

테스트​

  • IAlarmRepository Null Object 테스트 8개, IAnomalyDetectionService Null Object 테스트 7개 추가 — 전체 테스트 통과

[v2.1.5] - 2026-03-15​

Azure Speech SDK MAUI 통합 — IVoiceInputService STT 추상화 릴리스입니다.

새로운 기능​

  • FIR-028: IVoiceInputService — Azure Speech SDK MAUI 음성 입력 추상화 — IIoT 현장 핸즈프리/장갑 착용 환경을 위한 양방향 음성 I/O 완성 (Caffeine.Presentation)
    • IVoiceInputService 인터페이스: RecognizeOnceAsync, EnsureMicrophonePermissionAsync, IsAvailable
    • VoiceRecognitionResult sealed record: IsSuccess, Text, ErrorMessage, Confidence, Locale, Success()/Failure() 팩토리
    • NoOpVoiceInputService 폴백 구현 (Caffeine.Presentation) — 비 MAUI 환경(테스트, SSR) 대응
    • MauiVoiceInputService Azure Speech SDK 구현 (Caffeine.Presentation.Maui)
    • VoiceInputOptions 설정 클래스: SpeechKey, SpeechRegion, DefaultLocale, Validate()
    • MicrophonePermissionHandler MAUI 퍼미션 래퍼
    • MauiVoiceExtensions.AddCaffeineMauiVoice() DI 확장 메서드 (useFallback 파라미터 지원)
    • TtsNotificationChannel(음성 출력)과 함께 양방향 음성 I/O 완성

테스트​

  • VoiceRecognitionResultTests 6개, NoOpVoiceInputServiceTests 6개 추가

[v2.1.4] - 2026-03-15​

TypeDB Graceful Degradation + 센서 메타데이터 레지스트리 + MAUI 토큰 저장소 추상화 릴리스입니다. NuGet 배포완료.

새로운 기능​

  • FIR-025: TypeDB Graceful Degradation — TypeDB 미연결 상태에서도 시스템이 정상 동작하도록 Graceful Degradation 구현 (Caffeine.Infrastructure)
    • TypeDbRealClient Polly Circuit Breaker 연동 강화 — 연결 실패 시 No-op 폴백으로 전환
    • 연결 상태 Observable 스트림(IObservable<TypeDbConnectionState>) 제공
  • FIR-027: ISensorRegistry — 센서 메타데이터 CRUD — 센서 정보를 런타임에 등록·조회·삭제하는 레지스트리 추상화 (Caffeine.Core)
    • ISensorRegistry 인터페이스: RegisterAsync, GetAsync, GetAllAsync, UnregisterAsync
    • SensorInfo 값 객체: SensorId, Name, Unit, MinValue, MaxValue, Tags
    • InMemorySensorRegistry 구현체 (Caffeine.Infrastructure), AddCaffeineInfrastructure() 자동 등록
  • FIR-026: ITokenStorage — MAUI 토큰 저장소 추상화 — JWT 토큰 안전 저장을 위한 플랫폼 추상화 (Caffeine.Presentation)
    • ITokenStorage 인터페이스: SaveTokenAsync, GetTokenAsync, ClearTokenAsync
    • InMemoryTokenStorage 기본 구현 (Caffeine.Presentation)
    • SecureStorageTokenStorage MAUI 구현 (Caffeine.Presentation.Maui — IsPackable=false)
    • MauiAuthExtensions.AddMauiTokenStorage() DI 확장 메서드

테스트​

  • 전체 테스트 통과

[v2.1.3] - 2026-03-14​

알림 채널 4개 확장 + 다변량 이상 탐지 추가 릴리스입니다. NuGet 배포완료.

새로운 기능​

  • FIR-021: 알림 채널 4개 확장 — NotificationChannel enum에 Kakao=4, Sms=5, Tts=6, Telegram=7 추가
    • KakaoNotificationChannel, SmsNotificationChannel, TtsNotificationChannel, TelegramNotificationChannel 구현체 추가 (Caffeine.Infrastructure)
    • AddCaffeineResilience() Resilience 파이프라인 4개 추가: "kakao", "sms", "tts", "telegram" (Retry 2 + Timeout 10s)
    • AddCaffeineInfrastructure() DI Singleton 등록 자동화
  • FIR-022: 심각도별 알림 라우팅 정책 — AlertSeverity에 따라 채널 자동 선택
    • Critical → Email + Teams + SMS + TTS + SignalR
    • Error → Teams + Kakao + Telegram + SignalR
    • Warning/Info → SignalR only
  • FIR-023: 다변량 이상 탐지 — IAnomalyDetectionService.DetectMultivariateAnomalyAsync() 추가
    • MultivariateAnomalyResult DTO 추가 (Caffeine.Core.Abstractions.AI)
    • AnomalyDetectionService 구현 (Caffeine.Engine)

테스트​

  • 전체 테스트 통과

[v2.1.2] - 2026-03-10​

Caffeine.Robotics 패치 릴리스 — Safety 네임스페이스 충돌 해소, 연결 계층 추상화 강화.

새로운 기능​

  • FIR-019: IRoboticsSafetyPolicyEngine 도입 — Core ISafetyPolicyEngine 상속 + ValidateCommandAsync(DeviceCommand) 추가
    • SafetyEvaluationResult를 Core 단일 소스(Caffeine.Core.Abstractions.Safety)로 통합, Robotics 중복 제거
    • 하위호환 별칭 ISafetyPolicyEngine (Robotics 네임스페이스) 유지
    • DI 이중 등록 패턴: IRoboticsSafetyPolicyEngine + Core.ISafetyPolicyEngine 동시 등록
  • FIR-020: DeviceTransportBridgeBase 추상 Base 클래스 도입 — 보일러플레이트 제거 및 확장 포인트 표준화
    • 4개 virtual 확장 포인트: BuildTelemetryTopic, BuildStatusTopic, BuildCommandTopicFilter, SerializeTelemetry
    • DeviceTransportBridge가 Base 상속으로 리팩토링

테스트​

  • 전체 테스트 4,698개 통과

[v2.1.1] - 2026-03-10​

Caffeine.Infrastructure 패치 릴리스 — Polly 업그레이드, FIR-017/018 DI 버그 수정.

버그 수정​

  • FIR-017: IZoneManager / IZoneMonitor DI 등록 누락 수정
    • InMemoryZoneManager (11개 메서드 구현), InMemoryZoneMonitor (Subject 기반 Observable 스트림) 신규 구현
    • AddCaffeineInfrastructure() 내부에 Singleton 등록 추가
  • FIR-018: InMemoryUserSeedService Captive Dependency 수정
    • Singleton 서비스가 Scoped UserManager<ApplicationUser> 직접 주입받던 구조를 IServiceScopeFactory 패턴으로 교체

의존성 업그레이드​

  • Polly.Extensions 8.4.2 → 8.6.6

테스트​

  • 전체 테스트 4,634개 통과

[v2.1.0] - 2026-03-08​

Resilience DI 표준화, 라이선스 검증 전용 API, Testing 패키지 공개 배포, Mermaid 다이어그램 개선 릴리스입니다.

개선 사항​

  • Mermaid 다이어그램 뷰어 개선 — 기본 프레임 최소 높이 300px 적용, 전체화면 진입/종료 시 줌 자동 리셋, 전체화면에서 줌/이동이 확장된 프레임 전체를 대상으로 동작하도록 수정

새로운 기능​

  • FIR-013: Resilience DI 표준화 — AddCaffeineResilience() 내부 구현을 AddKeyedSingleton 방식에서 AddResiliencePipeline (표준 Polly.Extensions 패턴) 으로 전환. ResiliencePipelineProvider<string> DI 등록으로 표준 Polly 사용 방식 지원. Polly.Extensions 8.4.2
  • FIR-014: AddCaffeineLicenseVerification() 신규 DI 확장 메서드 — 검증 전용 DI 등록 (ILicenseService + IHardwareInfo). DefaultHardwareInfo 크로스 플랫폼 폴백(Windows/Linux/macOS) 지원. 라이선스 생성·서명 기능은 포함하지 않음 (보안 정책)
  • FIR-015: NEXCODE.Caffeine.Testing NuGet.org 공개 배포 — 드라이버 테스트 하네스 패키지 공식 배포 개시. 18개 → 19개 NuGet 패키지

품질​

  • 전체 테스트 4,579개 통과 (0 실패)
  • 신규 테스트 8개 추가 (ResilienceExtensions, LicenseVerification)

[v2.0.9] - 2026-03-06​

Caffeine Framework의 첫 NuGet.org 공식 릴리스입니다. NuGet 패키지명 NEXCODE 리브랜딩, 커버리지 개선, CI 안정성 수정이 포함됩니다.

변경 사항​

  • NuGet 패키지명 NEXCODE 리브랜딩 — 모든 패키지명 NEXCODE.Caffeine.* 통일 (docs 반영)
  • 개별 어셈블리 커버리지 80%+ 달성 — CI 측정 버그 수정 및 ExcludeFromCodeCoverage 적용
  • CI ubuntu SIGBUS(exit 135) 크래시 수정 — TypeDB P/Invoke RID 조건부 참조 적용

[v2.0.8] - 2026-03-03​

라이선스 정책 문서화, Community 에디션 기본값 동기화, Licensing 보안 재설계 릴리스입니다.

보안 개선​

  • Caffeine.Licensing NuGet 배포 중단 (IsPackable=false) — 라이선스 생성 코드(PkvKeyGenerator, LicenseGenerator)의 외부 노출 차단. NuGet을 통해 누구나 라이선스를 발급할 수 있던 보안 취약점 해소
  • PKV 검증 타입 Caffeine.Core.Licensing으로 이동 — PkvKeyVerifier, KeyByteSet을 내부 전용 어셈블리에서 Core 네임스페이스로 분리하여 검증(Verification)과 생성(Generation) 책임 명확히 분리

새로운 기능​

  • 토큰 자동 영속화 (FileBasedLicenseTokenStore) — 업로드 성공 시 로컬 디스크 자동 저장, 서버 재시작 시 자동 로드 (Windows: %LocalApplicationData%/Caffeine/license.jwt, Linux: ~/.local/share/Caffeine/license.jwt)
  • appsettings.json Licensing 섹션 — PublicKeyXml(RSA 공개키), TokenStorePath(저장 경로 오버라이드) 설정 지원
  • AddCaffeineLicensing(IConfiguration) DI 확장 메서드 — IConfiguration 기반 설정 주입으로 단순화된 서비스 등록
  • cafe-license 내부 전용 CLI (Caffeine.Licensing.Cli, IsPackable=false) — RSA 키 쌍 생성(generate-keys), JWT 토큰 발급(issue), 검증(verify), HWID 조회(hwid) 서브커맨드 제공

NuGet 패키지 변경​

  • Caffeine.Licensing 패키지 배포 목록에서 제거 — 내부 전용(IsPackable=false)으로 전환. v2.0.9 기준 19개 배포 패키지 → 18개

문서​

라이선스 문서 신규 추가 (docs/licensing/)​

  • pricing.md: 에디션별 가격 정책, 경쟁사 대비 장점, Community/Professional/Enterprise 상세
  • guide.md: JWT + HWID 이중 바인딩 동작 원리, 활성화 Mermaid 플로우차트, Admin UI 사용법, 토큰 영속화 설명, 서버 설정 가이드, Safe Mode 설명
  • feature-comparison.md: 데이터 수집·저장·통신·AI·로보틱스·보안 전 영역 기능 비교 매트릭스, Feature Flag 목록, 드라이버별 라이선스 요구사항
  • trial.md: 30일 무료 Trial 시작 절차, 기간 확인, 만료 후 동작, 정식 전환 절차
  • troubleshooting.md: HWID 불일치, Safe Mode 복구, 토큰 업로드 실패, 에러 코드 레퍼런스

기존 문서 개선​

  • introduction/overview.md: 라이선스 비교·가격·가이드 링크 3곳 추가
  • api/license.md: 정책 안내 박스 + 기능 비교표 링크 추가 + POST /upload 토큰 영속화 노트 추가
  • reference/faq.md: Q3 실제 3-tier 모델로 전면 수정, 라이선스 FAQ 5개 추가 (Trial·업그레이드·HWID·SafeMode·Community 기능)

버그 수정​

  • LicenseModels.cs: Community 기본값 API 문서와 동기화 (MaxTags 500→100, MaxDrivers 1→2)

[v2.0.7] - 2026-03-02​

Caffeine CLI (cafe) 배포 위자드 및 원격 Docker Context 지원이 추가된 릴리스입니다.

새로운 기능​

cafe setup 대화형 배포 위자드 (Setup Distribution Phase 2)​

  • 원클릭 배포: cafe setup 한 줄로 Docker 환경 구성 완료
  • 5개 프로파일 시스템: minimal / standard / full / full+monitoring / app
  • 사전 검증: Docker 설치, 데몬 실행, Compose v2 자동 확인
  • 포트 충돌 감지: 선택한 프로파일 포트 사용 현황 자동 감지
  • .env 자동 생성: RandomNumberGenerator 기반 암호학적 안전 시크릿 자동 생성
  • EmbeddedResource 배포 파일: cafe setup extract로 docker-compose.yml 추출
  • 서브커맨드: status, down, extract (--list, --profile, --force, --output)

원격 Docker Context (SSH) 지원 (2D-04)​

  • --remote ssh://user@host: 원격 서버에 직접 배포
  • Docker Context 자동 생성: SSH URL에서 context 이름 자동 유도
  • .caffeine-context 영속화: 배포 후 context 저장, status/down에서 재사용
  • SSH 연결 검증: 배포 전 원격 Docker 데몬 연결 자동 확인

Production 보안 강화​

  • --mode production: 6개 보안 항목 자동 검증
    • .env 파일 존재 확인
    • JWT Secret 강도 검사 (44자 이상)
    • 기본 비밀번호 탐지 (admin123, changeme 등)
    • CAFFEINE_ENV=production 설정 확인
    • TLS 인증서 존재 확인
    • Docker 데몬 실행 확인
  • docker-compose.prod.yml: 리소스 제한, 로그 로테이션, 재시작 정책 오버레이

인프라 표준화 (Setup Distribution Phase 1)​

  • 통합 docker-compose.yml: 5개 프로파일 통합 관리
  • .env.example: 안전한 환경 변수 템플릿 제공
  • NEXCODE.Caffeine.Cli v0.9.0 NuGet 패키지: dotnet tool install -g NEXCODE.Caffeine.Cli

테스트 커버리지​

  • 90.4% line-rate (CI 임계값 80% 초과)
  • 총 409개 테스트 통과, 0 실패
  • 신규 테스트 +36개 (DockerContextService, 원격 배포 시나리오)

[v2.0.6] - 2026-03-02​

내부 개발 빌드 릴리스입니다.

포함된 패키지 (19개)​

⚠️ v2.0.8 변경: Caffeine.Licensing이 내부 전용(IsPackable=false)으로 전환되어 배포 목록에서 제거되었습니다. v2.0.8부터 18개 패키지가 배포됩니다.

패키지설명
NEXCODE.Caffeine.Core핵심 인터페이스, 엔티티, 값 객체
NEXCODE.Caffeine.ClientgRPC/SignalR 클라이언트 SDK
NEXCODE.Caffeine.IdentityASP.NET Core Identity + JWT 인증
NEXCODE.Caffeine.InfrastructureInfluxDB, Redis, SQLite 어댑터
NEXCODE.Caffeine.IPCgRPC/Protobuf 계약
NEXCODE.Caffeine.AIONNX/ML.NET 예측 정비
NEXCODE.Caffeine.GeneratorsRoslyn Source Generator
NEXCODE.Caffeine.PresentationWeb API/gRPC/SignalR 진입점
NEXCODE.Caffeine.Simulation시뮬레이션 엔진
NEXCODE.Caffeine.UIBlazor Blueprint 공유 UI
NEXCODE.Caffeine.Robotics.Abstractions로보틱스 추상화
NEXCODE.Caffeine.Testing테스트 유틸리티
NEXCODE.Caffeine.Drivers.Simulation시뮬레이션 드라이버
NEXCODE.Caffeine.Drivers.ModbusTcpModbus TCP 드라이버
NEXCODE.Caffeine.Drivers.ModbusRtuModbus RTU 드라이버
NEXCODE.Caffeine.Drivers.SecsGemSECS/GEM 반도체 드라이버
NEXCODE.Caffeine.Drivers.LseLSE 드라이버
NEXCODE.Caffeine.Drivers.MitsubishiMitsubishi PLC 드라이버
NEXCODE.Caffeine.Drivers.OmronOmron PLC 드라이버
NEXCODE.Caffeine.Licensing라이선스 검증/발급 (v2.0.8부터 내부 전용)

주요 기능​

  • .NET 10 기반 IIoT 엣지 플랫폼
  • Reactive Programming (System.Reactive) 기반 실시간 데이터 파이프라인
  • 플러그인 아키텍처 드라이버 시스템 (Modbus, SECS/GEM, PLC)
  • gRPC + SignalR 이중 통신
  • MQTT/Kafka 엣지-클라우드 전송
  • ASP.NET Core Identity + JWT RBAC 인증
  • InfluxDB 시계열 + Redis 캐시 + SQLite 로컬 스토리지
  • ONNX Runtime 예측 정비
  • Blazor Server + Blazor Blueprint 관제 대시보드
  • OpenTelemetry 관측성

📊 버전 정책​

Semantic Versioning​

Caffeine은 Semantic Versioning 2.0.0을 따릅니다.

형식: MAJOR.MINOR.PATCH

  • MAJOR: Breaking changes (호환성 깨짐)
  • MINOR: 새로운 기능 추가 (하위 호환)
  • PATCH: 버그 수정 (하위 호환)

예제:

  • 2.0.6 → 2.0.7: 버그 수정
  • 2.0.7 → 2.1.0: 새 기능 추가
  • 2.1.0 → 3.0.0: Breaking changes

LTS (Long-Term Support)​

버전릴리스 날짜일반 지원 종료LTS 종료
3.x2026-03-202027-03-202029-03-20
2.x2026-03-022027-03-022029-03-02

지원 정책:

  • 일반 지원: 버그 수정, 보안 패치, 새 기능
  • LTS: 버그 수정, 중요 보안 패치만

📝 알려진 문제​

Version 2.0.0​

문제 1: SignalR 재연결 지연​

  • 설명: 네트워크 끊김 후 재연결에 최대 30초 소요
  • 임시 해결책: HubOptions.HandshakeTimeout 조정
  • 수정 예정: 2.0.7

문제 2: InfluxDB 배치 쓰기 메모리 누수​

  • 설명: 대량 데이터 쓰기 시 메모리 증가
  • 임시 해결책: 배치 크기를 500개로 제한
  • 수정 예정: 2.0.7

📞 문의​

버전 관련 질문이나 문제가 있으시면:


최종 업데이트: 2026-04-17