---
title: "Maester universal 정리 automation v2 완료 보고"
from: codex
to: ["jadong", "claude-code"]
project: "maester"
date: 2026-05-09T20:31:15.801632+09:00
status: sent
type: result
---

# /tmp/maester_universal_summary_v2_report.md

# Maester Universal `정리` Automation v2 Report

## Summary

P0 구현 완료. `정리` command router가 Chrome CDP 현재 탭을 감지해서 Claude App, ChatGPT rendered transcript, 로컬 파일을 같은 Maester summary ingest 파이프라인으로 처리한다.

## Changed Files

- `/home/tlswk/projects/maester-agent/tools/browser_cdp.py`
- `/home/tlswk/projects/maester-agent/tools/summary_ingest.py`
- `/home/tlswk/projects/maester-agent/scripts/summary_command_router.py`
- `/home/tlswk/projects/maester-agent/scripts/maester-summary`
- `/home/tlswk/projects/maester-agent/scripts/정리`
- `/home/tlswk/projects/maester-agent/scripts/maester_summary_watcher.sh`
- `/home/tlswk/projects/maester-agent/systemd/maester-summary-watcher.service`
- `/home/tlswk/projects/maester-agent/scripts/summary_comms_directive_worker.py`
- `/home/tlswk/projects/maester-agent/scripts/chatgpt_cdp_bridge.py`
- `/home/tlswk/projects/maester-agent/api.py`
- `/home/tlswk/projects/maester-agent/.env.example`
- `/home/tlswk/projects/maester-agent/HANDOFF_universal_summary_v2.md`

## Entry Points

```bash
python scripts/summary_command_router.py 정리
scripts/maester-summary
scripts/정리
python scripts/summary_command_router.py watch --watch --cdp-port 9444
python scripts/summary_comms_directive_worker.py --status sent
```

## API Security

Added `MAESTER_SUMMARY_INGEST_TOKEN`.

- Allowed: `POST /api/maester/summary-ingest`
- Forbidden with summary token: doc delete, action status update, board command, revenue event

## Verification Highlights

- Claude App current-tab route: passed with idempotent doc `idea_20260509_b5c700`
- ChatGPT current-tab route: passed with doc `chat_log_20260509_4ff7e8`
- Local file route: passed with doc `chat_log_20260509_5d86b5`
- Document Bridge report: `msg_20260509_26731ce0`
- Context Bridge append/update: passed
- active ActionItem count: 0 for tested summary docs

## Known Limits

ChatGPT export uses currently rendered DOM messages. If ChatGPT virtualizes older turns, the adapter saves the rendered transcript, not a guaranteed full server export.


---

# /tmp/maester_universal_summary_v2_eval.md

# Maester Universal `정리` Automation v2 Eval

## Commands

```bash
python3 -m compileall tools/summary_ingest.py tools/browser_cdp.py scripts/summary_command_router.py scripts/chatgpt_cdp_bridge.py scripts/summary_comms_directive_worker.py api.py
```

Result: pass.

```bash
python3 scripts/summary_command_router.py 정리 --source auto --project keeper-direct --doc-type idea --importance high --action-policy none --cdp-port 9444 --no-document-bridge --no-context-bridge
```

Result:

- source: `claude_app`
- doc_id: `idea_20260509_b5c700`
- status: `idempotent_hit`
- recall_top5: true
- active_action_items: 0

```bash
python3 scripts/summary_command_router.py 정리 --source auto --project maester --doc-type chat_log --importance normal --action-policy none --cdp-port 9444 --no-document-bridge --no-context-bridge
```

Result:

- source: `chatgpt`
- doc_id: `chat_log_20260509_4ff7e8`
- status: `created`
- recall_top5: true
- active_action_items: 0

```bash
python3 scripts/summary_command_router.py 정리 --source file --file HANDOFF_universal_summary_ingest.md --project maester --doc-type chat_log --no-document-bridge --no-context-bridge
```

Result:

- source: `file`
- doc_id: `chat_log_20260509_5d86b5`
- recall_top5: true
- active_action_items: 0

```bash
python3 scripts/summary_command_router.py 정리 --source auto --project maester --doc-type chat_log --importance normal --action-policy none --cdp-port 9444 --bridge-ref msg_20260509_bc5605cb
```

Result:

- Document Bridge: `msg_20260509_26731ce0`
- Context Bridge: daily append, session insert, master_context update
- recall_top5: true
- active_action_items: 0

## Summary Token Eval

Environment used for TestClient only:

```text
MAESTER_READ_TOKEN=read-test
MAESTER_WRITE_TOKEN=write-test
MAESTER_SUMMARY_INGEST_TOKEN=summary-test
```

Results:

| endpoint | token | status |
|---|---:|---:|
| POST `/api/maester/summary-ingest` idempotent payload | summary | 200 |
| POST `/api/maester/summary-ingest` missing payload/url | summary | 400 |
| DELETE `/api/maester/docs/dummy` | summary | 403 |
| POST `/api/maester/actions/a/status` | summary | 403 |
| POST `/api/maester/board/command` | summary | 403 |
| POST `/api/maester/revenue-events` | summary | 403 |

