aiportal-py

요약. aiportal-py: 자율 개선 회차 23회, 릴리즈 0건. 최근 릴리즈 없음. 건강 C 14일: 릴리즈 0, 실패 0, 경고 0, 회귀 1

현황

저장소
https://github.com/hkjang/aiportal-py
마지막 회차
2026-09-10 19:13 KST — ✅ 머지 merged PR #17, release skipped
최근 릴리즈
skipped — skipped
사유
이 저장소에는 릴리즈 이력이 전혀 없습니다. git 태그 0개(`git tag | wc -l` = 0, `git for-each-ref refs/tags` = 0), 릴리즈 커밋 0개(`git log --all --oneline` 33개 커밋 전부 first commit / docs / fix: ... (감사 A-xxx) / Merge pull request 형식이며 release·버전·semver 패턴 매치 없음), CHANGELOG.md·docs/RELEASE*.md 없음, GitHub Release 목록 비어 있음, .github/workflows 없음(러너 제공 정보와 일치), 릴리즈/패키징 스크립트 없음(추적되는 .sh·Makefile·pyproject.toml·setup.py·package.json·Chart.yaml·Dockerfile·compose 파일 0개). 배포는 버전이 아니라 브랜치 기준입니다 — .gitlab-ci.yml 이 main/develop push 에 반응해 배포 디렉터리에서 `git reset --hard origin/$CI_COMMIT_BRANCH` 후 k8s rollout restart/podman restart 를 하며 태그·버전을 전혀 참조하지 않습니다. 버전 문자열은 api.py:147 의 FastAPI(version="1.0.0") 하나뿐인데 이는 OpenAPI 문서용 하드코딩 값이고 `git log -S` 결과 first commit(2075c62) 이후 17개 PR 동안 한 번도 변경된 적이 없어 릴리즈 시 갱신하는 버전 파일로 볼 수 없습니다(docs/IMPROVEMENTS.md 의 version="2.0.0" 은 제안 코드 스니펫, docs/ROADMAP.md 의 R0~R5 "Release" 는 소프트웨어 버전이 아니라 로드맵 단계입니다). 따라서 절차 5에 따라 아무것도 만들지 않았습니다 — 버전 체계·태그 형식·릴리즈 노트 위치를 새로 정하는 것은 사람의 결정입니다. 커밋·태그·파일 변경 없음, worktree 는 clean 상태로 둡니다. 참고로 이번 머지분(acfc432, 감사 A-113 Milvus 적재 실패 보고 수정)은 main 에 이미 반영되어 있어 기존 브랜치 기반 GitLab CI 배포로 그대로 나갑니다.

회차 이력

