🛠 영일전기철물 GPT 수리 콘솔 v3

작업 요약 중심 · 긴 로그 접기 · 읽기 전용 · 2026-10-03 09:27:08

📌 선택된 작업 폴더 요약

작업 폴더: repair_jobs/logs/api_call_counter_scan_v1_20260505_121911
수정시각: 2026-05-05 12:19:35

🗂 최근 작업 폴더

api_call_counter_scan_v1_20260505_121911
2026-05-05 12:19:35
api_call_counter_scan_v1_20260505_121711
2026-05-05 12:17:41
run_events_duplicate_readonly_v1_20260505_121207
2026-05-05 12:12:07
run_events_output_preview_readonly_v1_20260505_115734
2026-05-05 11:57:37
life_memo_pending_fail_readonly_v1_20260504_211446
2026-05-04 21:14:54
routing_suspect_deep_readonly_v1_20260504_180035
2026-05-04 18:01:00
전체 작업 폴더 보기 · 30개 api_call_counter_scan_v1_20260505_121911
2026-05-05 12:19:35
api_call_counter_scan_v1_20260505_121711
2026-05-05 12:17:41
run_events_duplicate_readonly_v1_20260505_121207
2026-05-05 12:12:07
run_events_output_preview_readonly_v1_20260505_115734
2026-05-05 11:57:37
life_memo_pending_fail_readonly_v1_20260504_211446
2026-05-04 21:14:54
routing_suspect_deep_readonly_v1_20260504_180035
2026-05-04 18:01:00
routing_concept_readonly_diagnosis_v1_20260504_175620
2026-05-04 17:56:29
ecosystem_ssh_style_log_console_v1_20260502_144432
2026-05-02 14:44:33
ecosystem_inline_log_panels_v1_20260502_144145
2026-05-02 14:41:46
agent_run_event_system_knowledge_log_v1_20260502_143750
2026-05-02 14:37:50
system_knowledge_log_foundation_v1_20260502_143612
2026-05-02 14:36:13
system_change_log_from_ssh_answers_v1_20260502_143132
2026-05-02 14:31:34
save_receipt_legacy_backfill_v1_20260502_142654
2026-05-02 14:26:56
agent_save_receipt_route_spec_normalize_v3_20260502_142425
2026-05-02 14:24:27
save_receipt_route_spec_and_guard_fix_v2_20260502_142257
2026-05-02 14:22:59
save_receipt_read_tool_v1_20260502_142147
2026-05-02 14:21:48
system_execution_guard_history_memo_read_return_null_fix_v3_20260502_141939
2026-05-02 14:19:42
system_execution_guard_history_memo_read_allow_v2_20260502_141809
2026-05-02 14:18:10
history_memo_read_no_approval_guard_v1_20260502_141705
2026-05-02 14:17:06
history_memo_save_receipt_call_position_fix_v2_20260502_141426
2026-05-02 14:14:28
history_memo_save_receipt_v1_20260502_141316
2026-05-02 14:13:18
save_ecosystem_receipt_shell_v1_20260502_140810
2026-05-02 14:08:11
call_ecosystem_dashboard_v1_20260502_140650
2026-05-02 14:06:51
save_ecosystem_dashboard_v1_20260502_140206
2026-05-02 14:02:07
resolve_route_sanity_life_history_success_v1_20260502_135940
2026-05-02 13:59:40
route_sanity_life_history_allow_v1_20260502_135826
2026-05-02 13:58:31
route_sanity_life_history_context_fix_v1_20260502_135712
2026-05-02 13:57:12
toolselector_data_source_map_block_replace_v2_20260502_135349
2026-05-02 13:53:57
toolselector_data_source_map_strict_meta_guard_v1_20260502_135217
2026-05-02 13:52:19
data_source_map_write_false_positive_guard_v1_20260502_135053
2026-05-02 13:50:54

📄 선택 폴더 핵심 파일

전체 파일 목록 보기 · 2개

📦 최근 백업 폴더

