Repository navigation
기준 브랜치 동기화와 플랫폼 구현 정합성 정리 - #66
Merged
haesookimDev merged 23 commits intoOct 15, 2026
Merged
haesookimDev merged 23 commits into
haesookimDev merged 23 commits into
Conversation
* feat(approval): 파일 저장소 업로드를 결재 행위로, 파일 클라우드 행위는 거둔다 (2.8.0) - catalog: FILESTORE_UPLOAD(filestore.upload) '파일 저장소 업로드' — 올린 파일은 결재가 끝나야 쓴다. 여러 파일을 한 번에 올리면 한 건. 적용은 filestore.embed 와 같은 길(workflow 워커 → documents 내부 API). - cloud.* 6종(저장소 생성·업로드·갱신·공유·PC 연결·에이전트 연결)을 카탈로그에서 빼고 RETIRED 에 이름만 남긴다 — [파일 클라우드]를 사이트에서 내렸다(파일 저장소가 대신). catalog.label_of 는 거둔 행위도 이름으로 읽는다(지난 결재 문서·로그). - store.retire_actions: 거둔 행위의 진행 중 결재를 사유와 함께 시스템 회수하고 정책 행을 치운다(멱등, core 기동이 부른다). policy.required_actions 는 카탈로그에 있는 것만. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(approval): 거둔 결재 종류의 회수는 오류 없이 끝낸다 store.retire_actions 가 시스템 회수하면 core 가 되돌리기 훅을 찾는데, 거둔 종류는 등록이 없어 회수마다 '등록되지 않은 결재 종류' 가 apply_error 로 남았다. 치울 것이 없으므로 빈 결과로 끝내고, 승인만 된 채 남은 건은 '더 이상 쓰지 않는 종류' 라고 적는다. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
pycryptodome 3.23.0 · httpx 0.28.1 · pydantic 2.12.5 · fastapi 0.128.0 — 소비 서비스 넷(workflow·core· documents·workflow-sandbox)이 지금 설치하는 버전. 서비스마다 다른 psycopg·psycopg-pool·redis·minio 는 범위로 두고 각 서비스의 잠금 파일이 고정한다. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
chore: 네 서비스가 같은 버전을 쓰는 의존성을 정확히 고정 (2.8.1)
…게 (2.8.2) fastapi 0.128.0 은 starlette<0.51 로 묶여 starlette 의 보안 수정(CVE, 1.1.0·1.3.1 에서 고침)을 받을 수 없다. 0.141.1 은 starlette 1.3.1~1.6.0 으로 시험된 판이고, 0.142 의 동작 변경은 피한다. pydantic 2.12.5 와 맞는다. SDK 는 starlette 를 직접 쓰지 않는다. 시험: fastapi 0.141.1·starlette 1.6.0 768 통과(0.128.0·0.50.0 과 같음). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
fix(deps): fastapi 0.141.1 — starlette 보안 수정을 받게 (2.8.2)
PII · 금칙어 정책을 core · workflow · documents 가 같은 뜻으로 쓰도록 한 곳에 둔다. 지금까지 서비스마다 사본이 있었다(정책 로그 적재기 3벌, 부분 마스킹 2벌, 파일 마스커는 documents 에만). - settings: 종류 둘(개인정보 · 금칙어) x 적용 자리 넷(채팅 입력 차단 · 모델에 전달 차단 · 채팅 파일 업로드 제거 · 파일 저장소 업로드 제거) 스위치 이름 · 기본값 · 판정. 탐지 스위치와 자리 스위치가 둘 다 켜져야 그 자리에 쓰인다. 기본값은 예전 동작(모델에 전달만 켜짐). - rules: 정책 행 -> 규칙(전체 치환 · 부분 마스킹), 적용 · 찾기 · 가릴 구간. [마스킹 미적용] 정책은 쓰는 자리가 skip / default(****) 를 고른다. - loader: 활성 정책 + 에이전트별 예외(agent_applied_policies). - files: 텍스트 · HTML · Office(문단 단위, run 이 쪼개져도) · PDF(redaction) 바이트 가리기와 업로드 제자리 다시 쓰기. xgen-pdf · bs4 · chardet 는 늦게 import 해 의존을 늘리지 않는다. - events: policy_event_log 적재(enforced 표시 포함)와 발생지 상수. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- PDF: pdfium 은 스레드에 안전하지 않아 동시에 가리면 프로세스가 죽었다. 프로세스 잠금으로 하나씩. 저장할 때마다 문서 ID 가 무작위라 같은 파일이 다른 sha 가 되던 것을 입력에서 만든 같은 길이 값으로 고정. - 앞뒤를 보는 정규식((?<=password: )\S+ 등)이 Office · PDF 에서 원문을 남기던 것: 치환문을 찾은 문맥의 매치 객체로 만든다(MaskingRule.replacement). 깨진 역참조 템플릿은 **** 로 가린다. - Office: 셀 안 문자열(is)을 묶음으로 보고 묶음 밖 노드는 노드마다(셀끼리 잇지 않는다), 걸린 노드만 다시 쓴다, 엔티티(" “)를 제대로 푼다, 압축을 푼 XML 크기 상한(XGEN_FILE_MASKING_MAX_XML_BYTES, 256MiB), 묶음 태그와 겹침 판정을 한 번 훑기 · 이분 탐색으로(큰 파일 · 닫히지 않은 태그에서 느려지지 않게). - HTML: 파서로 다시 쓰지 않고 태그 밖 글과 주석만 바꾼다(charset 표기 · 모양 · 주석 유지). - 텍스트: 원래 바이트로 되돌아가게 읽는다(utf-8 · cp949 · chardet, 못 읽는 바이트는 surrogateescape), 마스크 글자가 그 인코딩에 없으면 그 글자만 ? 로. - 확장자 없는 이름(m · pdf)을 형식으로 읽지 않는다(masker_for_extension 따로). - 환경 값이 숫자가 아니어도 import 가 깨지지 않는다. 정책 읽기의 500줄 기본 상한을 풀었다. - strip_file 은 옆 임시 파일에 쓴 뒤 바꿔 끼운다. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… 작업 프로세스 - find_masked_spans 가 apply_rules 와 같은 차례로 구간을 낸다(앞 마스크 위에서 다시 걸린 것까지, 무작위 3만 건 대조) - rule.repl 이 깨진 치환문에서 **** 를 낸다(서비스가 re.sub 에 바로 넘겨도 안전) - HTML: 문자 참조를 풀어 찾고, 글 속 < 와 script-x 를 태그로 보지 않고, 마스크는 이스케이프해 쓴다 - 글자 판별: UTF-32 BOM, 거의 UTF-8 인 글, chardet 은 확신이 높을 때만 · 되돌려 같을 때만 - Office: 접두어 붙은 부분(x:t), 지운 글(delText), 메모(comment) 도 가린다, 압축 해제 상한은 그림까지 더한다 - PDF: multiprocessing spawn 대신 이 SDK 만 불러오는 작업 프로세스(서비스 main.py 를 다시 불러오지 않는다), 시간 상한 · 죽은 프로세스 교체 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…프로세스 재사용 - find_masked_spans 가 글자마다 표를 만들지 않고 조각(원문 구간 · 치환문)으로 따라간다(4.5M 글자 한 곳 걸림: 0.01초 · 9 MB, 예전 글자 단위는 5 MB 에 864 MB). 옛 구현 · apply_rules 와 무작위 10만 건 대조 0 건 다름 - HTML 문자 참조 위치도 참조 수만큼만 든다(이분 탐색) - 글자 판별: 되돌려 같은 cp949 를 깨진 바이트가 드문 UTF-8 보다 먼저(한글이 몇 글자뿐인 cp949 CSV 가 UTF-8 로 읽혀 한글 규칙이 빠지던 것) - 빈 매치(\d* 등)는 숨길 글자가 없어 건너뛴다(마스크를 글자 사이마다 끼워 넣지 않는다, 구간 찾기와 같다) - 시간 상한에 걸려 죽은 PDF 작업 프로세스를 다시 쓰지 않는다 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
feat(control_policy): 통제 정책 공용 모듈, 적용 자리 스위치 · 파일 지우기 · 정책 로그 (2.9.0)
- HWP 5.0: 복합 문서(OLE)를 직접 읽고 다시 쓴다(_cfb, 항목 이름 · CLSID · 시각 그대로, 레드-블랙 형제 트리 · DIFAT 포함). BodyText 의 문단 글(PARA_TEXT)에서 걸린 보통 글자만 마스크로 바꾸고 제어 문자(표 · 필드 · 탭 · 문단 끝)는 하나도 지우지 않는다(매치 안 제어 문자는 같은 비율 자리에). 문단 머리 글자 수 · 글자 모양 · 영역 태그 위치를 옮기고 줄 배치 캐시는 지운다(한컴이 다시 계산). 표 · 머리말 · 각주 · 글상자도 문단이라 같은 길 - 미리보기 글 가림, 미리보기 그림은 빈 그림, 문서 요약 정보(제목 · 작성자) 가림, 문서 이력 삭제 - 암호 · DRM · 배포용 · 한글 97 이전은 unmaskable - HWPX: 문단마다 <hp:t> 글(탭 등 섞인 요소 포함)을 이어 보고 바뀐 문단의 linesegarray 를 지운다. content.hpf · header.xml 문서 정보, 미리보기도 - OOXML: docProps(작성자 · 제목 등)도 가린다 - __version__ 이 2.8.1 에 멈춰 있던 것 고침 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
5.0.0.x 의 문단 머리는 16 바이트라 줄 수 칸이 없다. 글자 수는 늘 고치고, 글자 모양 수 · 줄 수는 그 칸이 있을 때만 고친다. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… · HTML 스크립트 - HWP: 필드 명령(하이퍼링크 · mailto), 개체 설명(그림 원래 파일 이름), 수식 스크립트도 가린다(탐지 글에도 싣는다) - HWP: 압축을 푼 크기의 합을 MASKING_MAX_UNZIPPED_BYTES 로 막는다(작은 파일이 수십 GB 로 풀리는 문서) - HWP: 지운 글자의 새 위치를 구간 안 차례대로 정해 글자 모양 · 영역 태그 위치가 뒤집히지 않게 - HWP: 본문이 깨끗해도 문서 이력에 걸린 것이 있으면 이력을 지운다. 읽지 못하는 요약 정보에 걸린 것이 있으면 뺀다 - HWP · HWPX: 미리보기 글은 고친 본문에서 같은 길이로 다시 만든다(매치 한가운데서 잘린 미리보기) - HWPX: stringParam · shapeComment · script, <hp:t> 안 CDATA, 이름이 겹친 zip 항목은 거절, 메타데이터는 글 칸만 - Office: 문서 속성은 글 칸만(날짜 · 판 번호는 그대로), 걸린 것이 있으면 썸네일을 빈 그림으로, 이름이 겹친 항목 거절 - HTML: 스크립트 · 스타일 안 글도 가린다(마스크가 그 구간을 닫지 않게), 속성 값 안의 > 를 태그 끝으로 보지 않는다 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…· 미리보기 · 썸네일 - HTML: = 바로 뒤 따옴표만 속성 값으로 본다(글 속 it's 가 뒤의 글을 태그로 만들어 가리지 못하던 회귀) - HWP: 압축은 끝까지 풀려야 한다(잘린 스트림 거절), 이력은 압축 문서에서만 풀고 못 풀면 볼 수 없으니 지운다 - HWP · HWPX: 필드 명령 · 매개변수 · 개체 설명은 원문과 같은 길이로 가린다(누름틀 명령의 길이 표기가 어긋나지 않게, 구간 밖 줄바꿈은 그대로) - HWPX: 잎 요소(개체 설명 · 필드 매개변수 · 수식 · 메타데이터)의 CDATA 도 - 미리보기: 문단 글이 바뀐 때만 다시 만들고, 다시 만든 글에도 규칙을 한 번 더(문단을 넘는 매치) - 요약 정보: 가린 뒤에도 다루지 않는 형식에 걸린 것이 남으면 통째로 뺀다 - Office: 썸네일은 빈 그림 대신 패키지 관계 · 콘텐츠 형식과 함께 뺀다(형식이 맞지 않는 바이트를 쓰지 않는다) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-16 길이 · HTML 속성 읽기 - HWP 요약 정보: 가리지 못하는 형식(VT_BSTR · 벡터 · BLOB) 값만 다시 본다(시각 바이트를 한글로 읽어 깨끗한 문서의 요약 정보를 지우던 것) - 문서 이력: 레코드로 읽히면 문단 글만 보고, 못 읽으면 지운다(잡음 바이트를 글로 보지 않게). 지웠다는 사실은 1건 - HWPX: 잎 요소 CDATA 는 첫 ]]> 에서 끝난다(요소 너머로 이어 맞춰 원문이 남고 느려지던 회귀) - HWPX 미리보기: 문단 글이 바뀐 때만 다시 만들고 규칙을 한 번 더(HWP 와 같게) - 같은 길이 가리기는 UTF-16 단위로 맞춘다 - HTML: 속성을 브라우저처럼 읽는다(이름 = 값). 따옴표 없는 값 뒤의 따옴표는 값이 아니고, 닫는 따옴표 찾기는 문서마다 기억해 앞으로만 간다 - Office 썸네일: 관계 · 콘텐츠 형식 요소를 속성으로 읽어 뺀다(작은따옴표 · 공백 · 대소문자). 못 빼면 빈 그림 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
feat(control_policy): 한글 문서(HWP · HWPX) 가리기, Office 문서 속성 · HTML 스크립트 (2.10.0)
core · workflow · documents 에 똑같이 복사돼 있던 service/anomaly_telemetry.py 와 workflow · documents 의 service/anomaly_llm.py 를 SDK 로 옮기고 사후 검토에서 나온 결함을 고쳤다. - 적재가 요청을 붙잡지 않는다. record_event 는 메모리 대기열에 넣고 바로 돌아오고, 프로세스마다 쓰기 스레드 하나가 묶어서 넣는다. 연결은 1초만 기다리고 풀 복구를 부르지 않는다. 예전에는 LLM 호출 · 입력 심사가 끝날 때마다 쓰기를 기다렸고, 풀이 차면 3번 재시도 x 30초로 최악 90초 늦었다(성공한 응답이 시간 초과로 바뀌기도 했다). - 런타임 시간 상한(asyncio.wait_for)이 끊은 호출이 cancelled 로 남던 것을 timeout 으로. 취소를 받은 뒤 Task.cancelling() 이 줄었는지(시간 상한이 거둔 취소인지)로 가른다. 사람이 멈춘 호출은 그대로 cancelled. - LangChain 콜백을 run_inline 으로. 스트림 토큰마다 공용 실행기를 거치던 것을 없앤다. 콜백을 붙이지 못해도 모델은 그대로 돌려준다. - 대상 해시의 지역 키에 aws_region 을 더했다(Bedrock 지역이 달라도 한 대상으로 묶이던 것). - 표 정의(DDL)는 core 만 실행한다. 서비스가 표를 만드는 함수는 두지 않는다. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
feat(anomaly): 시스템 알람 운영 이벤트 적재와 LLM 결과 기록 공용 모듈 (2.11.0)
- 상신(snapshot)은 허용 후보 ID만 저장하고 후보를 다시 검사하지 않는다. 예전에는 후보 결재선 하나를 내리거나 · 공유를 풀거나 · 양식을 바꾸면 원래 결재선으로 올리는 모든 상신(에이전트 배포 · RAG 결재 포함)이 거절됐다. 쓸 수 없는 후보는 고를 때 (candidates · decision) 이미 걸러진다. 상신 경로가 설정 표 잠금을 잡지 않는다. - 결재선 저장은 이번에 새로 넣은 후보만 검사한다. 이미 허용돼 있던 후보가 나중에 쓸 수 없게 돼도 이름 바꾸기 같은 저장이 거절되지 않는다. - 판 2.12.0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
feat(approval): add optional followup approval transitions
haesookimDev
marked this pull request as ready for review
October 15, 2026 01:30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
기준 동기화 / Base synchronization
기준
main@1ab3edaf0f39314f799974ceaa68236883507a5b와 최신 플랫폼 기능 tip을 merge하여 이력을 보존했습니다. 후보6a5e3555321aaae33eeae861a9df4f29afb7202d에는 기준 커밋과 이전 기능이 모두 포함됩니다.텍스트 충돌과 자동 병합의 인증·실행·UI·계약 중복을 검토했습니다. SDK/runtime/DEX는 main, Sandbox는 develop을 기준으로 유지합니다. 테스트 요약과 정확한 소스는 workspace
design/verification/integration-base-sync-2026-10-15에 있습니다.검증 및 후속 경계
Root review and relevant regression tests completed for candidate code. Upper integration Drafts remain. Full ACTIVE / multi-client / real-resource acceptance and release CI are separate gates. Current preview was not deployed with this candidate; actual app DB migrations and package publication were not performed.
Keep this child Draft while final integration checks run. Target is the unprotected design integration source, never the protected baseline. No new feature adapters or automatic legacy removal. Detailed next contract plan: workspace
design/cross-platform-session-sync-and-implementation-plan.md.