함수그룹

MODULE_FUNCTION_GROUPS.md 기준 · 갱신: 2026-05-03 12:18:15
/volume1/web/gpt/repair_jobs/MODULE_FUNCTION_GROUPS.md 2026-05-03 12:18:15
# 영일전기철물 AI 함수 역할 그룹 지도 1차 v2

last_updated: 2026-05-03 05:18:14
root: `//GUNYOUNG/WEB/gpt`

---

## 0. 한줄판단

이 문서는 함수를 파일별로 보는 대신 “역할별 묶음”으로 정리한 1차 지도다. 리팩토링할 때 `어느 함수 묶음을 서비스로 빼야 하는지`를 보기 위한 기준점이다.

---

## 1. 스캔 대상

- ✅ `api.php`
- ✅ `engine.php`
- ✅ `engine_modules/agent/Agent.php`
- ✅ `engine_modules/tools/ToolSelector.php`
- ✅ `engine_modules/tools/CustomerTool.php`
- ✅ `engine_modules/tools/routing/RoutePipeline.php`
- ✅ `engine_modules/tools/routing/CustomerRoute.php`
- ✅ `engine_modules/capabilities/web_preflight.php`
- ✅ `partials/operator_status.php`
- ✅ `partials/debug_drawer.php`
- ✅ `partials/history_panel.php`
- ✅ `work_state.php`
- ✅ `work_report.php`
- ✅ `code_map.php`
- ✅ `module_ownership.php`
- ✅ `module_flow.php`
- ✅ `module_dependency.php`

---

## 2. 그룹 요약

| 그룹 | 함수 수 | 설명 |
|---|---:|---|
| 진입/API/공통 앞단 | 9 | 사용자 요청을 받고 trace/context/session/preflight를 준비하는 함수 묶음. |
| 건영아 호출어 / 관리자 세션 | 함수 0 + 인라인 30 | 호출어 fast path, 세션 생성/갱신/만료 관련 흐름. |
| Agent 실행 루프 | 7 | Agent run, 도구 실행, 결과 정규화, trace 조립 핵심. |
| 승인 / pending / 고위험 실행 차단 | 8 | 승인 대기 저장, 승인 복원, 고위험 작업 실행 차단. |
| 라우팅 / ToolSelector / RoutePipeline | 26 | 질문을 어떤 도구로 보낼지 판단하는 함수 묶음. |
| 고객 조회 / 고객명 추출 | 29 | 고객 리스트, 고객명 추출, 조회 토큰 정리. |
| 고객 삭제 / 이미 삭제 힌트 | 7 | 삭제 요청 판정, 고객명/이유 추출, 삭제 실행, deleted export hint. |
| 고객 수정 / 고객 점검 | 5 | 고객 필드 수정, 승인 확인, 고객 정보 누락 점검. |
| web_capability / Agent 우회 읽기 | 18 | 읽기 전용 요청을 Agent보다 앞에서 빠르게 처리하는 함수 묶음. |
| 작업기록 / 히스토리 / 메모리 | 15 | 작업기록, 히스토리 기간 조회, 메모리 조회/저장 라우팅. |
| 일정 / 금액 / 재고 / 견적 신호 | 5 | 도메인별 업무 신호 판정 함수 묶음. |
| LLM 선택 / fallback / chat | 2 | 규칙으로 못 잡은 질문을 LLM 또는 chat fallback으로 처리하는 묶음. |
| 운영자 UI / 문서 뷰어 | 14 | 운영자 패널, 작업상태/보고서/코드지도/모듈문서 뷰어 관련 함수. |
| DB / 저장소 / 데이터 경로 | 1 | PDO, storage, data path, DB 관련 함수. |
| Trace / Debug / Result Inspector | 8 | trace, debug, result inspector, 진단용 로그 관련 함수. |
| 기타 / 미분류 | 0 | 현재 키워드 기준으로 특정 역할에 확실히 묶이지 않은 함수. |

---

## 3. 역할별 함수 목록

### 진입/API/공통 앞단

- key: `entry_api`
- 설명: 사용자 요청을 받고 trace/context/session/preflight를 준비하는 함수 묶음.
- 함수 수: 9