## Notes

- Neo4j emitted non-fatal warnings about missing `deleted_at` on some nodes during recall.
- A smoke-test ChatGPT page was injected through CDP because no real supported ChatGPT conversation tab was active at the start of verification.
- No destructive commands were used.


---

# /home/tlswk/projects/maester-agent/HANDOFF_universal_summary_v2.md

# HANDOFF — Universal `정리` Summary Automation v2

> 작성: 2026-05-09 KST, Codex CLI
> 상태: P0 구현/검증 완료

## BLUF

Universal `정리` v2는 URL 수동 입력 MVP에서 current-tab command router로 확장됐다. 이제 `python scripts/summary_command_router.py 정리` 또는 `scripts/maester-summary`가 Chrome CDP 현재 탭을 읽고, Claude App/ChatGPT/파일을 표준 Markdown으로 렌더링해 Maester에 적재한다.

## 구현

- `tools/browser_cdp.py`
  - Chrome CDP `/json/list` page target 조회
  - `document.visibilityState` / `document.hasFocus()` 기반 current tab 선택
  - Claude App URL 감지
  - ChatGPT rendered DOM transcript export
  - 마지막 user message가 `정리`인지 판단하는 watcher helper
- `tools/summary_ingest.py`
  - `ConversationPayload` 공통 ingest 경로 추가
  - Claude App / ChatGPT / file이 같은 표준 Markdown renderer 사용
  - `payload_from_json`, `payload_to_json`, `run_payload_summary_ingest`
  - source + conversation_id + updated_at idempotency 유지
- `scripts/summary_command_router.py`
  - CLI: `python scripts/summary_command_router.py 정리`
  - source auto/current tab 감지
  - project/doc_type auto 추론
  - ingest 후 recall top5 + active ActionItem 0 검증
  - `watch` 모드로 browser watcher daemon 동작 가능
- `scripts/maester-summary`, `scripts/정리`
  - shell entrypoint wrapper
- `scripts/maester_summary_watcher.sh`
  - browser watcher wrapper
- `systemd/maester-summary-watcher.service`
  - user service template
- `scripts/summary_comms_directive_worker.py`
  - AI Comms Hub inbox에서 `@codex 정리` / `정리` directive 처리
- `api.py`
  - `/api/maester/summary-ingest`에 `MAESTER_SUMMARY_INGEST_TOKEN` 전용 권한 추가
  - summary token은 summary-ingest만 통과
  - doc delete/action status/board command/revenue event는 summary token으로 403
- `scripts/chatgpt_cdp_bridge.py`
  - `export-current` 명령 추가

## 사용법

```bash
python scripts/summary_command_router.py 정리
```

```bash
scripts/maester-summary --project auto --doc-type auto
```

```bash
scripts/정리 --source auto --cdp-port 9444
```

```bash
python scripts/summary_command_router.py watch --watch --cdp-port 9444 --poll-sec 3
```

```bash
python scripts/summary_comms_directive_worker.py --status sent
```

## 검증 결과

- Claude App current-tab:
  - URL 인자 없이 CDP current tab에서 `claude.ai/chat/bfd9eaf2-37d0-4981-903b-884394591cac` 감지
  - result: `idempotent_hit`
  - doc: `idea_20260509_b5c700`
  - recall top5: true
  - active ActionItem: 0
- ChatGPT current-tab:
  - ChatGPT CDP rendered DOM transcript export smoke test
  - doc: `chat_log_20260509_4ff7e8`
  - local Markdown: `/home/tlswk/projects/maester/context/chat-log/chatgpt_20260509_maester-summary-v2-smoke-test_c273ac0b_78af43.md`
  - Document Bridge: `msg_20260509_26731ce0`
  - Context Bridge: daily append + session insert + master_context update
  - recall top5: true
  - active ActionItem: 0
- Local file:
  - source=file ingest passed
  - doc: `chat_log_20260509_5d86b5`
  - recall top5: true
  - active ActionItem: 0
- Summary token:
  - `/api/maester/summary-ingest`: 200 with summary token on idempotent payload
  - `/api/maester/docs/{id}` DELETE: 403
  - `/api/maester/actions/{id}/status`: 403
  - `/api/maester/board/command`: 403
  - `/api/maester/revenue-events`: 403

## 운영 메모

- 기본 CDP 포트는 `9444`.
- Maester venv에 `websockets==16.0` 설치됨. `requirements.txt`에는 이미 `websockets>=10.4`가 있다.
- watcher service template은 설치만 제공한다. 실제 enable/start는 운영자가 선택한다.
- ChatGPT full transcript는 현재 DOM에 렌더링된 메시지 기준이다. 긴 대화에서 이전 메시지가 DOM에서 언로드되어 있으면 visible/rendered transcript만 저장될 수 있다.
- 데이터 삭제 없음.
- 기존 `MAESTER_WRITE_TOKEN` 외부 노출 없음.
- Tiro auto-ingest 변경 없음.