일시프로젝트결과
2026-09-10 19:13aiportal-py병합 완료 merged PR #17, release skipped
11파일 +409/−32 · 테스트 2 — fix: Milvus 적재 실패를 성공으로 보고하지 않도록 수정 (감사 A-113)
2026-09-10 11:54aiportal-py병합 완료 merged PR #16, release skipped
10파일 +506/−37 · 테스트 1 — fix: 백그라운드 루프의 마지막 성공 시각을 /health 로 노출 (감사 A-112)
2026-09-09 15:16aiportal-py병합 완료 merged PR #15, release skipped
7파일 +490/−15 · 테스트 1 — fix: 스페이스 첨부 색인이 누적 배치를 반복 삽입하는 문제 수정 (감사 A-111)
2026-09-09 07:20aiportal-py병합 완료 manual: merged PR #14, release skipped
8파일 +770/−9 · 테스트 1 — fix: 백그라운드 task 종료를 로그·/health 로 관측 가능하게 (감사 A-003)
2026-09-09 06:59aiportal-py검토 대기 review held, PR open PR #13
8파일 +531/−9 · 테스트 1 — fix: 백그라운드 task 종료를 로그·/health 로 관측 가능하게 (감사 A-003)
2026-09-09 00:10aiportal-py병합 완료 merged PR #12, release skipped
7파일 +374/−77 · 테스트 1 — fix: 첨부파일 추출이 예외 객체·None 대신 항상 문자열을 반환 (감사 A-110)
2026-09-08 16:41aiportal-py병합 완료 merged PR #11, release skipped
7파일 +397/−21 · 테스트 1 — fix: 검색 경로의 Milvus default alias 재사용 분리 (감사 A-007 후속)
2026-09-07 11:44aiportal-py검토 대기 approved PR #9, rebase conflict
2026-09-07 11:14aiportal-py검토 대기 approved PR #9, rebase conflict
2026-09-07 10:58aiportal-py검토 대기 approved PR #9, rebase conflict
2026-09-07 10:54aiportal-py병합 완료 merged PR #10, release skipped
7파일 +254/−8 · 테스트 1 — fix: /health 가 공용 Milvus default alias 를 끊지 않도록 전용 alias 도입 (감사 A-007)
2026-09-07 10:43aiportal-py병합 완료 merged PR #8 (approved), release skipped
2026-09-07 10:41aiportal-py병합 완료 merged PR #7 (approved), release skipped
2026-09-07 00:25aiportal-py검토 대기 CI no-ci, PR open PR #9
8파일 +496/−31 · 테스트 1 — fix: 기동 시 정책 토큰 무기한 대기 제거하고 degraded 기동 도입 (감사 A-002)
2026-09-06 12:52aiportal-py검토 대기 CI no-ci, PR open PR #8
7파일 +427/−29 · 테스트 1 — fix: 추천 질문 캐시를 원자적 교체 방식으로 변경 (감사 A-206)
2026-09-06 02:31aiportal-py검토 대기 CI no-ci, PR open PR #7
7파일 +97/−14 · 테스트 1 — fix: 오류 경로의 미할당 이름 참조 수정 (감사 A-105)
2026-09-05 01:10aiportal-py병합 완료 merged PR #6, release skipped
2026-09-04 06:09aiportal-py병합 완료 merged PR #5, release skipped
2026-09-03 22:23aiportal-py변경 없음 no change
2026-09-03 14:06aiportal-py병합 완료 merged PR #4, release skipped
2026-09-03 02:07aiportal-py병합 완료 merged PR #3, release skipped
2026-09-02 19:48aiportal-py병합 완료 merged PR #2, release skipped
2026-09-02 13:45aiportal-py병합 완료 merged PR #1, release skipped

비용·사용량

최근 30세션
시각프로젝트단계시간비용토큰 입력/출력종료
19:13aiportal-py릴리즈1분15$0.47265K / 6Ksuccess
19:11aiportal-pyreview3분20$0.95601K / 10Ksuccess
19:08aiportal-py개선8분42$3.353.0M / 37Ksuccess
11:54aiportal-py릴리즈1분16$0.52260K / 6Ksuccess
11:52aiportal-pyreview3분15$1.09633K / 11Ksuccess
11:49aiportal-py개선9분62$4.514.8M / 42Ksuccess
15:16aiportal-py릴리즈1분9$0.36196K / 4Ksuccess
15:14aiportal-pyreview2분14$0.73369K / 9Ksuccess
15:12aiportal-py개선6분36$2.381.9M / 28Ksuccess
07:20aiportal-py릴리즈1분15$0.48252K / 5Ksuccess
07:18aiportal-pyreview2분14$0.78358K / 8Ksuccess
07:16aiportal-py개선6분39$2.131.7M / 25Ksuccess
06:59aiportal-pyreview2분15$0.74368K / 9Ksuccess
06:56aiportal-py개선6분44$2.231.8M / 27Ksuccess
00:10aiportal-py릴리즈1분12$0.41203K / 4Ksuccess
00:09aiportal-pyreview2분9$0.74342K / 9Ksuccess
00:06aiportal-py개선6분38$2.301.9M / 27Ksuccess
16:41aiportal-py릴리즈1분12$0.42207K / 4Ksuccess
16:39aiportal-pyreview3분17$1.11709K / 13Ksuccess
16:36aiportal-py개선6분35$2.221.8M / 25Ksuccess
10:54aiportal-py릴리즈1분13$0.47219K / 5Ksuccess
10:52aiportal-pyreview1분8$0.51254K / 6Ksuccess
10:50aiportal-py개선4분32$1.671.3M / 20Ksuccess
10:43aiportal-py릴리즈1분13$0.33177K / 3Ksuccess
10:41aiportal-py릴리즈1분13$0.39211K / 4Ksuccess
00:20aiportal-pyreview3분14$0.99605K / 11Ksuccess
00:18aiportal-py개선8분49$2.812.4M / 35Ksuccess
12:48aiportal-pyreview3분20$0.92729K / 8Ksuccess
12:46aiportal-py개선6분43$2.362.1M / 25Ksuccess
02:27aiportal-pyreview2분11$0.66378K / 7Ksuccess