- `gpt_ui_history_append_v2()` → `api.php:109`
- `api_code_keyword_location_bypass_capability_v1()` → `api.php:246`
- `api_q_person_search_rewrite_v3()` → `api.php:289`
- `api_person_search_bypass_capability_v1()` → `api.php:317`
- `api_router_kernel_inject_trace_v1()` → `api.php:639`
- `gpt_append_api_log()` → `engine.php:207`
- `gpt_process_env()` → `engine.php:228`
- `gpt_send()` → `engine.php:294`
- `gpt_decode_json_payload()` → `engine.php:404`

---

### 건영아 호출어 / 관리자 세션

- key: `admin_session_wake`
- 설명: 호출어 fast path, 세션 생성/갱신/만료 관련 흐름.
- 함수 수: 0

- 없음

---

### Agent 실행 루프

- key: `agent_core`
- 설명: Agent run, 도구 실행, 결과 정규화, trace 조립 핵심.
- 함수 수: 7

- `Agent::run()` (public) → `engine_modules/agent/Agent.php:135`
- `Agent::executeTool()` (private) → `engine_modules/agent/Agent.php:2140`
- `Agent::normalizeToolResult()` (private) → `engine_modules/agent/Agent.php:2615`
- `Agent::summarizeTools()` (private) → `engine_modules/agent/Agent.php:3121`
- `Agent::compactJson()` (private) → `engine_modules/agent/Agent.php:3141`
- `Agent::resultType()` (private) → `engine_modules/agent/Agent.php:3155`
- `Agent::agent_process()` → `engine_modules/agent/Agent.php:3265`

---

### 승인 / pending / 고위험 실행 차단

- key: `approval_pending`
- 설명: 승인 대기 저장, 승인 복원, 고위험 작업 실행 차단.
- 함수 수: 8

- `Agent::tryResolveSystemPendingApproval()` (private) → `engine_modules/agent/Agent.php:1299`
- `Agent::saveSystemPendingApproval()` (private) → `engine_modules/agent/Agent.php:1437`
- `Agent::guardSystemExecution()` (private) → `engine_modules/agent/Agent.php:1478`
- `Agent::isJudgeOnlyRequest()` (private) → `engine_modules/agent/Agent.php:2050`
- `Agent::buildJudgeOnlyMessage()` (private) → `engine_modules/agent/Agent.php:2055`
- `Agent::pendingPath()` (private static) → `engine_modules/agent/Agent.php:3168`
- `Agent::savePendingQuestion()` (private static) → `engine_modules/agent/Agent.php:3178`
- `Agent::resolvePendingQuestion()` (private static) → `engine_modules/agent/Agent.php:3194`

---

### 라우팅 / ToolSelector / RoutePipeline

- key: `routing_selector`
- 설명: 질문을 어떤 도구로 보낼지 판단하는 함수 묶음.
- 함수 수: 26

- `ToolSelector::selectTools()` (public) → `engine_modules/tools/ToolSelector.php:46`
- `ToolSelector::applyRouteDecisionObserverV3()` (private) → `engine_modules/tools/ToolSelector.php:1996`
- `ToolSelector::applyRouteDecisionControlledV1()` (private) → `engine_modules/tools/ToolSelector.php:2034`
- `ToolSelector::applyRouteDecisionCompareTraceV6()` (private) → `engine_modules/tools/ToolSelector.php:2081`
- `ToolSelector::matchRecordContextNoteRouteV1()` (private) → `engine_modules/tools/ToolSelector.php:2123`
- `ToolSelector::matchPersonContextRoutesV2()` (private) → `engine_modules/tools/ToolSelector.php:2156`
- `ToolSelector::selectByRules()` (private) → `engine_modules/tools/ToolSelector.php:2321`
- `ToolSelector::matchRule()` (private) → `engine_modules/tools/ToolSelector.php:3248`
- `ToolSelector::ruleDecisionIfRegistered()` (private) → `engine_modules/tools/ToolSelector.php:3258`
- `ToolSelector::ruleDecision()` (private) → `engine_modules/tools/ToolSelector.php:3285`
- `ToolSelector::matchedTerms()` (private) → `engine_modules/tools/ToolSelector.php:3315`
- `ToolSelector::createPrompt()` (private) → `engine_modules/tools/ToolSelector.php:3368`
- `ToolSelector::parseResponse()` (private) → `engine_modules/tools/ToolSelector.php:3488`
- `ToolSelector::canonicalToolName()` (private) → `engine_modules/tools/ToolSelector.php:3554`
- `ToolSelector::correctMisroutedTool()` (private) → `engine_modules/tools/ToolSelector.php:3573`
- `ToolSelector::tsRouteDecisionObserverV2()` (private) → `engine_modules/tools/ToolSelector.php:3720`
- `ToolSelector::tsRouteDecisionTraceV2()` (private) → `engine_modules/tools/ToolSelector.php:3763`
- `ToolSelector::tsRouteDecisionObserverLinesV3()` (private) → `engine_modules/tools/ToolSelector.php:3793`
- `ToolSelector::tsRouteDecisionCompareLinesV5()` (private) → `engine_modules/tools/ToolSelector.php:3833`
- `ToolSelector::tsRouteDecisionEmitLineV5()` (private) → `engine_modules/tools/ToolSelector.php:3895`
- `ToolSelector::tsRouteDecisionControlledSpecV1()` (private) → `engine_modules/tools/ToolSelector.php:4046`
- `ToolSelector::tsRouteDecisionNormalizeScheduleDateQueryV4()` (private) → `engine_modules/tools/ToolSelector.php:4081`
- `CustomerRoute::matchDeleteBeatsChat()` (public static) → `engine_modules/tools/routing/CustomerRoute.php:99`
- `RoutePipeline::match()` (public static) → `engine_modules/tools/routing/RoutePipeline.php:19`
- `RoutePipeline::routeClassToCategory()` (private static) → `engine_modules/tools/routing/RoutePipeline.php:86`
- `RoutePipeline::loadRoutes()` (private static) → `engine_modules/tools/routing/RoutePipeline.php:128`

