📌 선택된 작업 폴더 요약
작업 폴더: 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_1219112026-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개
repair_jobs/logs/api_call_counter_scan_v1_20260505_121911/limited_lines.txt
2026-05-05 12:19:40 · 12.4 KB
repair_jobs/logs/api_call_counter_scan_v1_20260505_121911/file_count_top50.txt
2026-05-05 12:19:28 · 3.4 KB
📦 최근 백업 폴더
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);
}
}