dsh-manage-session 0.3.3 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.ko.md CHANGED
@@ -1,189 +1,242 @@
1
- # 변경 이력
2
-
3
- ## 0.1.0-alpha.6
4
-
5
- ### 수정 — 아이콘과 레이블 간격 축소, 좁은 사이드바에서 이웃을 밀어내지 않음
6
-
7
- - **간격 8px → 4px**: 🧭 와 「세션 스튜어드」 사이를 실측에 따라 좁혔습니다(사용자 피드백
8
- 「icon 과 글자 간격을 작게」). 아울러 자체 좌우 패딩을 `0 12px 0 10px` →
9
- `0 10px 0 8px` 로 맞춰 옆의 「검색」 필과 동일하게 했습니다.
10
- - **스스로 줄어듭니다**: `.dss_entryWrap` 을 `flex:none` → `flex:0 1 auto; min-width:0` 으로 바꾸고
11
- 바깥 왼쪽 여백을 `8px → 6px`. 이전에는 전혀 양보하지 않아 부족분이 전부 검색 필에 얹혔고,
12
- 상대 레이블을 한 글자로 만들었습니다. 이제는 부족분을 스스로 떠안습니다(레이블은 말줄임표로 끝맺음).
13
- - **레일 치수는 28×28 로 복귀**: 레일 내용 상자는 36px 뿐이라(56px 레일 − 좌우 10px)
14
- 36×36 컨트롤 두 개는 들어가지 않습니다(실측 36+28=64px, 14px 넘침).
15
- 28+28=56px 로 하여 변경 전의 32+28=60px 보다 좁혔습니다.
16
- - **협조 경계는 그대로**: 오직 자체 CSS 만 바꾸고, 검색 인덱스의 값을 참조하지 않으며,
17
- 설치 여부도 가정하지 않습니다.
18
-
19
- ## 0.1.0-alpha.5
20
-
21
- ### 변경 — 사이드바 진입점에 레이블 추가, 「검색 인덱스」와 같은 행에서 조화
22
-
23
- - **진입점에 이름이 생겼습니다**: 하단 진입점은 28x28 아이콘 원형 버튼(🧭)뿐이어서 무엇인지 알 수 없었습니다.
24
- 넓은 사이드바에서는 42px 행 컨트롤 **🧭 세션 스튜어드**가 되어, 옆의 「검색」 필과 같은 높이 ·
25
- 같은 모서리 반경(12px) · 같은 글자 크기를 씁니다.
26
- - **같은 행의 지오메트리 협조**: 검색 진입점이 `flex:1;min-width:0`을 선언해 행 전체를 차지하지 않게 되어,
27
- 두 진입점은 `sidebar.footer.action`의 형제 요소로 같은 행에 놓입니다. 이 진입점은 넓은 모드에서
28
- `margin-left:8px`로 간격을 만듭니다(공식 `ui-settings-general`의 `.triggerRow{gap:8px}`에 대응).
29
- 상대 플러그인의 존재를 알지도, 값을 참조하지도 않습니다 — 협조는 각자의 CSS 안에서만 일어납니다.
30
- - **레일 표시로의 축소**: `wide=false`에서는 `.dss_footerEntryRail`(36x36 원, 레이블 없음)이 되어
31
- Figma 레일 규격(56px 레일 / 10px 패딩 / 36x36 컨트롤)과 공식 레일 컨트롤에 맞춥니다.
32
- 레이블은 넓은 모드에서만 나타납니다.
33
- - **문구 소유권 수정**: 컴포넌트에 하드코딩된 `'会话管家'` 폴백을 제거하고, 진입점 레이블을
34
- 패널 제목과 같은 출처(사전 `panel.title`)로 옮겼습니다.
35
-
36
- ## 0.1.0-alpha.4
37
-
38
- 설정 카드에 서랍(드로어) 형태를 복원: 이전에는 맨 행만 있어 「플러그인」 설정 섹션의 다른 플러그인과 일치하지 않았다.
39
-
40
- ### 수정
41
-
42
- - **설정 카드에 드로어 외피가 없음(중요)**: DSH 의 「플러그인」 설정 섹션
43
- (`dsh-client-ui-settings-plugins`)이 하는 일은 단 하나——settings 네임스페이스별로
44
- `settings.plugin.item` 을 배포하는 것:
45
-
46
- renderSlot('settings.plugin.item', {}, { entryKey: ns })
47
-
48
- 외피는 **전혀 제공되지 않는다**. 카드의 제목·설명·펼침/접힘은 모두 플러그인 자신의 소유다.
49
- 이 플러그인은 맨 행만 렌더링했기 때문에 두 가지가 어긋났다:
50
- 1. 섹션 안 다른 플러그인의 「접이식 드로어」와 형태가 맞지 않음;
51
- 2. `card.title`(세션 스튜어드)과 `card.desc`(이력 파일 · 상태 점검)가
52
- **정의만 되고 한 번도 렌더링되지 않는** 죽은 문구가 됨——이것이 「빠진 드로어 항목」.
53
-
54
- 이제 헤더(제목 + 설명 + chevron, 블록 전체 클릭 가능)를 복원하고
55
- 본문은 기본적으로 접힌다(같은 섹션의 다른 카드와 동일). `aria-expanded` 는 펼침 상태를 반영한다.
56
- - **설정 서비스를 쓸 수 없을 때의 동작**: 이전에는 카드 전체가 「설정 서비스를 사용할 수 없음」 한 줄로
57
- 퇴화하며 **제목까지 사라졌다**. 이제는 드로어 헤더를 정상적으로 렌더링하고
58
- 사유는 본문에만 표시한다——이 플러그인이 섹션에서 완전히 사라지지 않는다.
59
-
60
- ### 변경
61
-
62
- - 펼침 전환과 chevron 회전은 `prefers-reduced-motion` 을 따른다.
63
-
64
- ## 0.1.0-alpha.3
65
-
66
- 상태 점검 결과 캐시: 패널을 닫았다 열면 지연 없이 내용이 나오고, 처치 후에는 그 행만 갱신된다.
67
-
68
- ### 추가
69
-
70
- - **상태 점검 결과 캐시(프로세스 내)**: 한 번의 완전 스캔(분할로 말뭉치를 끝까지 도는 것) 결과를
71
- 호스트 프로세스에 보관하고, 패널을 다시 열면 캐시를 그대로 렌더링한다(전량 재스캔 없음).
72
- 캐시는 **말뭉치를 한 바퀴 다 돌았을 때만** 성립한다——중간에 패널을 닫아도
73
- 반쪽 결과가 완전한 결론인 척하지 않는다.
74
- - **`resume` 은 순수 읽기**: `session-health-scan` 에 `resume: true` 를 추가. **캐시만 읽고 스캔하지 않는다**.
75
- 패널은 마운트 시 이것으로 한 번만 무비용 탐색하고, 적중하면 내용을 내고 빗나가면 아무것도 하지 않는다
76
- (마운트 즉시 중작업은 이전 버전에서 지적된 지점). 동시에 현재 말뭉치 총수를 돌려준다.
77
- - **생성 시각과 갱신 입구**: 적중 시 「결과는 캐시 · N분 전」을 표시하고 「새로 고침」을 제공한다
78
- (강제 전량 재스캔). 오래된 결과가 방금 스캔한 척하지 않는다.
79
- - **말뭉치 변화 알림**: 캐시 시점의 말뭉치 총수와 현재가 다르면
80
- 「말뭉치가 변했습니다(a → b). 새로 고침을 권장」을 표시. 이 대조는 디렉터리 열거만 하므로 저렴하다
81
- ——따라서 캐시 무효화 전략 자체가 되지는 않는다.
82
-
83
- ### 변경
84
-
85
- - **단건 되쓰기**: 단일 세션 상태 점검과 가역 처치 후에는 재스캔에 의존하지 않는다——
86
- 처치는 이미 `after` 를 재계산하므로 그것을 그대로 캐시에 되쓴다.
87
- 패널이 목록으로 돌아왔을 때 그 행은 이미 최신 단계다
88
- (회복된 행은 사라진다. 「문제만 나열」과 일치).
89
- - 캐시는 **디스크에 쓰지 않는다**: DSH 재시작 시 무효. 영속화에는 무효화 전략이 필요하고,
90
- 무효 판정 비용(말뭉치 열거, 로그 mtime/size 대조)은 재스캔 자체에 가깝다. 이번 슬라이스는 YAGNI.
91
-
92
- ### 테스트
93
-
94
- - `tests/cache.spec.ts` 신규 추가(19건): 성립 규칙(미완주 / 완주 / 빈 말뭉치 / 중도 중단 / `clear`),
95
- 단건 되쓰기의 모든 분기(추가 / 교체 / 회복으로 제거 / no-op), 그리고 `handleMethod` 배선
96
- (`resume` 은 스캔하지 않음, 분할 완주 후 적중, `onlyProblems=false` 는 캐시를 오염시키지 않음,
97
- 처치 후 되쓰기의 객체 동일성, cache 없는 런타임에서도 동작).
98
-
99
- ## 0.1.0-alpha.2
100
-
101
- 처치(처방)의 판정과 표시 수정: 「판정 불가」 게이트에 처방하지 않고, 처치 후의 결론을 명시한다.
102
-
103
- ### 수정
104
-
105
- - **`skipped` 에 대한 오처방(중요)**: `prescribe()` 는 기존에 `level !== 'ok'` 로 프로젝션 캐시
106
- 격리 여부를 판단했기 때문에, 「이 게이트는 판정 불가」도 「프로젝션 캐시 미정합」으로 간주되어
107
- 자신의 근거와 모순되는 처방을 내고 **존재하지 않는** 기록의 격리를 제안했다.
108
- 공유 술어 `isActionable()`(`warn` / `fail` 만 처치 가능)을 추출해 일원화했다.
109
- `gates.ts` 의 단계 기준과 `repair.ts` 의 처치 기준이 이제 같은 의미가 된다.
110
- - **「사문 전록」 오탐**: 처치 항목이 없을 때 고정으로 「사문 전록(四門全綠)」을 표시했다.
111
- 게이트가 `skipped`(판정 불가이며 녹색이 아님)일 때 이 문구는 성립하지 않는다.
112
- 「처치 항목 없음(N 게이트 판정 불가, 이상 아님): <게이트 id 목록>」으로 변경했다.
113
- - **처치 후에도 이상으로 표시되어 처치가 효과가 있었는지 알 수 없음**: 패널은 「처치 전 / 처치 후」의
114
- 단계만 렌더링했기 때문에 둘 다 이상일 때 「처치 실패」와 「처치가 병소와 무관」을 구분할 수 없었다.
115
- 호스트에 `assessRepair({ before, after, repair })` 를 추가해 5단계 중 하나와 사람용 설명을 반환한다:
116
- `nothing-to-do`(사문 전록) / `repaired`(회복) / `repaired-with-residual`(캐시는 격리했으나
117
- 캐시와 무관한 이상이 잔존, 예: 세션 로그의 open step) /
118
- `not-applicable`(현재 이상에 가역 처치 항목이 없음) / `failed`(처치 자체의 실패).
119
- 패널은 단계별 배색으로 결론 배너를 렌더링한다.
120
-
121
- ### 설명
122
-
123
- - **처치 능력은 불변**: 「프로젝션 캐시 기록의 격리만, 복사 후 이동, 세션 로그는 개서하지 않음」.
124
- 이번에는 **판정**과 **표시**만 수정했다. 대표적 사례는 「`cold-read` 만 이상
125
- (세션에 미결제 open step 이 있음)」——이는 본래 이 플러그인이 복구할 대상이 아니며,
126
- 이제는 `not-applicable` 로 명시하고 사유를 설명한다. 조용히 「처치 후에도 이상」으로
127
- 표시하지 않는다.
128
-
129
- ### 테스트
130
-
131
- - `tests/repair.spec.ts` 신규 추가(12건): `isActionable` 의 네 단계, `prescribe` 가 빈 처방을 내지
132
- 않음, `assessRepair` 5단계 판정의 분기를 커버.
133
-
134
- ## 0.1.0-alpha.1
135
-
136
- 상태 점검 패널의 판정과 피드백 수정: 「주의」 전량 오탐을 해소하고 스캔 진행률과 행 내 사유를 추가.
137
-
138
- ### 수정
139
-
140
- - **「주의」 전량 오탐(중요)**: `lossless-json` / `projection-cache` / `cold-read` 세 게이트가
141
- **판정 불가**일 때(콜드 세션에 핫 프로젝션이 없음, 캐시 기록 미생성, 로그에 turn/end 없음)
142
- `warn` 을 반환하여 **로드되지 않은 모든 세션이 항상 「주의」** 가 되고 실제 신호가 노이즈에
143
- 묻혔다. 중립 단계 `skipped`(패널 표기는 「미점검」)를 추가하여 「관측 불가」를 담당하게 하고
144
- **총합 판정에 기여하지 않게** 했다.
145
- 고정한 기준: `warn` = 이상 현상을 관측(근거 있음) / `skipped` = 관측·판정 불가(근거 없음).
146
- 실측: 30개 세션이 「30×주의」 → 「26 정상 / 3 주의 / 1 이상」.
147
- - **목록 행에 사유 미표시**: 결과 목록이 총합 단계만 렌더링해 행끼리 구분되지 않았다.
148
- 비정상(non-ok) 「게이트·단계」 요약(예 `연결성·주의`)을 행 안에 표시하여 개별로 열 필요를 없앴다.
149
-
150
- ### 추가
151
-
152
- - **스캔 진행률**: `session-health-scan` 이 `offset` 분할 호출을 지원하고 `total` 을 반환한다.
153
- 패널은 소배치로 연속 호출해 **실제 진행률**(`n/total · 경과 Xs`)을 자체 누적한다.
154
- 분모를 아직 받지 못한 첫 회차는 불확정 애니메이션. 호스트는 무상태를 유지하며
155
- 동기 루프를 비동기로 바꿀 필요가 없다.
156
- - **처치 비지 표시**: 가역 처치 버튼에 스피너를 추가하고 비활성 상태를 유지.
157
-
158
- ### 변경
159
-
160
- - **탭 이름 변경**: `病案室` → `養老院`(영어 `Records Room` → `Retirement Home`).
161
- 「상태 점검 / 처방 / 퇴원」 메타포와 통일.
162
-
163
- ## 0.1.0-alpha.0
164
-
165
- 첫 번째 alpha 버전: 세션 스튜어드(히스토리 파일 + 상태 점검).
166
-
167
- ### 추가
168
-
169
- - **세션 히스토리 파일(기록 보관소)**: `dsh-session-search-toggle`에서 공식 아카이브 집합의 읽기 및 정리 구현을 이관했으며,
170
- 동작은 이관 전과 동등합니다(백업 + 동일 디렉터리 임시 쓰기 + 원자적 교체; 명시적 편집 모드에서만 정리 허용).
171
- 차이점: 목록 출처가 **공식 아카이브 집합 진값**으로 변경되었습니다(registry 우선, 스토리지 파일 폴백). 독립 인덱스가 검색 인덱스 패키지와 함께 떠났기 때문입니다;
172
- 제목 등 메타데이터는 최선 노력 방식입니다(`sessionQuery` 제목 스냅샷 → 프로젝션 캐시 title → 비어 있음).
173
- - **상태 점검(점검 → 처방 → 퇴원)**: 독립적으로 테스트 가능한 네 개의 gate
174
- (`log-integrity` / `projection-cache` / `lossless-json` / `cold-read`),
175
- 통일된 출력 `{ id, level, evidence, attribution, detail }`; `SessionHealthReport`로 집계됩니다.
176
- - **귀속 인덱스**: 프로필의 `node_modules/<pkg>/lib/*.js`를 정적 스캔하여 「프로젝션 key → 패키지 이름」을 구축하고,
177
- 실패한 gate를 구체적인 플러그인과 필드 경로로 되돌려 지목합니다; 찾지 못하면 사실대로 `unknown`으로 표기합니다.
178
- - **되돌릴 수 있는 처방**: 손상된 프로젝션 캐시 레코드 격리(먼저 복사 백업, 그다음 `.quarantine-<ts>`로 이동) + 명령 목록.
179
- 세션 로그 재작성, 히스토리 데이터 변경, 필드 무단 삭제는 **금지**합니다.
180
- - **두 개의 feature gate**: `historyFiles` / `healthCheck`, 꺼지면 해당 하위 도메인 전체가 등록되지 않고(명시적 disabled 오류),
181
- 클라이언트도 해당 탭을 렌더링하지 않습니다.
182
- - **라우트**: `/session-steward/api/*`, 메서드 이름은 일괄 `session-*`이며, 검색 인덱스의 `/switch-search/api`의 `index-*`와 완전히 격리됩니다.
183
-
184
- ### 알려진 제한
185
-
186
- - `lossless-json` gate는 호스트가 `sessionProjections`(핫 상태)를 노출해야 확정 판정을 내릴 수 있습니다;
187
- 얻지 못하면 사실대로 `warn`으로 강등하며, 추측하지 않습니다.
188
- - 상태 스캔은 기본적으로 최근 30개의 비정상 세션만 나열하며(`limit` 상한 200), 전체 라이브러리 순회를 기본 동작으로 삼지 않습니다.
189
- - 클라이언트 패널은 최소 구현(목록 + 상세 + 3단계 버튼)이며, 가상 스크롤과 일괄 작업은 구현하지 않았습니다.
1
+ # 변경 이력
2
+
3
+ - [Changelog](./CHANGELOG.md)
4
+ - [日本語 changelog](./CHANGELOG.ja.md)
5
+ - [한국어 changelog](./CHANGELOG.ko.md)
6
+ - [Français changelog](./CHANGELOG.fr.md)
7
+ - [Deutsch changelog](./CHANGELOG.de.md)
8
+ - [Italiano changelog](./CHANGELOG.it.md)
9
+ - [Русский changelog](./CHANGELOG.ru.md)
10
+ - [Español changelog](./CHANGELOG.es.md)
11
+
12
+ ## 0.5.1 —— 사이드바 footer 행간 압축 및 중앙 정렬 강제 (서드파티 항목 보정 포함)
13
+
14
+ - **컨테이너 행**: `sidebar.footer.action` 규약 업데이트 — `justify-content:center` 로 행 내 모든 항목(서드파티 포함)을 중앙 정렬하고, `row-gap` 2px → 0.
15
+ - **본 플러그인 항목**: 버튼 높이 42px → 32px (상하 여백 10px → 5px), 좌우 padding 대칭화 `0 10px` (행 중앙 정렬 시 1px 시각적 편향 해소). footer 두 행의 총 높이 86px → 64px. 접힌 레일 형태는 변경 없음.
16
+ - **서드파티 보정**: dsh-context "컨텍스트 인사이트"(`.lc-ov-entry`, 행 독점 설계·좌측 정렬)를 `!important` 로 규약에 강제 정렬: 한 행 독점·중앙 정렬·32px. `:not(.lc-ov-entry-rail)` 로 레일 형태의 36px 원형 버튼은 제외. 클래스명은 하드코딩으로 버전 간 안정 (0.56.1 / 0.60.0 검증).
17
+ ## 0.5.0
18
+
19
+ ### 대응 —— DSH 0.2.0 라인(compat/0.2.0 브랜치, 메타데이터만 변경 · 코드 수정 없음)
20
+
21
+ - **호스트 세대교체**: peer 5항(dsh-client-locale / dsh-client-ui-settings / dsh-client-ui-settings-general /
22
+ dsh-client-ui-slots / dsh-session)과 `engines.dsh` 2곳(package.json + dsh.plugin.json)을
23
+ `>=0.2.0-rc.1 <0.2.1-0`으로 통일. npm dist-tag은 `dsh-0.2.0`.
24
+ - **제로 코드 입증**: `dsh-session-format-v3-to-v4@0.2.0-rc.1`의 퍼스트파티 목록 2장(5+25항)은 본 저장소의
25
+ 전사본과 완전 일치. `dsh-session@0.2.0-rc.1` 익스포트는 `decodeSeqRanges` 유지, `decodeStorageRecord`는
26
+ 0.1.7-rc.2와 0.2.0-rc.1 모두 미익스포트(소프트로드 가드가 옵션면으로 처리, 양 라인 동작 동일).
27
+ 아카이브 배치 계약(`session.jsonl.zstd`/`session.v3.jsonl.zstd`, `storages/session_projcache`,
28
+ `workspace.json`의 두 id 목록)도 불변 검증.
29
+ - **devDependencies**: `dsh-client-ui-slots` / `dsh-session` 캐럿 제거 후 `0.2.0-rc.1`로 정확히 고정.
30
+ - **의존성 트리 갱신**: node_modules와 package-lock.json 삭제 후 재생성. 낡은 pnpm-lock.yaml /
31
+ pnpm-workspace.yaml 삭제, npm 라인으로 일원화.
32
+ - **버전과 릴리스 규율**: 0.4.8 → **0.5.0**. dsh.plugin.json version 0.4.1 → 0.5.0(드리프트 해소).
33
+ `publishConfig.tag` → `dsh-0.2.0`. `release:015`를 `release:020`으로 개명(`--tag dsh-0.2.0`).
34
+ 2개 국어 description의 「0.1.5 전용선」 문구 갱신.
35
+ - 검증: install / build / typecheck / test 전부 통과(167 테스트), `npm ls` peer 충돌 없음,
36
+ node_modules 실장 dsh-session / dsh-client-ui-slots 모두 0.2.0-rc.1.
37
+
38
+ ## 0.4.8
39
+
40
+ ### 수정 —— ST1:변환이 제1자 프로듀서명에서 호스트와 불일치
41
+
42
+ - `migrateSessionSourceKind`는 행마다 `isFirstPartyLegacyProducer`를 조회(호스트
43
+ `dsh-session-format-v3-to-v4@0.1.7-rc.2` lib/index.js:51-84의 두 표를 그대로 수록,
44
+ 실측 5+25=**30**명). 해당 행은 건너뛰고 `skippedFirstParty`로 정직하게 보고——
45
+ 제1자명은 호스트의 개명표/동명 kind(role 민감 분기 포함)으로 처리되므로 무조건
46
+ 접두사를 붙이면 호스트가 생성하지 않는 kind를 기록해 귀속이 조용히 손상됩니다.
47
+ 제1자 구형 행만 있는 로그는 기록하지 않음. 30명 대조 테스트와 호스트 공식
48
+ 디코더 재독 단언 추가(161 테스트 전부 통과).
49
+
50
+ ### 강화 —— R2:purge 측 서명 변환 백업 인식
51
+
52
+ - 통계와 정리 양 경로에서 `*.pre-sourcemigrate-<ts>` 백업을 인식: 통계는 행마다
53
+ `backupBytes`/`backupCount` 추가(`bytes`의 부분집합, 단열로 오독 방지),
54
+ 정리 결과에 `backupsRemoved` 추가. 회귀 6건 추가, 전체 167 테스트.
55
+
56
+ ## 0.1.0-alpha.6
57
+
58
+ ### 수정 — 아이콘과 레이블 간격 축소, 좁은 사이드바에서 이웃을 밀어내지 않음
59
+
60
+ - **간격 8px → 4px**: 🧭 와 「세션 스튜어드」 사이를 실측에 따라 좁혔습니다(사용자 피드백
61
+ 「icon 과 글자 간격을 작게」). 아울러 자체 좌우 패딩을 `0 12px 0 10px` →
62
+ `0 10px 0 8px` 로 맞춰 옆의 「검색」 필과 동일하게 했습니다.
63
+ - **스스로 줄어듭니다**: `.dss_entryWrap` 을 `flex:none` → `flex:0 1 auto; min-width:0` 으로 바꾸고
64
+ 바깥 왼쪽 여백을 `8px → 6px`. 이전에는 전혀 양보하지 않아 부족분이 전부 검색 필에 얹혔고,
65
+ 상대 레이블을 한 글자로 만들었습니다. 이제는 부족분을 스스로 떠안습니다(레이블은 말줄임표로 끝맺음).
66
+ - **레일 치수는 28×28 로 복귀**: 레일 내용 상자는 36px 뿐이라(56px 레일 − 좌우 10px)
67
+ 36×36 컨트롤 두 개는 들어가지 않습니다(실측 36+28=64px, 14px 넘침).
68
+ 28+28=56px 로 하여 변경 전의 32+28=60px 보다 좁혔습니다.
69
+ - **협조 경계는 그대로**: 오직 자체 CSS 만 바꾸고, 검색 인덱스의 값을 참조하지 않으며,
70
+ 설치 여부도 가정하지 않습니다.
71
+
72
+ ## 0.1.0-alpha.5
73
+
74
+ ### 변경 — 사이드바 진입점에 레이블 추가, 「검색 인덱스」와 같은 행에서 조화
75
+
76
+ - **진입점에 이름이 생겼습니다**: 하단 진입점은 28x28 아이콘 원형 버튼(🧭)뿐이어서 무엇인지 알 수 없었습니다.
77
+ 넓은 사이드바에서는 42px 행 컨트롤 **🧭 세션 스튜어드**가 되어, 옆의 「검색」 필과 같은 높이 ·
78
+ 같은 모서리 반경(12px) · 같은 글자 크기를 씁니다.
79
+ - **같은 행의 지오메트리 협조**: 검색 진입점이 `flex:1;min-width:0`을 선언해 행 전체를 차지하지 않게 되어,
80
+ 두 진입점은 `sidebar.footer.action`의 형제 요소로 같은 행에 놓입니다. 이 진입점은 넓은 모드에서
81
+ `margin-left:8px`로 간격을 만듭니다(공식 `ui-settings-general`의 `.triggerRow{gap:8px}`에 대응).
82
+ 상대 플러그인의 존재를 알지도, 값을 참조하지도 않습니다 — 협조는 각자의 CSS 안에서만 일어납니다.
83
+ - **레일 표시로의 축소**: `wide=false`에서는 `.dss_footerEntryRail`(36x36 원, 레이블 없음)이 되어
84
+ Figma 레일 규격(56px 레일 / 10px 패딩 / 36x36 컨트롤)과 공식 레일 컨트롤에 맞춥니다.
85
+ 레이블은 넓은 모드에서만 나타납니다.
86
+ - **문구 소유권 수정**: 컴포넌트에 하드코딩된 `'会话管家'` 폴백을 제거하고, 진입점 레이블을
87
+ 패널 제목과 같은 출처(사전 `panel.title`)로 옮겼습니다.
88
+
89
+ ## 0.1.0-alpha.4
90
+
91
+ 설정 카드에 서랍(드로어) 형태를 복원: 이전에는 맨 행만 있어 「플러그인」 설정 섹션의 다른 플러그인과 일치하지 않았다.
92
+
93
+ ### 수정
94
+
95
+ - **설정 카드에 드로어 외피가 없음(중요)**: DSH 의 「플러그인」 설정 섹션
96
+ (`dsh-client-ui-settings-plugins`)이 하는 일은 단 하나——settings 네임스페이스별로
97
+ `settings.plugin.item` 을 배포하는 것:
98
+
99
+ renderSlot('settings.plugin.item', {}, { entryKey: ns })
100
+
101
+ 외피는 **전혀 제공되지 않는다**. 카드의 제목·설명·펼침/접힘은 모두 플러그인 자신의 소유다.
102
+ 이 플러그인은 맨 행만 렌더링했기 때문에 두 가지가 어긋났다:
103
+ 1. 섹션 안 다른 플러그인의 「접이식 드로어」와 형태가 맞지 않음;
104
+ 2. `card.title`(세션 스튜어드)과 `card.desc`(이력 파일 · 상태 점검)가
105
+ **정의만 되고 한 번도 렌더링되지 않는** 죽은 문구가 됨——이것이 「빠진 드로어 항목」.
106
+
107
+ 이제 헤더(제목 + 설명 + chevron, 블록 전체 클릭 가능)를 복원하고
108
+ 본문은 기본적으로 접힌다(같은 섹션의 다른 카드와 동일). `aria-expanded` 는 펼침 상태를 반영한다.
109
+ - **설정 서비스를 쓸 수 없을 때의 동작**: 이전에는 카드 전체가 「설정 서비스를 사용할 수 없음」 한 줄로
110
+ 퇴화하며 **제목까지 사라졌다**. 이제는 드로어 헤더를 정상적으로 렌더링하고
111
+ 사유는 본문에만 표시한다——이 플러그인이 섹션에서 완전히 사라지지 않는다.
112
+
113
+ ### 변경
114
+
115
+ - 펼침 전환과 chevron 회전은 `prefers-reduced-motion` 을 따른다.
116
+
117
+ ## 0.1.0-alpha.3
118
+
119
+ 상태 점검 결과 캐시: 패널을 닫았다 열면 지연 없이 내용이 나오고, 처치 후에는 그 행만 갱신된다.
120
+
121
+ ### 추가
122
+
123
+ - **상태 점검 결과 캐시(프로세스 내)**: 한 번의 완전 스캔(분할로 말뭉치를 끝까지 도는 것) 결과를
124
+ 호스트 프로세스에 보관하고, 패널을 다시 열면 캐시를 그대로 렌더링한다(전량 재스캔 없음).
125
+ 캐시는 **말뭉치를 한 바퀴 다 돌았을 때만** 성립한다——중간에 패널을 닫아도
126
+ 반쪽 결과가 완전한 결론인 척하지 않는다.
127
+ - **`resume` 은 순수 읽기**: `session-health-scan` 에 `resume: true` 를 추가. **캐시만 읽고 스캔하지 않는다**.
128
+ 패널은 마운트 시 이것으로 한 번만 무비용 탐색하고, 적중하면 내용을 내고 빗나가면 아무것도 하지 않는다
129
+ (마운트 즉시 중작업은 이전 버전에서 지적된 지점). 동시에 현재 말뭉치 총수를 돌려준다.
130
+ - **생성 시각과 갱신 입구**: 적중 시 「결과는 캐시 · N분 전」을 표시하고 「새로 고침」을 제공한다
131
+ (강제 전량 재스캔). 오래된 결과가 방금 스캔한 척하지 않는다.
132
+ - **말뭉치 변화 알림**: 캐시 시점의 말뭉치 총수와 현재가 다르면
133
+ 「말뭉치가 변했습니다(a → b). 새로 고침을 권장」을 표시. 이 대조는 디렉터리 열거만 하므로 저렴하다
134
+ ——따라서 캐시 무효화 전략 자체가 되지는 않는다.
135
+
136
+ ### 변경
137
+
138
+ - **단건 되쓰기**: 단일 세션 상태 점검과 가역 처치 후에는 재스캔에 의존하지 않는다——
139
+ 처치는 이미 `after` 를 재계산하므로 그것을 그대로 캐시에 되쓴다.
140
+ 패널이 목록으로 돌아왔을 때 그 행은 이미 최신 단계다
141
+ (회복된 행은 사라진다. 「문제만 나열」과 일치).
142
+ - 캐시는 **디스크에 쓰지 않는다**: DSH 재시작 시 무효. 영속화에는 무효화 전략이 필요하고,
143
+ 무효 판정 비용(말뭉치 열거, 로그 mtime/size 대조)은 재스캔 자체에 가깝다. 이번 슬라이스는 YAGNI.
144
+
145
+ ### 테스트
146
+
147
+ - `tests/cache.spec.ts` 신규 추가(19건): 성립 규칙(미완주 / 완주 / 빈 말뭉치 / 중도 중단 / `clear`),
148
+ 단건 되쓰기의 모든 분기(추가 / 교체 / 회복으로 제거 / no-op), 그리고 `handleMethod` 배선
149
+ (`resume` 은 스캔하지 않음, 분할 완주 후 적중, `onlyProblems=false` 는 캐시를 오염시키지 않음,
150
+ 처치 후 되쓰기의 객체 동일성, cache 없는 런타임에서도 동작).
151
+
152
+ ## 0.1.0-alpha.2
153
+
154
+ 처치(처방)의 판정과 표시 수정: 「판정 불가」 게이트에 처방하지 않고, 처치 후의 결론을 명시한다.
155
+
156
+ ### 수정
157
+
158
+ - **`skipped` 에 대한 오처방(중요)**: `prescribe()` 는 기존에 `level !== 'ok'` 로 프로젝션 캐시
159
+ 격리 여부를 판단했기 때문에, 「이 게이트는 판정 불가」도 「프로젝션 캐시 미정합」으로 간주되어
160
+ 자신의 근거와 모순되는 처방을 내고 **존재하지 않는** 기록의 격리를 제안했다.
161
+ 공유 술어 `isActionable()`(`warn` / `fail` 만 처치 가능)을 추출해 일원화했다.
162
+ `gates.ts` 의 단계 기준과 `repair.ts` 의 처치 기준이 이제 같은 의미가 된다.
163
+ - **「사문 전록」 오탐**: 처치 항목이 없을 때 고정으로 「사문 전록(四門全綠)」을 표시했다.
164
+ 게이트가 `skipped`(판정 불가이며 녹색이 아님)일 때 이 문구는 성립하지 않는다.
165
+ 「처치 항목 없음(N 게이트 판정 불가, 이상 아님): <게이트 id 목록>」으로 변경했다.
166
+ - **처치 후에도 이상으로 표시되어 처치가 효과가 있었는지 알 수 없음**: 패널은 「처치 전 / 처치 후」의
167
+ 단계만 렌더링했기 때문에 둘 다 이상일 때 「처치 실패」와 「처치가 병소와 무관」을 구분할 수 없었다.
168
+ 호스트에 `assessRepair({ before, after, repair })` 를 추가해 5단계 중 하나와 사람용 설명을 반환한다:
169
+ `nothing-to-do`(사문 전록) / `repaired`(회복) / `repaired-with-residual`(캐시는 격리했으나
170
+ 캐시와 무관한 이상이 잔존, 예: 세션 로그의 open step) /
171
+ `not-applicable`(현재 이상에 가역 처치 항목이 없음) / `failed`(처치 자체의 실패).
172
+ 패널은 단계별 배색으로 결론 배너를 렌더링한다.
173
+
174
+ ### 설명
175
+
176
+ - **처치 능력은 불변**: 「프로젝션 캐시 기록의 격리만, 복사 후 이동, 세션 로그는 개서하지 않음」.
177
+ 이번에는 **판정**과 **표시**만 수정했다. 대표적 사례는 「`cold-read` 만 이상
178
+ (세션에 미결제 open step 이 있음)」——이는 본래 이 플러그인이 복구할 대상이 아니며,
179
+ 이제는 `not-applicable` 로 명시하고 사유를 설명한다. 조용히 「처치 후에도 이상」으로
180
+ 표시하지 않는다.
181
+
182
+ ### 테스트
183
+
184
+ - `tests/repair.spec.ts` 신규 추가(12건): `isActionable` 의 네 단계, `prescribe` 가 빈 처방을 내지
185
+ 않음, `assessRepair` 5단계 판정의 분기를 커버.
186
+
187
+ ## 0.1.0-alpha.1
188
+
189
+ 상태 점검 패널의 판정과 피드백 수정: 「주의」 전량 오탐을 해소하고 스캔 진행률과 행 내 사유를 추가.
190
+
191
+ ### 수정
192
+
193
+ - **「주의」 전량 오탐(중요)**: `lossless-json` / `projection-cache` / `cold-read` 세 게이트가
194
+ **판정 불가**일 때(콜드 세션에 핫 프로젝션이 없음, 캐시 기록 미생성, 로그에 turn/end 없음)
195
+ `warn` 을 반환하여 **로드되지 않은 모든 세션이 항상 「주의」** 가 되고 실제 신호가 노이즈에
196
+ 묻혔다. 중립 단계 `skipped`(패널 표기는 「미점검」)를 추가하여 「관측 불가」를 담당하게 하고
197
+ **총합 판정에 기여하지 않게** 했다.
198
+ 고정한 기준: `warn` = 이상 현상을 관측(근거 있음) / `skipped` = 관측·판정 불가(근거 없음).
199
+ 실측: 30개 세션이 「30×주의」 → 「26 정상 / 3 주의 / 1 이상」.
200
+ - **목록 행에 사유 미표시**: 결과 목록이 총합 단계만 렌더링해 행끼리 구분되지 않았다.
201
+ 비정상(non-ok) 「게이트·단계」 요약(예 `연결성·주의`)을 행 안에 표시하여 개별로 열 필요를 없앴다.
202
+
203
+ ### 추가
204
+
205
+ - **스캔 진행률**: `session-health-scan` 이 `offset` 분할 호출을 지원하고 `total` 을 반환한다.
206
+ 패널은 소배치로 연속 호출해 **실제 진행률**(`n/total · 경과 Xs`)을 자체 누적한다.
207
+ 분모를 아직 받지 못한 첫 회차는 불확정 애니메이션. 호스트는 무상태를 유지하며
208
+ 동기 루프를 비동기로 바꿀 필요가 없다.
209
+ - **처치 비지 표시**: 가역 처치 버튼에 스피너를 추가하고 비활성 상태를 유지.
210
+
211
+ ### 변경
212
+
213
+ - **탭 이름 변경**: `病案室` → `養老院`(영어 `Records Room` → `Retirement Home`).
214
+ 「상태 점검 / 처방 / 퇴원」 메타포와 통일.
215
+
216
+ ## 0.1.0-alpha.0
217
+
218
+ 첫 번째 alpha 버전: 세션 스튜어드(히스토리 파일 + 상태 점검).
219
+
220
+ ### 추가
221
+
222
+ - **세션 히스토리 파일(기록 보관소)**: `dsh-session-search-toggle`에서 공식 아카이브 집합의 읽기 및 정리 구현을 이관했으며,
223
+ 동작은 이관 전과 동등합니다(백업 + 동일 디렉터리 임시 쓰기 + 원자적 교체; 명시적 편집 모드에서만 정리 허용).
224
+ 차이점: 목록 출처가 **공식 아카이브 집합 진값**으로 변경되었습니다(registry 우선, 스토리지 파일 폴백). 독립 인덱스가 검색 인덱스 패키지와 함께 떠났기 때문입니다;
225
+ 제목 등 메타데이터는 최선 노력 방식입니다(`sessionQuery` 제목 스냅샷 → 프로젝션 캐시 title → 비어 있음).
226
+ - **상태 점검(점검 → 처방 → 퇴원)**: 독립적으로 테스트 가능한 네 개의 gate
227
+ (`log-integrity` / `projection-cache` / `lossless-json` / `cold-read`),
228
+ 통일된 출력 `{ id, level, evidence, attribution, detail }`; `SessionHealthReport`로 집계됩니다.
229
+ - **귀속 인덱스**: 프로필의 `node_modules/<pkg>/lib/*.js`를 정적 스캔하여 「프로젝션 key → 패키지 이름」을 구축하고,
230
+ 실패한 gate를 구체적인 플러그인과 필드 경로로 되돌려 지목합니다; 찾지 못하면 사실대로 `unknown`으로 표기합니다.
231
+ - **되돌릴 수 있는 처방**: 손상된 프로젝션 캐시 레코드 격리(먼저 복사 백업, 그다음 `.quarantine-<ts>`로 이동) + 명령 목록.
232
+ 세션 로그 재작성, 히스토리 데이터 변경, 필드 무단 삭제는 **금지**합니다.
233
+ - **두 개의 feature gate**: `historyFiles` / `healthCheck`, 꺼지면 해당 하위 도메인 전체가 등록되지 않고(명시적 disabled 오류),
234
+ 클라이언트도 해당 탭을 렌더링하지 않습니다.
235
+ - **라우트**: `/session-steward/api/*`, 메서드 이름은 일괄 `session-*`이며, 검색 인덱스의 `/switch-search/api`의 `index-*`와 완전히 격리됩니다.
236
+
237
+ ### 알려진 제한
238
+
239
+ - `lossless-json` gate는 호스트가 `sessionProjections`(핫 상태)를 노출해야 확정 판정을 내릴 수 있습니다;
240
+ 얻지 못하면 사실대로 `warn`으로 강등하며, 추측하지 않습니다.
241
+ - 상태 스캔은 기본적으로 최근 30개의 비정상 세션만 나열하며(`limit` 상한 200), 전체 라이브러리 순회를 기본 동작으로 삼지 않습니다.
242
+ - 클라이언트 패널은 최소 구현(목록 + 상세 + 3단계 버튼)이며, 가상 스크롤과 일괄 작업은 구현하지 않았습니다.