---

### 고객 조회 / 고객명 추출

- key: `customer_lookup`
- 설명: 고객 리스트, 고객명 추출, 조회 토큰 정리.
- 함수 수: 29

- `CustomerTool::name()` (public) → `engine_modules/tools/CustomerTool.php:20`
- `CustomerTool::description()` (public) → `engine_modules/tools/CustomerTool.php:25`
- `CustomerTool::intents()` (public) → `engine_modules/tools/CustomerTool.php:30`
- `CustomerTool::validate()` (public) → `engine_modules/tools/CustomerTool.php:35`
- `CustomerTool::execute()` (public) → `engine_modules/tools/CustomerTool.php:45`
- `CustomerTool::isCustomerAuditRequest()` (private) → `engine_modules/tools/CustomerTool.php:229`
- `CustomerTool::looksLikeGenericCustomerQuery()` (private) → `engine_modules/tools/CustomerTool.php:251`
- `CustomerTool::extractCustomerName()` (private) → `engine_modules/tools/CustomerTool.php:257`
- `CustomerTool::isGenericCustomerToken()` (private) → `engine_modules/tools/CustomerTool.php:304`
- `CustomerTool::listCustomerAuditTargets()` (private) → `engine_modules/tools/CustomerTool.php:334`
- `CustomerTool::buildCustomerAuditMessage()` (private) → `engine_modules/tools/CustomerTool.php:496`
- `CustomerTool::customerAuditExampleName()` (private) → `engine_modules/tools/CustomerTool.php:654`
- `CustomerTool::detectCustomerAuditTable()` (private) → `engine_modules/tools/CustomerTool.php:689`
- `CustomerTool::isNameOnlyCustomerRow()` (private) → `engine_modules/tools/CustomerTool.php:838`
- `CustomerTool::hasCustomerUpdateApproval()` (private) → `engine_modules/tools/CustomerTool.php:1035`
- `CustomerTool::extractCustomerNameForUpdate()` (private) → `engine_modules/tools/CustomerTool.php:1076`
- `CustomerTool::cleanUpdateTextValue()` (private) → `engine_modules/tools/CustomerTool.php:1095`
- `CustomerTool::findCustomerRowForUpdate()` (private) → `engine_modules/tools/CustomerTool.php:1104`
- `CustomerTool::extractCustomerNameForDelete()` (private) → `engine_modules/tools/CustomerTool.php:1385`
- `CustomerTool::findCustomerRowForDelete()` (private) → `engine_modules/tools/CustomerTool.php:1658`
- `CustomerTool::pickColumn()` (private) → `engine_modules/tools/CustomerTool.php:1751`
- `CustomerTool::pickColumns()` (private) → `engine_modules/tools/CustomerTool.php:1763`
- `CustomerTool::cleanValue()` (private) → `engine_modules/tools/CustomerTool.php:1776`
- `CustomerTool::shorten()` (private) → `engine_modules/tools/CustomerTool.php:1789`
- `CustomerTool::quoteIdent()` (private) → `engine_modules/tools/CustomerTool.php:1803`
- `CustomerRoute::matchLookup()` (public static) → `engine_modules/tools/routing/CustomerRoute.php:20`
- `CustomerRoute::normalize()` (private static) → `engine_modules/tools/routing/CustomerRoute.php:135`
- `CustomerRoute::hasCustomerLookupSignal()` (private static) → `engine_modules/tools/routing/CustomerRoute.php:140`
- `CustomerRoute::isBlocked()` (private static) → `engine_modules/tools/routing/CustomerRoute.php:166`

