feat: complete legacy parity and modernize operator UI
This commit is contained in:
@@ -2,11 +2,23 @@
|
||||
|
||||
기준일: 2026-07-12
|
||||
|
||||
> 2026-07-22 현행 `LegacyParityApp` 보충 판정: 아래 2026-07-12의 `1,603/610`은 당시
|
||||
> raw 행에서 current typed selection을 fresh하게 증명한 역사적 수치이며, DB 재생목록
|
||||
> 자체의 로드 성공/실패 수치가 아니다. 최신 operator 호환 감사에서는 활성 정의 23개와
|
||||
> 2,213행을 모두 로드했고(`wholeListRejected=0`), 2,213행 모두 기존 scene alias로
|
||||
> 식별됐다. 최신 실제 DB compatibility projection은 GraphE 36행을 36/36 복원해 현재
|
||||
> `1,617 복원 / 596 보류`다. 직전 개발 패키지에서도 `DB 불러오기 → 첫 목록 선택 →
|
||||
> 불러오기`를 실제 마우스로 실행해 58행, 팝업 0, scene 미식별 0을 확인했다. 다만 이
|
||||
> 감사는 각 행의 asset·Tornado2 PREPARE/PGM 성공까지 주장하지 않는다
|
||||
> (`playoutPreflightAsserted=false`). 최신 코드 포함 AppX 물리 재검증은 별도 대기 중이다.
|
||||
|
||||
원본(읽기 전용): `C:\Users\MD\source\repos\MBN_STOCK_N\MBN_STOCK_N\Form\PList.cs`
|
||||
감사 구현:
|
||||
[LegacyPListReadAuditParser](../src/MBN_STOCK_WEBVIEW.Core/Data/LegacyPListReadAudit.cs),
|
||||
[NamedPlaylistReadOnlyDbAudit](../tools/MBN_STOCK_WEBVIEW.DbSmoke/NamedPlaylistReadOnlyDbAudit.cs),
|
||||
[NamedManualRestoreReadOnlyAudit](../tools/MBN_STOCK_WEBVIEW.DbSmoke/NamedManualRestoreReadOnlyAudit.cs)
|
||||
[NamedManualRestoreReadOnlyAudit](../tools/MBN_STOCK_WEBVIEW.DbSmoke/NamedManualRestoreReadOnlyAudit.cs),
|
||||
[LegacyManualFinancialStorageCompatibility](../src/MBN_STOCK_WEBVIEW.Core/Playout/Scenes/LegacyManualFinancialStorageCompatibility.cs),
|
||||
[NamedPlaylistOperatorCompatibilityAudit](../tools/MBN_STOCK_WEBVIEW.DbSmoke/NamedPlaylistOperatorCompatibilityAudit.cs)
|
||||
|
||||
## 원본 읽기 의미
|
||||
|
||||
@@ -29,7 +41,40 @@
|
||||
감사 오류와 정상 출력에는 `DC_TITLE`, `LIST_TEXT`, 종목명, 테마명, 프로그램
|
||||
코드 또는 인증정보를 포함하지 않는다.
|
||||
|
||||
## 실제 Oracle/MariaDB 결과
|
||||
## 2026-07-22 현행 fresh-selection 재감사 결과
|
||||
|
||||
최신 실제 Oracle/MariaDB smoke는 원본 저장 의미와 current typed projection을 다시 대조했다.
|
||||
숫자 token의 선후행 공백·TAB, 분기명 후행 TAB 및 모든 필드가 완전히 같은 중복 DB행은 원본과
|
||||
같은 값으로 수용한다. 내부 제어문자와 서로 충돌하는 중복행은 계속 거부한다. 이 경계로 과거
|
||||
보류됐던 GraphE 14행까지 모두 fresh materialization됐으며 임의 종목·장면 추정은 없다.
|
||||
|
||||
| 항목 | 현재 결과 |
|
||||
|---|---:|
|
||||
| 활성 `DC_LIST` 정의 | 23 |
|
||||
| 연결된 `PLAY_LIST` 행 / 로드 / scene alias 식별 | 2,213 / 2,213 / 2,213 |
|
||||
| whole-list reject | 0 |
|
||||
| fresh typed selection 복원 | 1,617 |
|
||||
| fresh selection 보류 | 596 |
|
||||
| 이름 기반 GraphE fresh materialization | 36/36 |
|
||||
|
||||
| route | 전체 | current 복원 | 보류 |
|
||||
|---|---:|---:|---:|
|
||||
| 기존 닫힌 매퍼 | 1,250 | 1,250 | 0 |
|
||||
| 업종 fixed 닫힌 매퍼 | 24 | 24 | 0 |
|
||||
| 비교 fresh identity | 99 | 74 | 25 |
|
||||
| 해외지수 candle fresh identity | 61 | 61 | 0 |
|
||||
| NXT theme fresh identity | 48 | 0 | 48 |
|
||||
| KRX theme fresh identity | 587 | 94 | 493 |
|
||||
| 해외종목 fresh identity | 78 | 78 | 0 |
|
||||
| GraphE fresh materialization | 36 | 36 | 0 |
|
||||
| unique closed mapper 없음 | 30 | 0 | 30 |
|
||||
| 합계 | **2,213** | **1,617** | **596** |
|
||||
|
||||
현재 596행의 보류 원인은 KRX 테마 493행, NXT 테마 48행, 비교 시장 identity 유실 25행,
|
||||
unique closed mapper 없음 30행뿐이다. 이 수치는 목록 로드 실패가 아니며, current selection을
|
||||
하나로 증명하지 못한 행을 nearest scene으로 추정하지 않았다는 뜻이다.
|
||||
|
||||
## 2026-07-12 역사적 fresh-selection 감사 결과
|
||||
|
||||
실제 운영 연결에 고정 SQL과 bind 변수로 `SELECT`만 실행했다. DB write,
|
||||
Tornado2 명령과 원본 저장소 변경은 수행하지 않았다.
|
||||
@@ -81,18 +126,18 @@ PREPARE 성공과 Tornado2/PGM 출력은 포함하지 않으며 각각 별도 ga
|
||||
|
||||
기본 감사 수치 1,581은 기존 닫힌 매퍼 1,250행, 업종 fixed 24행, 비교
|
||||
74행, 해외지수 candle 61행, KRX theme 94행 및 해외종목 78행의 합이다.
|
||||
GraphE 22행은 별도 fresh proof의 성공분이다. 현재 PList의 manual 36행은 모두
|
||||
GraphE 22행은 별도 fresh proof의 성공분이다. 해당 회차 PList의 manual 36행은 모두
|
||||
GraphE이고 FSell/VI 저장 행은 0건이다.
|
||||
|
||||
기존 fixed 매퍼는 임의 문자열 허용으로 판정하지 않았다. 원본 runtime
|
||||
`해외.ini`·`환율.ini`·`지수.ini`를 각각 현재 Web 계약에 고정된 SHA-256으로
|
||||
검증하고, 원본 `MainForm`과 같이 각 줄을 trim한 뒤 현재
|
||||
`fixedLegacySignature`의 exact 5필드 규칙으로 변환했다. 원본 328 action에서
|
||||
현재 명시적으로 unavailable인 수동 6개를 제외하고, 같은 raw 서명으로 겹치는
|
||||
`fixedLegacySignature`의 exact 5필드 규칙으로 변환했다. 원본 INI의 328 source action에서
|
||||
당시 runtime action으로 실체가 없는 수동 placeholder 6개를 제외하고, 같은 raw 서명으로 겹치는
|
||||
후보는 unique로 인정하지 않았다. 이 exact whitelist와 일치하지 않은 30행은
|
||||
가까운 `s5001` 등을 추정하지 않고 차단했다.
|
||||
|
||||
### fresh restore 결과와 차단 사유
|
||||
### 당시 fresh restore 결과와 차단 사유
|
||||
|
||||
| 사유 | 행 | 의미 |
|
||||
|---|---:|---|
|
||||
@@ -113,7 +158,7 @@ KRX theme 587행 중 94행은 제목 exact lookup, 현재 code 및 validated pre
|
||||
매핑했다. 두 경로 모두 timeout/불명확 응답을 재시도하지 않으며 raw 이름·code를
|
||||
감사 출력에 기록하지 않는다.
|
||||
|
||||
GraphE 36행의 별도 감사는 같은 identity를 두 번 읽어 64자리 row version이
|
||||
당시 GraphE 36행의 별도 감사는 같은 identity를 두 번 읽어 64자리 row version이
|
||||
변하지 않는지 확인하고 현재 종목 master의 유일한 identity와 cut 계약을 함께
|
||||
검증했다. 22행만 materialize했고 저장값 무효 9행과 identity 중복 5행은 첫 후보를
|
||||
고르지 않고 차단했다. 상세 경계는
|
||||
@@ -124,6 +169,11 @@ FSell/VI는 현재 PList 후보가 0행이지만 운영 production source를 ope
|
||||
version도 같았다. 네 운영 파일의 이름·크기·시각·SHA-256은 감사 전후 동일했고
|
||||
import marker/intent를 만들거나 파일을 쓰지 않았다.
|
||||
|
||||
2026-07-22 현재 `%LOCALAPPDATA%\MBN_STOCK_WEBVIEW\OperatorData`의 `개인`, `외국인`,
|
||||
`기관`, `VI발동` 4파일은 authoritative 원본 `bin\Debug\Data` 파일과 각각 length 및
|
||||
SHA-256이 정확히 같다. 따라서 이 수동 파일은 미이관 또는 unavailable이 아니라 현재 앱에서
|
||||
사용 가능한 로컬 운영 데이터다. 원본과 로컬 파일 모두 이 감사에서 수정하지 않았다.
|
||||
|
||||
## 구현과 자동 근거
|
||||
|
||||
- KRX theme:
|
||||
@@ -173,6 +223,7 @@ dotnet run --project .\tools\MBN_STOCK_WEBVIEW.DbSmoke\MBN_STOCK_WEBVIEW.DbSmoke
|
||||
correlation, GraphE double-read row-version·identity 중복 fail-closed
|
||||
- exact stock label과 nearest-label 거부, 알 수 없는 행의 `Unmapped` fail-closed
|
||||
|
||||
실제 기본 감사, 별도 manual fresh 감사와 전체 DB smoke는
|
||||
`REAL_DB_SMOKE: PASS`로 끝났다. DB write와 Tornado2/PGM 명령은 0건이며 raw 값이나
|
||||
인증정보도 출력하지 않았다.
|
||||
실제 기본 감사, 별도 manual fresh 감사와 전체 DB smoke는 `REAL_DB_SMOKE: PASS`로
|
||||
끝났다. 2026-07-22 최신 전체 DB smoke도 PASS이며 current 결과는 GraphE 7,726/50,
|
||||
named playlist 1,617/596, GraphE fresh 36/36이다. DB write와 Tornado2/PGM 명령은
|
||||
0건이며 raw 값이나 인증정보도 출력하지 않았다.
|
||||
|
||||
Reference in New Issue
Block a user