이송 배관으로 묶인 두 컬럼(C-9111↔C-10111)을 하나의 envelope로 보는 통합 물질수지.
한쪽 feed≈0(인출/이송)인 연계운전일엔 단독 폐합이 수학적으로 N/A지만, 양 컬럼의
외부 feed 합 / 최종 출력 합으로 보면 닫힌다. 내부 이송 스트림은 어느 컬럼 계량에도
안 잡혀(비계량) envelope에서 자동 상쇄.
- Report:Transfer로 파트너 해석(없으면 미정의 → 단독컬럼엔 error). C-9111↔C-10111만 설정.
- cleaning 마스크 미적용(연계 시 feed≈0이 정상 → drawdown 마스크 쓰면 전구간 제외).
- summary는 TransferPartner 있는 컬럼에만 추가, 웹에 통합 폐합 신뢰블록, 토큰 치트시트.
검증(2026-05-15 C-9111): IN 23,975.9 / OUT 23,923.8 / 폐합 99.78% (수동검증 일치).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
DetectMode가 펌프 livevalue를 IN ('1','5','L-RUN','R-RUN')로 정확일치 비교했으나,
realtime_table은 디지털 상태점을 '{5 | R-RUN | }' 포맷으로 저장(FormatValue) →
절대 매칭 안 됨 → pumpRunning 항상 false → 펌프 설정된 컬럼은 가동 중에도 무조건
'미가동(idle)'으로 오판정(카드 state·알람 진실원 오류).
LIKE '%RUN%'로 RUN 라벨 부분일치(TRIP/FAULT/STOP은 RUN 미포함→정지). 구 bare 값도 허용.
라이브 검증: C-6111 펌프 가동수 0→2 → 정상(normal) 판정 복구.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
응급 수동 보정(FIQ-*.QV를 addr=0/realtime=false로 keep 분류)은 이제 불필요.
빌더가 AnalogPoint 보조슬롯에서 FIQ-*.QV를 실제 주소·realtime=TRUE·archive=TRUE로
생성하므로 map 재빌드/--db-conn 적용 시 자동 분류·폴링된다. 이력 보존용으로만 유지.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
운영 사고 재발 방지:
- realtime_table.id가 SERIAL(int4)이라 매 poll의 nextval 소비로 2^31 도달 →
전체 realtime 업서트가 'reached maximum value of sequence'로 정지(현장에서 14h
무갱신 발생, bigint ALTER로 라이브 복구 완료). 신규 배포: CREATE를 BIGSERIAL로,
기존 배포: 기동 시 멱등 마이그레이션(integer일 때만 bigint+시퀀스 ALTER).
- gateway-config: HCX(IP·맵 없는 플레이스홀더)가 enabled=true라 50055 연결거부
로그 양산 → enabled=false.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
이전(PR#5)은 비루프 AnalogPoint에만, 또 realtime=False로 보조를 넣어 적산 QV가
크롤러 폴링집합(is_active AND realtime_enabled)에서 빠져 라이브로 흐르지 않았다.
- is_analog 판정을 분기 앞으로 올려 모든 AnalogPoint(루프 포함)에 보조 처리 적용.
루프 엔트리와 겹치면 seen_tags가 중복 흡수.
- 슬롯명 있는 A1~A4를 일반적으로 모두 어드레싱(공백 슬롯만 제외).
- realtime 기본값(True) 사용 → 보조도 폴링 대상. QV=연속 누적값만 archive 유지.
- FlexibleParameter(사용자정의)는 기존대로 realtime=False(폴링 제외) 유지.
맵 재생성(c1~c4): 순수 추가. C3 +6(FICQ-8118/LICA-5113 GAIN/RATE/RESET 등 루프
보조 누락분), 리포트 스팀적산 FIQ-*.QV 전부 포함, 제거 0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
PR #5(빌더 보조 QV 처리)로 재생성. AnalogPoint 보조슬롯의 적산 QV가 실제 주소로
포함됨 → 게이트웨이 재시작 시 라이브 적산 폴링, archive=true.
순수 추가(제거 0): .QV 다수 + 일부 RST/한계값(기존 빌더 드리프트 반영).
리포트 의존 스팀적산 FIQ-6115/6215/8115(C3)·9115/9215/10115/10215(C4) 모두 포함.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
FIQ 류 적산기는 QV(적산)가 FlexibleParameter가 아니라 AnalogPoint 보조슬롯
(AuxiliaryNameA{n}=QV ↔ SourceAddressA{n})에 노출된다. 빌더는 FlexibleParameter
에서만 .QV를 만들어 FICQ-*.QV는 잡았지만 FIQ-*.QV(스팀 적산 등)를 전부 놓쳤다.
→ 리포트(energy_intensity_qv 등)가 의존하는 태그가 register-map/map_master에서
누락되어 archive 기준 '삭제대상'으로 오분류, 라이브 폴링도 안 됐음.
AnalogPoint else 분기에 보조 A1~A4 처리 추가: 이름 있는 보조슬롯을 실제
SourceAddress로 해석해 {item}.{AuxName} 엔트리 생성, QV=연속 누적값→archive=TRUE.
realtime=False(기존 .QV/FlexibleParameter와 동일 정책).
검증(dry build): C3 FIQ-6115/6215/8115.QV, C4 FIQ-9115/9215/10115/10215.QV 등이
실제 주소(8390 등)·archive=true로 생성. 커밋맵 대비 순수 추가(제거 0).
→ map 재빌드 시 keep 분류 자동 유지 + 라이브 적산 폴링 가능.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
AddDbContextFactory(싱글톤)가 Scoped DbContextOptions를 소비해 Development의
ValidateOnBuild에서 기동 크래시. optionsLifetime=Singleton으로 옵션을 공유
(불변 설정이라 동작 무변경; DbContext 자체는 Scoped 유지). EF Core 권장 패턴.
Development 재기동으로 검증.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- IReportTemplateStore.ListRunsAsync/GetRunBlobAsync (+ ReportRunInfo DTO).
- GET /api/report/template/{id}/runs (최신순), GET /api/report/run/{runId}/download.
- UI: 선택 템플릿 '생성 이력' expander — 기간/소스/상태/시각 + 과거본 다운로드 링크.
스케줄 자동생성본도 여기서 회수(기존엔 생성·기록만 되고 조회 불가).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- report_template에 schedule_enabled/period/hour/source 컬럼(ALTER IF NOT EXISTS,
p0_report.sql + 서비스 EnsureSchema 멱등).
- Hc900ReportScheduleService: 매 N초 활성 템플릿마다 완료된 기간(anchor)을
lookback 내 산출 → report_run 성공기록 없으면 FillAsync 생성·기록.
중복 0(HasSuccessfulRun dedup)·다운타임 자동복구. 윈도는 셀 토큰 period=가 결정.
- IReportTemplateStore.UpdateSchedule/HasSuccessfulRun, ListAsync에 스케줄 컬럼.
- PUT /api/report/template/{id}/schedule (period/hour 검증).
- UI: 목록에 스케줄 상태 표시 + 선택 템플릿 스케줄 편집기.
- appsettings Report:Schedule (간격·catchup) 추가.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- IReportTemplateStore.ListAsync(생성이력 집계 LEFT JOIN)/DeleteAsync(report_run CASCADE).
- GET /api/report/templates, DELETE /api/report/template/{id}.
- 엑셀폼 패널: 매번 재업로드 → 등록(1회) → 저장 목록에서 라디오 선택 → 생성.
생성횟수·최근시각 표시, 삭제 버튼, 생성 후 목록 자동 갱신.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- MetricRequest/Result에 Period 추가, ReportMetricService.PeriodWindowUtc로
선택일이 속한 일/월/연 [from,to)를 KST→UTC 변환(DAILY는 기존 동작 동일).
- 오타 period는 daily 묵인 대신 명시적 error(결정론 게이트).
- ReportFillService 토큰 period= 파싱 + 셀주석/cells_json 박제.
- summary 엔드포인트 period 파라미터, 웹 바로보기 기간 드롭다운 + 치트시트.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 디바운스: 알람 조건이 AlertDebounceSec(기본 60s) 연속 유지돼야 발화(인메모리 후보 추적).
flapping(임계 빈번교차) 억제. 조건 해제 시 후보 리셋.
- 스파크라인: 카드마다 민감단 온도(TC) 최근 60분 미니 SVG 트렌드.
GET /api/report/sparks (history_1s 다운샘플, 순수 SQL — Timescale 함수 미사용으로
search_path=hc900 무관). ReportColumnMap.TcTag.
검증: /sparks 200(C-6111 31점 79.5~81.7℃), 디바운스가 데모 sim flapping 정확히 억제
(70초 후 알람 0 — 지속조건 아님). 실데이터의 지속 drawdown은 60s 후 발화.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
온라인 히스토리안 1계층 — 디스크 상한 고정 1초 버퍼.
- history_1s Timescale 하이퍼테이블(1h 청크) + 압축(6h) + 보존 14일(청크DROP, 디스크 상한 고정).
- Hc900FastHistoryService: 매 1초 realtime_table 큐레이션 태그 → history_1s append.
기동 시 스키마/정책 멱등 생성. Hc900HistoryService(60s) 패턴.
- ReportColumnMap.HistorianTags(): 메트릭/마스크가 읽는 태그를 기존 config에서 유도(~105개,
중복정의 없음) — 유량 .PV/.QV, 진공, 민감단 TC, 하부루프 .PV/.SP/.OP.
- Report:Historian config(Enabled/IntervalSeconds/RetentionDays).
검증: 라이브 초당 ~38행 append, 샘플 간격 ~1.004s, 보존/압축 정책 활성.
주의(데모): realtime 폴링이 areas 61/62/81만 커버 → 1s 버퍼도 해당 컬럼만(배포 시 전 컨트롤러).
1s 버퍼 주 가치는 .PV/.OP 동특성; .QV 적산은 60s로도 정확.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
P0 결정론 메트릭(마스크·적산·리셋)의 온라인 확장 스펙. 핵심: 로직이 causal이라
온라인 결과(T) ≡ 배치(시작~T), 로직 변경 없이 스트리밍 가능.
- A. history_1s 1초 링버퍼: Timescale 하이퍼테이블 + 보존정책(14일, 청크DROP) + 압축.
디스크 = 태그수×윈도×행크기로 상한 고정. 큐레이션 태그(~200) 1초 append.
- B. history_1min 연속집계: evict 전 롤업(집계lag ≪ 보존윈도) → 무손실 장기보존. 2계층.
- C. Hc900LiveKpiService 온라인 누적기: 러닝 상태로 P0와 동일 마스크/양증분/리셋,
live_kpi 적재, 인과성 동치검증, 버퍼 리플레이 복구.
- D. kpi_alert 실시간 알람: cleaning/drawdown 진입·폐합 베이스라인 이탈(계량드리프트/이송)·생산정지.
큐레이션 태그셋·P0 연계(source 추가)·단계(P1a~d)·수용기준 포함. MVP 문서에 링크.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 작업지시서-API-필드-PascalCase-통일.md: PascalCase 통일 작업 지시서.
- 논의-AI운전원-제어-아이디어.md: AI 운전원 제어 아이디어 논의 메모.
- ControlEdge HC900 IO Modules Specifications.pdf: RTD/AI 모듈 스펙(레인지·정확도)
데이터시트 — PT100 양자화 분석 근거 자료.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- gateway-config.json: HCX 컨트롤러 슬롯(grpcPort 50055) 추가.
- plant_context.md: active_alarms/find_tags/query_events 등 sub_area 인자 전달
방식 설명을 prose로 정리.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Fix vLLM base URL from port 8001 to 8000 (server.py)
- Replace TimeScaleDB first()/last() with array_agg(ORDER BY) for standard PostgreSQL compatibility (TextToSqlService.cs)
- Unify all backend response fields to PascalCase (TextToSqlController.cs)
- Update frontend to match PascalCase response fields (t2s.js)
- Change T2S date inputs to calendar popup (same as hist.html) (t2s.html)
- Fix evt.js date parsing: empty string causes Invalid Date error (evt.js)
Point Builder, SteamAdvisor, Feedforward 제어, MCP RAG/NL2SQL,
multi-controller 지원 등 28커밋 분량 기능 통합.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 전체 태그 목록 체크박스 + 버튼을 realtime_table 기준으로 전환
· + 실시간 추가: 선택 태그만 is_active+realtime_enabled 켜고 realtime_table 직접 등록(즉시 라이브)
· - 실시간 제거: realtime_enabled 끄고 realtime_table 행 직접 삭제
· full-Sync 미사용(전체 추가 사고 방지) → 선택 id만 insert/delete
· 신규 API: POST /api/pointbuilder/realtime-add, realtime-remove
· 레거시 pbBulkActivate(is_active만 토글) 제거
- 미리보기 ✕ 닫기 버튼 추가(설정 화면 복귀)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>