---

### 고객 삭제 / 이미 삭제 힌트

- key: `customer_delete`
- 설명: 삭제 요청 판정, 고객명/이유 추출, 삭제 실행, deleted export hint.
- 함수 수: 7

- `CustomerTool::isCustomerDeleteRequest()` (private) → `engine_modules/tools/CustomerTool.php:1249`
- `CustomerTool::handleCustomerDeleteRequest()` (private) → `engine_modules/tools/CustomerTool.php:1268`
- `CustomerTool::hasCustomerDeleteApproval()` (private) → `engine_modules/tools/CustomerTool.php:1374`
- `CustomerTool::cleanCustomerDeleteName()` (private) → `engine_modules/tools/CustomerTool.php:1416`
- `CustomerTool::extractCustomerDeleteReason()` (private) → `engine_modules/tools/CustomerTool.php:1431`
- `CustomerTool::findDeletedCustomerExportHintV1()` (private) → `engine_modules/tools/CustomerTool.php:1463`
- `CustomerTool::deleteCustomerRow()` (private) → `engine_modules/tools/CustomerTool.php:1715`

---

### 고객 수정 / 고객 점검

- key: `customer_update_audit`
- 설명: 고객 필드 수정, 승인 확인, 고객 정보 누락 점검.
- 함수 수: 5

- `CustomerTool::isCustomerFieldUpdateRequest()` (private) → `engine_modules/tools/CustomerTool.php:884`
- `CustomerTool::handleCustomerFieldUpdate()` (private) → `engine_modules/tools/CustomerTool.php:910`
- `CustomerTool::parseCustomerUpdateFields()` (private) → `engine_modules/tools/CustomerTool.php:1040`
- `CustomerTool::mapCustomerUpdateColumns()` (private) → `engine_modules/tools/CustomerTool.php:1149`
- `CustomerTool::saveCustomerUpdateFields()` (private) → `engine_modules/tools/CustomerTool.php:1196`

---

### web_capability / Agent 우회 읽기

- key: `web_capability`
- 설명: 읽기 전용 요청을 Agent보다 앞에서 빠르게 처리하는 함수 묶음.
- 함수 수: 18

- `gpt_web_capability_normalize_query()` → `engine_modules/capabilities/web_preflight.php:75`
- `gpt_web_capability_append_log_cause_hint()` → `engine_modules/capabilities/web_preflight.php:122`
- `gpt_web_date_fact_find_pending_day_notes()` → `engine_modules/capabilities/web_preflight.php:178`
- `gpt_web_date_fact_preflight()` → `engine_modules/capabilities/web_preflight.php:373`
- `gpt_web_review_human_trace()` → `engine_modules/capabilities/web_preflight.php:504`
- `gpt_web_is_code_stats_query_v1()` → `engine_modules/capabilities/web_preflight.php:619`
- `gpt_web_is_save_intent_bypass_v1()` → `engine_modules/capabilities/web_preflight.php:630`
- `gpt_web_review_preflight()` → `engine_modules/capabilities/web_preflight.php:662`
- `gpt_web_schedule_overlay_human_trace()` → `engine_modules/capabilities/web_preflight.php:791`
- `gpt_web_schedule_overlay_parse_range()` → `engine_modules/capabilities/web_preflight.php:947`
- `gpt_web_schedule_overlay_extract_pending_notes()` → `engine_modules/capabilities/web_preflight.php:1016`
- `gpt_web_schedule_overlay_extract_dates()` → `engine_modules/capabilities/web_preflight.php:1158`
- `gpt_web_schedule_overlay_weekday()` → `engine_modules/capabilities/web_preflight.php:1193`
- `gpt_web_schedule_overlay_append_to_message()` → `engine_modules/capabilities/web_preflight.php:1205`
- `gpt_web_schedule_overlay_base_query()` → `engine_modules/capabilities/web_preflight.php:1237`
- `gpt_web_schedule_overlay_preflight()` → `engine_modules/capabilities/web_preflight.php:1256`
- `gpt_web_capability_human_trace()` → `engine_modules/capabilities/web_preflight.php:1379`
- `gpt_web_capability_preflight()` → `engine_modules/capabilities/web_preflight.php:1584`