아이디어 백로그 — 대기 12 / 전체 13

에이전트가 회차마다 재평가한다. 가치 높고 위험 낮은 대기 항목이 다음 회차 후보다.
아이디어가치/위험/크기상태메모갱신
A-105 후속: 공통 오류 응답 model 도입과 traceback 노출 제거4/3/L대기HTTP 200+code 299/499, 빈 문자열, None, HTTP 500 혼재는 그대로. 클라이언트에 traceback 을 그대로 돌려주는 것도 A-106 과 연계해 정리 필요. 응답 형태 변경이라 클라이언트 영향이 크므로 라우트를 나눠 단계적으로 진행해야 한다. /run_confluence_pipeline_spacefile 이 전형적인 예다(bare except -> return traceback.format_exc()). A-113 으로 이 라우트의 성공 문구는 실패 파일을 담게 됐지만 예외 경로의 traceback 반환은 남아 있다.2026-09-10
GitLab CI 에 deploy 앞단 test stage 추가4/3/L대기러너가 shell 태그 기반이라 python 실행 환경이 불확실하고, 실패 시 배포가 막힐 위험이 있어 러너 환경 확인이 선행돼야 한다.2026-09-10
A-112 후속: fetch_unprocessed_feedback 이 DB 조회 실패와 '피드백 없음' 을 구분하지 않음3/1/S대기service/feedbackservice.fetch_unprocessed_feedback 은 except 에서 로그만 남기고 [] 를 돌려주므로 process_feedback_batch 가 '처리할 피드백 없음' 으로 정상 종료하고 A-112 heartbeat 도 성공으로 기록된다. DB 가 계속 죽어 있어도 /health 의 background_tasks 는 running 이다(별도의 portal_db/athena_db probe 가 있어 완전한 사각지대는 아니지만, 풀 고갈이나 테이블/권한 문제처럼 SELECT 1 은 통과하는 실패는 여전히 안 보인다). 최소 수정은 조회 실패를 None(또는 예외)로 구분해 process_feedback_batch 가 실패를 반환하고 루프가 heartbeat 를 건너뛰는 것. psycopg2 미설치라 검증은 AST + 주입 가능한 helper 로 나눠야 한다. A-113 과 같은 결(실패를 반환값으로 삼키지 않기)이다.2026-09-10
pipeline/law/library/xml_parser_core.py, json_formatter.py 단위 테스트3/1/M대기fixture XML/JSON 을 만들어야 함. 순수 변환 로직이라 외부 의존성 없이 테스트 가능.2026-09-10
A-113 후속: Milvus 삭제 경로도 실패를 삼킨다3/2/S대기신규(2026-09-10 발견). util/milvus_confluence.delete_to_milvus_space_file 은 except 에서 logger.error 만 남기고 None 을 돌려주며, /run_confluence_pipeline_delete_spacefile 은 그 None 을 그대로 응답한다(삭제 실패인지 '지울 게 없음' 인지 구분 불가). delete_to_milvus 는 아예 try 가 없어 실패가 페이지 파이프라인 전체를 중단시킨다 — 두 함수의 실패 계약이 반대 방향으로 어긋나 있다. A-113 에서 만든 MilvusInsertError 옆에 삭제용 예외를 두고 같은 패턴으로 맞추면 된다. 삭제 실패를 알리면 '삭제 안 된 채 재색인' 이라는 중복 원인도 드러나므로 스페이스 재색인 삭제 순서 항목과 이어진다.2026-09-10
A-104 후속: collection name allowlist 와 field 별 타입 검증3/2/M대기표현식 escape 는 끝났으나 요청이 지정하는 collection/table 이름은 여전히 검증 없이 Collection() 에 전달된다.2026-09-10
스페이스 첨부 재색인 시 기존 attachment 삭제가 호출자 책임인 문제3/3/M대기/run_confluence_pipeline_spacefile 은 삽입만 하고, 기존 attachment 삭제는 별도 endpoint /run_confluence_pipeline_delete_spacefile(delete_to_milvus_space_file)로 분리돼 있다. 같은 스페이스를 두 번 색인하면 A-111 수정 후에도 이전 회차의 entity 가 남아 중복이 쌓인다. 페이지 파이프라인(confluence_piepeline_detail)은 루프 안에서 delete -> insert 를 함께 하므로 대조군이 있다. 삭제를 색인 앞에 넣으면 삽입 실패 시 데이터가 사라지므로 순서·실패 처리 설계가 필요해 M. A-113 으로 삽입 실패가 이제 판별 가능해져 '삭제했는데 삽입이 실패' 를 감지할 수단은 생겼다.2026-09-10
A-102/A-206 후속: 추천 질문·토큰 캐시를 프로세스 간 공유3/3/M대기캐시 교체는 정리됐지만 여전히 worker 프로세스마다 별도 캐시라 worker 수만큼 LLM 호출이 중복되고 응답이 worker 별로 다르다. 외부 cache 또는 sticky routing 이 필요. A-112 의 heartbeat 도 프로세스별이라 /health 응답이 worker 마다 다를 수 있다는 점이 이 항목과 얽힌다.2026-09-10
A-107 후속: 재시도·circuit breaker·공용 requests.Session 도입3/3/M대기timeout 은 전부 지정됐으나 재시도·backoff·connection pooling 은 없음. idempotent 호출에만 제한 재시도를 붙이는 설계가 필요. util/startup_wait.py 의 backoff 계산을 재사용할 여지가 있다. A-112 로 '계속 실패하는 루프' 가 관측 가능해졌으므로 재시도의 효과를 확인할 수단이 생겼다.2026-09-10
except 절 범위 축소 (bare except -> 구체 예외)3/3/M대기저장소 전반의 bare except 가 KeyboardInterrupt/CancelledError/GeneratorExit 까지 삼킨다. /status_completions, 추천 질문 갱신 루프, util/pipeline_module.extract_logic 은 좁혔음. service/pipelineservice.confluence_pipeline_kcblaw 와 api.py 의 파이프라인 라우트(예: /run_confluence_pipeline_spacefile)에 남아 있다. CancelledError 를 삼키는 것은 A-003 의 shutdown 판정과도 얽힌다. 파일별로 나눠 진행. tests/unit/test_extract_text.py 에 extract_logic 한정 bare except 검사가 있어 확장할 자리가 있다.2026-09-10
api.py 의 미사용 import 정리 (A-204 일부)2/1/S대기pyflakes 가 api.py 에서만 20건 이상의 'imported but unused' 를 낸다(저장소 전체 297건). 정리하면 pyflakes 를 CI 게이트로 쓸 수 있다. util/search_module.py 의 utility·RRFRanker, util/pipeline_module.py 의 is_softcamp_drm_stream·exec_ocr_confluence, service/pipelineservice.py 의 pymilvus 스키마 심볼·중복 settings import, util/milvus_confluence.py 의 pymilvus 스키마 심볼도 같은 상태다. 다만 side-effect import 여부를 하나씩 확인해야 한다.2026-09-10
milvus_collection·milvus_confluence·pipeline 의 default alias 를 ensure_connection 으로 통일2/2/M대기A-007 후속 작업에서 search_module 만 주소별 alias 로 옮겼다. 나머지는 항상 MILVUS_HOST 한 곳만 보고 호출 직전에 스스로 connect(alias='default') 하므로 지금은 동작이 깨지지 않아 가치가 낮다. 다만 연결이 매 호출 재확인되고 alias 규칙이 두 갈래로 남는다. 옮기려면 각 파일의 Collection()/utility 호출 전부에 using= 을 붙여야 해서 변경 폭이 크다.2026-09-10
Milvus 적재 실패가 조용히 성공으로 보고되는 문제 (감사 A-113)3/2/S완료insert_to_milvus_cf 가 실패를 traceback 문자열로 반환하고 호출부가 무시해, 전부 실패해도 api.py 가 'N 건 적재 종료' 를 돌려줬다. MilvusInsertError 로 올리고 index_space_files 가 SpaceFileIndexResult(inserted, failed_files) 로 실패 파일을 세게 했으며 confluence_piepeline_detail 은 total_failed 를 반환한다. 커밋 acfc432.2026-09-10

교훈 (깨졌던 변경)

원장 (에이전트가 남긴 기록)

2026-09-02

2026-09-02 (2회차)

2026-09-03

2026-09-03 (2회차)

2026-09-04

2026-09-05

2026-09-06

2026-09-07

2026-09-07

2026-09-08

2026-09-09

2026-09-09

2026-09-09

2026-09-09

2026-09-10

2026-09-10

← 대시보드 · 교훈 모음