agent_stage_trace_visibility_fix_v1_20260526_142525
2026-05-26 14:28:50
clean_arch_permission_policy_v1_20260526_142116
2026-05-26 14:21:34
clean_arch_route_decision_contract_v1_20260526_141103
2026-05-26 14:12:08
legacy_permission_phase_cleanup_v1_20260526_092753
2026-05-26 09:34:59
systemgate_permission_phase_normalization_v1_20260526_092213
2026-05-26 09:22:17
전체 백업 폴더 보기 · 30개
agent_stage_trace_visibility_fix_v1_20260526_142525
2026-05-26 14:28:50
clean_arch_permission_policy_v1_20260526_142116
2026-05-26 14:21:34
clean_arch_route_decision_contract_v1_20260526_141103
2026-05-26 14:12:08
legacy_permission_phase_cleanup_v1_20260526_092753
2026-05-26 09:34:59
systemgate_permission_phase_normalization_v1_20260526_092213
2026-05-26 09:22:17
schedule_update_delete_dcv2_policy_v1_20260526_091250
2026-05-26 09:12:52
dcv2_schedule_direct_execute_policy_v1_20260526_082611
2026-05-26 08:26:14
dcv2_schedule_family_priority_fix_v1_20260526_081851
2026-05-26 08:18:53
hjl_schedule_memory_recall_noise_fix_v1_20260525_233331
2026-05-25 23:33:33
schedule_auto_execute_dedupe_v1_20260525_175049
2026-05-25 17:50:51
schedule_create_date_preflight_bypass_v1_20260525_174121
2026-05-25 17:45:00
source_control_baseline_policy_v1_20260525_172231
2026-05-25 17:22:32
systemgate_product_history_guard_v1_20260525_170927
2026-05-25 17:09:28
product_read_operation_guard_v1_20260525_170620
2026-05-25 17:06:21
approval_dryrun_pending_skip_v1_20260525_170234
2026-05-25 17:02:35
stock_write_like_rule_fix_v1_20260525_165752
2026-05-25 16:57:54
stock_list_intent_before_clean_v1_20260525_164851
2026-05-25 16:48:54
stock_read_fastlane_v1_20260525_164339
2026-05-25 16:43:41
fix_user_ini_opcache_warning_v1_20260525_131328
2026-05-25 13:13:28
ops_probe_copy_closeout_on_nas_v1_20260525_130112
2026-05-25 13:01:12
ops_foundation_cleanup_v1_20260525_082317
2026-05-25 08:23:18
codex_canonical_strict_operation_create_fix_v1_20260524_231339
2026-05-24 23:13:41
api_intent_classifier_trace_fix_v1_20260524_225919
2026-05-24 22:59:19
payment_read_clean_query_claude_v3_20260524_223049
2026-05-24 22:30:51
payment_read_clean_query_final_patch_v1_20260524_222830
2026-05-24 22:28:30
read_route_trace_clean_claude_v2_20260524
2026-05-24 21:43:18
read_route_precedence_claude_v1_20260524_205435
2026-05-24 20:54:37
read_route_precedence_patch_v2_20260524_204657
2026-05-24 20:46:57
read_route_precedence_patch_v1_20260524_204311
2026-05-24 20:43:11
worklog_pending_leak_live_patch_v1_20260522_180409
2026-05-22 18:04:11

🔍 파일 미리보기

repair_jobs/backups/clean_arch_permission_policy_v1_20260526_142116/RouteDecision.php.bak
<?php
declare(strict_types=1);

/**
 * 📁 engine_modules/contracts/RouteDecision.php
 * INTERNAL_GPT_CONTEXT_ECOSYSTEM_BASE_V1
 *
 * 주의: routing/RouteDecision.php가 별도 존재하므로 이 파일은 routing 쪽과 충돌 없도록
 *      클래스명을 RouteDecisionContract 로 둔다.
 *
 * 역할: 라우팅 최종 결정의 최소 표준 모양.
 *
 * 필드:
 *   - intent          string     표준 intent/domain
 *   - operation       string     read/create/update/delete/write/diagnose
 *   - permission      string     READ_ONLY/APPROVAL_REQUIRED/AUTO_EXECUTE_ALLOWED 등
 *   - selected_tool   string     실제로 실행될 tool name
 *   - tool            string     selected_tool 호환 alias
 *   - allowed_tools   list<str>  허용된 후보
 *   - blocked_tools   list<str>  차단된 후보
 *   - action_phase    string     answer/execute_direct/make_plan_then_wait_confirm 등
 *   - needs_approval  bool       승인 필요 여부
 *   - is_binding      bool       하위 라우터가 존중해야 하는 결정인지 여부
 *   - reason          string     선택 이유
 *   - source          string     결정 모듈
 *   - confidence      float      [0.0, 1.0]
 */
final class RouteDecisionContract
{
    public const VERSION = 'route_decision_contract_v2_20260526';

    public static function ok(
        string $selectedTool,
        array $allowed = [],
        array $blocked = [],
        float $confidence = 1.0,
        string $source = '',
        string $reason = ''
    ): array {
        return self::normalize([
            'ok'             => true,
            'selected_tool'  => $selectedTool,
            'allowed_tools'  => $allowed,
            'blocked_tools'  => $blocked,
            'confidence'     => $confidence,
            'source'         => $source,
            'reason'         => $reason,
        ]);
    }

    public static function blocked(string $reason, string $source = '', array $blocked = []): array
    {
        return self::normalize([
            'ok'             => false,
            'selected_tool'  => '',
            'allowed_tools'  => [],
            'blocked_tools'  => $blocked,
            'confidence'     => 0.0,
            'source'         => $source,
            'reason'         => $reason,
        ]);
    }