---

### 작업기록 / 히스토리 / 메모리

- key: `worklog_history_memory`
- 설명: 작업기록, 히스토리 기간 조회, 메모리 조회/저장 라우팅.
- 함수 수: 15

- `gpt_ui_history_file_v2()` → `api.php:49`
- `gpt_ui_history_decode_json_v2()` → `api.php:63`
- `gpt_is_meta_history_lookup_turn()` → `api.php:80`
- `gpt_ui_history_load_v2()` → `api.php:162`
- `gpt_ui_history_json_v2()` → `api.php:224`
- `gpt_ui_history_search_v1()` → `api.php:465`
- `ToolSelector::matchPersonCustomerMemoryRoutesV1()` (private) → `engine_modules/tools/ToolSelector.php:2213`
- `ToolSelector::matchMemoryHistoryLookupEarlyV2()` (private) → `engine_modules/tools/ToolSelector.php:2290`
- `ToolSelector::isMemoryListIntent()` (private) → `engine_modules/tools/ToolSelector.php:3652`
- `ToolSelector::isMemoryCreateIntent()` (private) → `engine_modules/tools/ToolSelector.php:3666`
- `ToolSelector::hasWorklogStrongSignal()` (private) → `engine_modules/tools/ToolSelector.php:3680`
- `ToolSelector::tsScheduleWorklogComboSpecsV1()` (private) → `engine_modules/tools/ToolSelector.php:3919`
- `ToolSelector::tsScheduleQueryFromWorklogComboV1()` (private) → `engine_modules/tools/ToolSelector.php:4007`
- `ToolSelector::tsWorklogReadQueryFromComboV1()` (private) → `engine_modules/tools/ToolSelector.php:4024`
- `CustomerRoute::matchUpdateBeatsHistoryMemo()` (public static) → `engine_modules/tools/routing/CustomerRoute.php:58`

---

### 일정 / 금액 / 재고 / 견적 신호

- key: `schedule_money_stock_quote`
- 설명: 도메인별 업무 신호 판정 함수 묶음.
- 함수 수: 5

- `yy_schedule_create_auto_execute_allowed_v1()` → `engine_modules/agent/Agent.php:12`
- `gpt_schedule_year_range_fix_v1()` → `engine_modules/capabilities/web_preflight.php:6`
- `ToolSelector::hasPaymentSignal()` (private) → `engine_modules/tools/ToolSelector.php:3694`
- `ToolSelector::hasExpenseSignal()` (private) → `engine_modules/tools/ToolSelector.php:3705`
- `ToolSelector::scheduleEntryGuardV1()` (private static) → `engine_modules/tools/ToolSelector.php:4132`

---

### LLM 선택 / fallback / chat

- key: `llm_fallback_chat`
- 설명: 규칙으로 못 잡은 질문을 LLM 또는 chat fallback으로 처리하는 묶음.
- 함수 수: 2

- `ToolSelector::askLLMToSelect()` (private) → `engine_modules/tools/ToolSelector.php:3349`
- `ToolSelector::callLLM()` (private) → `engine_modules/tools/ToolSelector.php:3415`

---

### 운영자 UI / 문서 뷰어

- key: `ui_operator_docs`
- 설명: 운영자 패널, 작업상태/보고서/코드지도/모듈문서 뷰어 관련 함수.
- 함수 수: 14

- `Agent::__construct()` (public) → `engine_modules/agent/Agent.php:117`
- `Agent::buildSystemApprovalPlanMessage()` (private) → `engine_modules/agent/Agent.php:2099`
- `ToolSelector::__construct()` (public) → `engine_modules/tools/ToolSelector.php:41`
- `ToolSelector::normalizeQuery()` (private) → `engine_modules/tools/ToolSelector.php:3198`
- `ToolSelector::registryToolNames()` (private) → `engine_modules/tools/ToolSelector.php:3203`
- `ToolSelector::firstRegisteredTool()` (private) → `engine_modules/tools/ToolSelector.php:3218`
- `ToolSelector::makeToolPayload()` (private) → `engine_modules/tools/ToolSelector.php:3229`
- `ToolSelector::getToolDescriptions()` (private) → `engine_modules/tools/ToolSelector.php:3335`
- `RoutePipeline::loadCategoryMapMeta()` (private static) → `engine_modules/tools/routing/RoutePipeline.php:104`
- `yi_operator_latest_ssh_answer_safe_v3()` → `partials/operator_status.php:41`
- `copyReport()` → `work_report.php:210`
- `copyHandoff()` → `work_report.php:213`
- `copyState()` → `work_state.php:204`
- `copyHandoff()` → `work_state.php:207`

---

### DB / 저장소 / 데이터 경로

- key: `storage_db`
- 설명: PDO, storage, data path, DB 관련 함수.
- 함수 수: 1

- `CustomerTool::resolvePdo()` (private) → `engine_modules/tools/CustomerTool.php:666`

---

### Trace / Debug / Result Inspector

- key: `trace_debug_inspector`
- 설명: trace, debug, result inspector, 진단용 로그 관련 함수.
- 함수 수: 8

- `gpt_current_trace_id()` → `engine.php:192`
- `gpt_format_trace_lines()` → `engine.php:261`
- `Agent::addTrace()` (public) → `engine_modules/agent/Agent.php:125`
- `Agent::getTrace()` (public) → `engine_modules/agent/Agent.php:130`
- `Agent::inspectWorklogBeforeApproval()` (private) → `engine_modules/agent/Agent.php:1803`
- `Agent::isBadWorklogApprovalTargetToken()` (private) → `engine_modules/agent/Agent.php:2025`
- `Agent::buildWorklogPreApprovalBlockMessage()` (private) → `engine_modules/agent/Agent.php:2037`
- `Agent::classifyQueryForTrace()` (private) → `engine_modules/agent/Agent.php:3053`

---

### 기타 / 미분류

- key: `misc`
- 설명: 현재 키워드 기준으로 특정 역할에 확실히 묶이지 않은 함수.
- 함수 수: 0

- 없음

---

## 4. 인라인/마커 기반 역할 블록

v1은 함수명만 분류해서, 함수로 분리되지 않은 핵심 로직이 0개로 보이는 문제가 있었다. v2에서는 마커 기반 인라인 블록을 별도로 기록한다.

### 건영아 호출어 / 관리자 세션 인라인 블록

- key: `admin_session_wake`
- 설명: 함수로 분리되지 않고 api.php, Agent::run() 안에 직접 들어간 호출어/세션 처리 마커.
- 블록/마커 수: 30

- `engine_modules/agent/Agent.php:157` · `AGENT_GEONYEONG_WAKE_WORD_FAST_PATH_V1`
- `engine_modules/agent/Agent.php:163` · `AGENT_GEONYEONG_ADMIN_SESSION_SLIDING_10MIN_V2`
- `engine_modules/agent/Agent.php:165` · `geonyeong_admin_session.json`
- `engine_modules/agent/Agent.php:185` · `[agent.admin_session]`
- `engine_modules/agent/Agent.php:186` · `[agent.admin_session]`
- `engine_modules/agent/Agent.php:187` · `[agent.admin_session]`
- `engine_modules/agent/Agent.php:188` · `[agent.admin_session]`
- `engine_modules/agent/Agent.php:190` · `[agent.admin_session]`
- `engine_modules/agent/Agent.php:191` · `[agent.admin_session]`
- `engine_modules/agent/Agent.php:210` · `[agent.wake.geonyeong]`
- `engine_modules/agent/Agent.php:211` · `[agent.wake.geonyeong]`
- `engine_modules/agent/Agent.php:212` · `[agent.wake.geonyeong]`
- `engine_modules/agent/Agent.php:214` · `AGENT_GEONYEONG_ADMIN_SESSION_SLIDING_10MIN_V2`
- `engine_modules/agent/Agent.php:217` · `geonyeong_admin_session.json`
- `engine_modules/agent/Agent.php:237` · `[agent.admin_session]`
- `engine_modules/agent/Agent.php:238` · `[agent.admin_session]`
- `engine_modules/agent/Agent.php:239` · `[agent.admin_session]`
- `engine_modules/agent/Agent.php:240` · `[agent.admin_session]`
- `api.php:865` · `API_GEONYEONG_ADMIN_SESSION_TOUCH_BEFORE_PREFLIGHT_V1`
- `api.php:869` · `geonyeong_admin_session.json`
- `api.php:888` · `api_before_web_capability_preflight`
- `api.php:895` · `[api.admin_session]`
- `api.php:896` · `[api.admin_session]`
- `api.php:897` · `[api.admin_session]`
- `api.php:898` · `[api.admin_session]`
- `api.php:899` · `[api.admin_session]`
- `api.php:903` · `[api.admin_session]`
- `api.php:904` · `[api.admin_session]`
- `api.php:905` · `[api.admin_session]`
- `api.php:967` · `API_GEONYEONG_ADMIN_SESSION_TOUCH_BEFORE_PREFLIGHT_V1`