    public static function fromRouterGate(array $raw): array
    {
        $tool = (string)($raw['tool'] ?? $raw['selected_tool'] ?? '');
        $allowed = $raw['allowed_tools'] ?? [];
        if (!is_array($allowed)) {
            $allowed = [];
        }
        if ($allowed === [] && $tool !== '') {
            $allowed = [$tool];
        }
        $permission = (string)($raw['permission'] ?? 'READ_ONLY');
        $needsApproval = array_key_exists('needs_approval', $raw)
            ? (bool)$raw['needs_approval']
            : self::permissionNeedsApproval($permission);

        return self::normalize([
            'ok'             => !empty($raw['is_binding']),
            'domain'         => (string)($raw['domain'] ?? ''),
            'intent'         => (string)($raw['intent'] ?? $raw['domain'] ?? $tool),
            'operation'      => (string)($raw['operation'] ?? 'read'),
            'permission'     => $permission,
            'selected_tool'  => $tool,
            'tool'           => $tool,
            'allowed_tools'  => $allowed,
            'blocked_tools'  => $raw['blocked_tools'] ?? [],
            'action_phase'   => (string)($raw['action_phase'] ?? $raw['phase'] ?? ''),
            'needs_approval' => $needsApproval,
            'is_binding'     => (bool)($raw['is_binding'] ?? false),
            'confidence'     => (float)($raw['confidence'] ?? 0.0),
            'source'         => (string)($raw['source'] ?? 'router_gate'),
            'reason'         => (string)($raw['reason'] ?? ''),
            'risk_level'     => (string)($raw['risk_level'] ?? ''),
            'dcv2'           => is_array($raw['dcv2'] ?? null) ? $raw['dcv2'] : [],
        ]);
    }

    public static function systemContextPatch(array $decision): array
    {
        $d = self::normalize($decision);
        $tool = (string)($d['tool'] ?? $d['selected_tool'] ?? '');
        $allowed = is_array($d['allowed_tools'] ?? null) ? array_values($d['allowed_tools']) : [];
        if ($allowed === [] && $tool !== '') {
            $allowed = [$tool];
        }

        return [
            'system_intent'         => (string)($d['intent'] ?? $tool),
            'system_operation'      => (string)($d['operation'] ?? 'read'),
            'system_permission'     => (string)($d['permission'] ?? 'READ_ONLY'),
            'system_allowed_tools'  => $allowed,
            'system_blocked_tools'  => is_array($d['blocked_tools'] ?? null) ? array_values($d['blocked_tools']) : [],
            'system_action_phase'   => (string)($d['action_phase'] ?? ''),
            'system_needs_approval' => (bool)($d['needs_approval'] ?? false),
            'system_risk_level'     => (string)($d['risk_level'] ?? ''),
        ];
    }

    public static function normalize(array $raw): array
    {
        $allowed = $raw['allowed_tools'] ?? [];
        $blocked = $raw['blocked_tools'] ?? [];
        if (!is_array($allowed)) $allowed = [];
        if (!is_array($blocked)) $blocked = [];

        $confidence = (float)($raw['confidence'] ?? 0.0);
        if ($confidence < 0.0) $confidence = 0.0;
        if ($confidence > 1.0) $confidence = 1.0;

        $selectedTool = (string)($raw['selected_tool'] ?? $raw['tool'] ?? '');
        $domain = (string)($raw['domain'] ?? $raw['subject'] ?? '');
        $intent = (string)($raw['intent'] ?? '');
        if ($intent === '') {
            $intent = $domain !== '' ? $domain : $selectedTool;
        }
        $operation = (string)($raw['operation'] ?? 'read');
        $permission = (string)($raw['permission'] ?? 'READ_ONLY');
        $needsApproval = array_key_exists('needs_approval', $raw)
            ? (bool)$raw['needs_approval']
            : self::permissionNeedsApproval($permission);
        $actionPhase = (string)($raw['action_phase'] ?? $raw['phase'] ?? '');
        $riskLevel = (string)($raw['risk_level'] ?? '');
        $dcv2 = $raw['dcv2'] ?? [];
        if (!is_array($dcv2)) {
            $dcv2 = [];
        }

        return [
            'ok'             => (bool)($raw['ok'] ?? false),
            'domain'         => $domain,
            'intent'         => $intent,
            'operation'      => $operation,
            'permission'     => $permission,
            'selected_tool'  => $selectedTool,
            'tool'           => $selectedTool,
            'allowed_tools'  => array_values(array_map('strval', $allowed)),
            'blocked_tools'  => array_values(array_map('strval', $blocked)),
            'action_phase'   => $actionPhase,
            'needs_approval' => $needsApproval,
            'is_binding'     => (bool)($raw['is_binding'] ?? false),
            'risk_level'     => $riskLevel,
            'confidence'     => $confidence,
            'source'         => (string)($raw['source'] ?? ''),
            'reason'         => (string)($raw['reason'] ?? ''),
            'dcv2'           => $dcv2,
            'version'        => self::VERSION,
        ];
    }

    private static function permissionNeedsApproval(string $permission): bool
    {
        return in_array($permission, [
            'APPROVAL_REQUIRED',
            'APPROVAL_NATURAL_CONFIRM',
            'HIGH_RISK_APPROVAL_REQUIRED',
        ], true);
    }
}