---

### 고객 삭제 pending 재라우팅 인라인 블록

- key: `customer_delete_pending_reroute`
- 설명: 승인 pending이 chat으로 저장됐을 때 customer delete로 강제 복원하는 안전장치.
- 블록/마커 수: 3

- `engine_modules/agent/Agent.php:1368` · `AGENT_PENDING_CHAT_CUSTOMER_DELETE_INLINE_REROUTE_V1`
- `engine_modules/agent/Agent.php:1402` · `chat_to_customer_delete_inline_v1`
- `engine_modules/agent/Agent.php:1414` · `delete_intent`

---

### 이미 삭제된 고객 힌트/파서 마커

- key: `customer_deleted_hint`
- 설명: deleted export 기록을 사람용 요약으로 바꾸는 CustomerTool 내부 마커.
- 블록/마커 수: 5

- `engine_modules/tools/CustomerTool.php:1459` · `CUSTOMER_DELETE_ALREADY_DELETED_SUMMARY_FORMAT_V2`
- `engine_modules/tools/CustomerTool.php:1463` · `findDeletedCustomerExportHintV1`
- `engine_modules/tools/CustomerTool.php:1506` · `CUSTOMER_DELETE_ALREADY_DELETED_PARSE_FIX_V3`
- `engine_modules/tools/CustomerTool.php:1624` · `already_deleted_summary_format_v2`
- `engine_modules/tools/CustomerTool.php:1680` · `findDeletedCustomerExportHintV1`

---

### api.php web_capability 앞단 공통 처리 마커

- key: `api_web_capability_touch`
- 설명: Agent를 우회하는 요청에도 공통 세션/trace를 적용하는 api.php 앞단 마커.
- 블록/마커 수: 5

- `api.php:910` · `WEB_CAPABILITY_PREFLIGHT_V1`
- `api.php:923` · `gpt_web_capability_preflight`
- `api.php:959` · `gpt_web_capability_preflight`
- `api.php:965` · `gpt_web_capability_preflight`
- `api.php:967` · `API_GEONYEONG_ADMIN_SESSION_TOUCH_BEFORE_PREFLIGHT_V1_TRACE_ATTACH`

---


## 5. 리팩토링 후보 묶음

### 1순위: CustomerTool 분리
- `고객 삭제 / 이미 삭제 힌트` → `CustomerDeleteService.php`, `CustomerDeletedHintService.php`
- `고객 조회 / 고객명 추출` → `CustomerSearchService.php`
- `고객 수정 / 고객 점검` → `CustomerUpdateService.php`, `CustomerAuditService.php`

### 2순위: Agent 분리
- `승인 / pending / 고위험 실행 차단` → `ApprovalPendingService.php`
- `건영아 호출어 / 관리자 세션` → `AdminSessionService.php`
- `Agent 실행 루프` → Agent에는 orchestration만 남기고 세부 실행은 `AgentToolRunner.php`

### 3순위: ToolSelector 분리
- `라우팅 / ToolSelector / RoutePipeline` → legacy rule을 `routing/*.php` 또는 `selector_routes/*.php`로 이동

---

## 5. 다음 문서화 순서

1. `REFACTOR_ROADMAP.md`: 실제 분리 순서표 만들기
2. `tools/build_module_docs.php`: 구조 문서 자동 갱신 통합 스크립트 만들기