cuelo 0.6.3 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +3 -3
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.js +2 -2
  6. package/.next/required-server-files.json +2 -2
  7. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/_not-found.html +1 -1
  18. package/.next/server/app/_not-found.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  25. package/.next/server/app/api/agent/[id]/account/route.js +1 -1
  26. package/.next/server/app/api/agent/[id]/account/route.js.nft.json +1 -1
  27. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  28. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
  29. package/.next/server/app/api/agent/[id]/route.js +1 -1
  30. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
  31. package/.next/server/app/api/agent/new/route.js +1 -1
  32. package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
  33. package/.next/server/app/api/agent/running/route.js +1 -1
  34. package/.next/server/app/api/agent/running/route.js.nft.json +1 -1
  35. package/.next/server/app/api/gpt6/handles/route.js +1 -1
  36. package/.next/server/app/api/gpt6/handles/route.js.nft.json +1 -1
  37. package/.next/server/app/api/gpt6/reply/route.js +1 -1
  38. package/.next/server/app/api/gpt6/reply/route.js.nft.json +1 -1
  39. package/.next/server/app/api/gpt6/token/route.js +1 -1
  40. package/.next/server/app/api/gpt6/token/route.js.nft.json +1 -1
  41. package/.next/server/app/api/gpt6/web6-session/route.js +1 -1
  42. package/.next/server/app/api/gpt6/web6-session/route.js.nft.json +1 -1
  43. package/.next/server/app/api/live/call/[callId]/route.js +1 -1
  44. package/.next/server/app/api/live/call/[callId]/route.js.nft.json +1 -1
  45. package/.next/server/app/api/live/events/route.js +2 -2
  46. package/.next/server/app/api/live/events/route.js.nft.json +1 -1
  47. package/.next/server/app/api/live/offer/route.js +1 -1
  48. package/.next/server/app/api/live/offer/route.js.nft.json +1 -1
  49. package/.next/server/app/api/live/voices/route.js +1 -1
  50. package/.next/server/app/api/live/voices/route.js.nft.json +1 -1
  51. package/.next/server/app/api/lounge/events/route.js +2 -2
  52. package/.next/server/app/api/lounge/events/route.js.nft.json +1 -1
  53. package/.next/server/app/api/lounge/route.js +1 -1
  54. package/.next/server/app/api/lounge/route.js.nft.json +1 -1
  55. package/.next/server/app/api/project-trust/route.js +1 -1
  56. package/.next/server/app/api/project-trust/route.js.nft.json +1 -1
  57. package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
  58. package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -1
  59. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  60. package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -1
  61. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  62. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  63. package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
  64. package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -1
  65. package/.next/server/app/api/sessions/route.js +1 -1
  66. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  67. package/.next/server/app/api/skills/install/route.js +1 -1
  68. package/.next/server/app/api/tool-image/route.js +1 -1
  69. package/.next/server/app/api/tool-image/route.js.nft.json +1 -1
  70. package/.next/server/app/api/update-maintenance/route.js +3 -3
  71. package/.next/server/app/api/update-maintenance/route.js.nft.json +1 -1
  72. package/.next/server/app/api/updates/route.js +1 -1
  73. package/.next/server/app/index.html +1 -1
  74. package/.next/server/app/index.rsc +4 -4
  75. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  76. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  77. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  80. package/.next/server/app/page.js +16 -16
  81. package/.next/server/app/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app/recover/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/recover.html +1 -1
  84. package/.next/server/app/recover.rsc +2 -2
  85. package/.next/server/app/recover.segments/_full.segment.rsc +2 -2
  86. package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
  87. package/.next/server/app/recover.segments/_index.segment.rsc +2 -2
  88. package/.next/server/app/recover.segments/_tree.segment.rsc +1 -1
  89. package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +1 -1
  90. package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
  91. package/.next/server/app-paths-manifest.json +3 -3
  92. package/.next/server/chunks/2651.js +1 -1
  93. package/.next/server/chunks/3707.js +2 -2
  94. package/.next/server/chunks/6429.js +4 -4
  95. package/.next/server/middleware-build-manifest.js +1 -1
  96. package/.next/server/pages/404.html +1 -1
  97. package/.next/server/pages/500.html +1 -1
  98. package/.next/server/server-reference-manifest.json +1 -1
  99. package/.next/static/chunks/app/{layout-483ef2fa8ff4fe98.js → layout-1f400c6ff9faef10.js} +1 -1
  100. package/.next/static/chunks/app/page-73ab54909e09eb66.js +22 -0
  101. package/.next/trace +105 -105
  102. package/.next/trace-build +1 -1
  103. package/README.md +6 -2
  104. package/Tools/CUELO_Setup/files/native-runtime-patch.js +5 -5
  105. package/Tools/CUELO_Setup/files/usage-server.js +18 -1
  106. package/Tools/OMP_Global_Config/agent/RULES.md +1 -1
  107. package/Tools/OMP_Global_Config/agent/agents/maker.md +25 -42
  108. package/Tools/OMP_Global_Config/agent/extensions/lib/maker-routing.ts +7 -3
  109. package/Tools/OMP_Global_Config/agent/prompt-copies/RULES.en.md +2 -2
  110. package/Tools/OMP_Global_Config/agent/sop/_common.md +14 -23
  111. package/Tools/OMP_Global_Config/agent/sop/_writer.md +10 -18
  112. package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +248 -8
  113. package/package.json +7 -7
  114. package/.next/static/chunks/app/page-bac6b66a3725ef8b.js +0 -22
  115. /package/.next/static/{oBwJ3c4Q_HKgoiBl0dxdQ → p4VT4B7cMX4CRW9JBo9-M}/_buildManifest.js +0 -0
  116. /package/.next/static/{oBwJ3c4Q_HKgoiBl0dxdQ → p4VT4B7cMX4CRW9JBo9-M}/_ssgManifest.js +0 -0
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-webpack","duration":86153982,"timestamp":719274,"id":14,"parentId":1,"tags":{},"startTime":1790697315312,"traceId":"3fc9761cef227255"},{"name":"run-typescript","duration":13709101,"timestamp":87226699,"id":10699,"parentId":1,"tags":{},"startTime":1790697401818,"traceId":"3fc9761cef227255"},{"name":"static-check","duration":3629431,"timestamp":101016404,"id":10702,"parentId":1,"tags":{},"startTime":1790697415608,"traceId":"3fc9761cef227255"},{"name":"static-generation","duration":9711892,"timestamp":104739967,"id":10854,"parentId":1,"tags":{},"startTime":1790697419332,"traceId":"3fc9761cef227255"},{"name":"collect-build-traces","duration":17101622,"timestamp":104707356,"id":10851,"parentId":1,"tags":{},"startTime":1790697419299,"traceId":"3fc9761cef227255"},{"name":"telemetry-flush","duration":80,"timestamp":121813007,"id":10863,"parentId":1,"tags":{},"startTime":1790697436404,"traceId":"3fc9761cef227255"},{"name":"next-build","duration":121190057,"timestamp":623049,"id":1,"tags":{"buildMode":"default","version":"16.2.12","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1790697315216,"traceId":"3fc9761cef227255"}]
1
+ [{"name":"run-webpack","duration":132546212,"timestamp":869498,"id":14,"parentId":1,"tags":{},"startTime":1790750979055,"traceId":"68063d30c801f3d8"},{"name":"run-typescript","duration":24630658,"timestamp":133855403,"id":10707,"parentId":1,"tags":{},"startTime":1790751112042,"traceId":"68063d30c801f3d8"},{"name":"static-check","duration":7250946,"timestamp":158664298,"id":10710,"parentId":1,"tags":{},"startTime":1790751136851,"traceId":"68063d30c801f3d8"},{"name":"static-generation","duration":14909292,"timestamp":166093818,"id":10862,"parentId":1,"tags":{},"startTime":1790751144280,"traceId":"68063d30c801f3d8"},{"name":"collect-build-traces","duration":25695134,"timestamp":166009085,"id":10859,"parentId":1,"tags":{},"startTime":1790751144195,"traceId":"68063d30c801f3d8"},{"name":"telemetry-flush","duration":98,"timestamp":191716138,"id":10871,"parentId":1,"tags":{},"startTime":1790751169903,"traceId":"68063d30c801f3d8"},{"name":"next-build","duration":190951823,"timestamp":764436,"id":1,"tags":{"buildMode":"default","version":"16.2.12","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1790750978950,"traceId":"68063d30c801f3d8"}]
package/README.md CHANGED
@@ -16,6 +16,8 @@ Use the same `~/.omp/agent` sessions, credentials and model configuration from t
16
16
 
17
17
  **한국어:** CUELO는 omp(oh-my-pi)를 위한 오픈소스 AI 코딩 에이전트 작업 공간이자 하네스입니다. 웹 앱은 omp SDK를 서버 안에서 실행하고, `omp` CLI와 같은 `~/.omp/agent` 디렉터리를 씁니다. 터미널에서 하던 세션을 브라우저에서 이어 가고, 다시 터미널로 돌아가도 기록·계정·모델 설정을 공유합니다.
18
18
 
19
+ 내장 OMP 코어는 **18.4.4**입니다. 모델 탐색·서비스 등급 처리와 기억 검색 개선을 포함하며, 별도로 설치한 `omp` CLI의 버전은 웹 업데이트와 독립적입니다.
20
+
19
21
  CUELO의 목적은 작업 중 확인한 실패와 막힘을 기억·작업 규칙·실행 절차에 반영해, 사람이 같은 문제를 다시 지적하지 않아도 다음 작업에서 실수를 줄이는 것입니다. 원인을 확인하고 필요한 부분만 바꾸며, 다음 작업에서 적용과 효과를 확인하는 것까지를 지향합니다. 기록을 저장했다는 이유만으로 자동 개선이 끝났다고 보지는 않습니다.
20
22
 
21
23
  **Keywords:** AI coding agent · agent harness · multi-agent orchestration · omp · oh-my-pi · model routing · developer tools
@@ -63,14 +65,16 @@ CUELO의 목적은 작업 중 확인한 실패와 막힘을 기억·작업 규
63
65
  - 사이드바의 「단톡방」에서 멤버별 참여와 주간 사용량을 보고, 가운데 대화창에서 멘션·답장·반응을 주고받습니다. 방 전체와 멤버별 참여를 따로 켜고 끌 수 있습니다.
64
66
  - 작업 화면으로 돌아가도 선택한 세션·작성 중인 초안·진행 중인 작업은 유지됩니다. 단톡방 기록은 작업 대화와 별도로 보관하며, 멤버에게 작업 문맥이나 실행 도구를 전달하지 않습니다.
65
67
  - 단톡방의 계정 연결은 작업 세션의 계정을 바꾸지 않습니다. 연결한 계정을 사용할 수 없으면 다른 계정으로 넘어가지 않고 다시 선택하도록 안내합니다.
66
- - 자동 수다는 직접 켜야 합니다. 작업 중에는 자동 수다를 쉬고, 호출 상한과 사용량 보호를 적용합니다. 「중단」이나 방 끄기로 진행 중 응답을 멈출 수 있습니다.
68
+ - 단톡방에는 낮은 추론 강도(`low`)를 사용하며 작업 세션의 추론 설정은 바꾸지 않습니다. 시간당 호출은 최대 120회, 사용자 메시지 한 건에 대한 응답은 멤버끼리 이어 말하는 발언을 합쳐 최대 6회입니다. 실제 계정 한도 보호도 계속 적용합니다.
69
+ - 사용자 메시지에 답한 뒤에도 멤버끼리 앞 사람 말을 받아 이어 갑니다. 답에서 부른 멤버가 먼저 받고, 부른 멤버가 없으면 가장 오래 말하지 않은 멤버가 받습니다. 답하지 못한 멤버가 있으면 건너뛰고 다음 멤버가 잇습니다.
70
+ - 자동 수다는 직접 켜야 합니다. 켜 두면 조용할 때 멤버끼리 짧게 주고받습니다(속도에 따라 2·4·6회). 작업 중에는 자동 수다를 쉬고, 호출 상한과 사용량 보호를 적용합니다. 「중단」이나 방 끄기로 진행 중 응답을 멈출 수 있습니다.
67
71
  - 한국어로 대화하되 짧은 일본어 표현을 쓸 때는 이어지는 말에서 뜻을 보완하도록 안내합니다. 실제 표현은 참여 모델에 따라 달라집니다. SHION은 상담 전용으로 남습니다.
68
72
 
69
73
  **알림과 표현**
70
74
 
71
75
  - 완료·실패·승인 요청·선택 요청 등 상황에 맞는 캐릭터 스티커와 음성으로 알립니다(RIN · MIO · YUKI · ISANA · NOVA · SHION · HIKARI).
72
76
  - 브라우저 알림과 PWA 설치를 지원합니다.
73
- - 교훈 자동 기록을 켠 경우 저장 알림은 작업 과정을 접어도 대화에 남습니다. 요청에 이름이 없고 필요성도 확인되지 않은 MCP 후보는 보류 안내로 나열하지 않습니다.
77
+ - 직접 저장한 교훈·스킬은 해당 턴 끝의 카드에서 확인합니다. 교훈 자동 기록을 켠 경우 자동 저장 알림도 작업 과정을 접어도 대화에 남습니다. 요청에 이름이 없고 필요성도 확인되지 않은 MCP 후보는 보류 안내로 나열하지 않습니다.
74
78
  - 한국어가 기본인 인터페이스입니다(영어·중국어 간체도 선택 가능).
75
79
 
76
80
  **omp-web에서 이어받은 기반 기능**
@@ -9,12 +9,12 @@ const MEMORY_RE = /(const phase1Model = await resolveMemoryModel\(\{[^}]*?fallba
9
9
  const MEMORY_DONE = /const phase1Model = await resolveMemoryModel\(\{[^}]*?fallbackRole: "smol"/;
10
10
  const EXPECTED = {
11
11
  name: 'cuelo',
12
- version: '0.6.3',
12
+ version: '0.6.5',
13
13
  distribution: 'cuelo',
14
- coreVersion: '18.4.3',
14
+ coreVersion: '18.4.4',
15
15
  };
16
16
 
17
- // OMP core 18.4.3 `src/sdk.ts`: session-scoped AsyncJobManager for a process
17
+ // OMP core 18.4.4 `src/sdk.ts`: session-scoped AsyncJobManager for a process
18
18
  // that hosts several top-level sessions (CUELO opens one per browser session).
19
19
  // Upstream lets only the first top-level session construct a manager; every
20
20
  // later one got `asyncJobManager: undefined`, so its `task` calls logged
@@ -23,7 +23,7 @@ const EXPECTED = {
23
23
  // fix: it is disposed with its owning session (CUELO idle-shuts sessions
24
24
  // after 10 minutes) and would cancel every other session's jobs, and a
25
25
  // disposed manager throws on the next register(). Each edit is an exact text
26
- // anchor of the pristine 18.4.3 source (also present after core patch) and fails closed when it drifts.
26
+ // anchor of the pristine 18.4.4 source (also present after core patch) and fails closed when it drifts.
27
27
  // `insertBefore` edits keep their anchor (the helper is inserted in front of
28
28
  // it), so their anchor count stays 1 after patching.
29
29
  const SDK_FILE = path.join('node_modules', '@oh-my-pi', 'pi-coding-agent', 'src', 'sdk.ts');
@@ -177,7 +177,7 @@ function readNativePackage(target) {
177
177
  throw new Error(`unexpected native package ${packageJson.name}@${packageJson.version}`);
178
178
  }
179
179
  if (!build || build.distribution !== EXPECTED.distribution || build.coreVersion !== EXPECTED.coreVersion) {
180
- throw new Error('native cueloBuild metadata does not match cuelo / core 18.4.3');
180
+ throw new Error('native cueloBuild metadata does not match cuelo / core 18.4.4');
181
181
  }
182
182
  return packageJson;
183
183
  }
@@ -25,6 +25,11 @@ const OMP = (() => {
25
25
  })();
26
26
  const ORIGIN = 'http://127.0.0.1:' + (Number(process.env.PORT) || 30141);
27
27
  const CACHE_MS = 60_000;
28
+ // 만료 뒤 이 나이까지는 직전 스냅샷을 바로 내고 뒤에서 새로 조회한다. 콜드 조회(0.25s~수 초)가
29
+ // maker_route의 2초 잔량 예산을 넘겨 발주 준비가 잔량 없이 끝나던 것을 막는다. 계정 차단 상태는
30
+ // enrich가 매 응답마다 새로 붙이므로 여기 걸리는 것은 provider 한도 수치뿐이고, 각 report의
31
+ // fetchedAt이 나이를 그대로 보여 준다. 무효화(at=0)된 캐시는 이 창과 무관하게 새 조회를 기다린다.
32
+ const STALE_MS = 10 * 60_000;
28
33
  const CLI_TIMEOUT_MS = 30_000;
29
34
 
30
35
  let cache = null; // { at, body }. 무효화는 at=0 으로 한다(오류 시 stale 응답을 살려 두려고).
@@ -78,6 +83,17 @@ function invalidateUsage() {
78
83
  if (cache) cache.at = 0;
79
84
  }
80
85
 
86
+ /** 신선하면 그대로, STALE_MS 안의 만료분이면 즉시 돌려주고 뒤에서 갱신, 그보다 오래됐거나 무효화됐으면 새 조회를 기다린다. */
87
+ function usageEntry(entry, refresh, now = Date.now()) {
88
+ const age = entry ? now - entry.at : Infinity;
89
+ if (age <= CACHE_MS) return entry;
90
+ if (age <= STALE_MS) {
91
+ refresh().catch(() => { /* 다음 요청이 다시 시도한다. 직전 스냅샷은 그대로 둔다. */ });
92
+ return entry;
93
+ }
94
+ return refresh();
95
+ }
96
+
81
97
  const MANUAL_UNTIL_MS = 4102444800000;
82
98
  const PRIOR_DEFAULT_BLOCK_SCOPE = 'ompweb:manual-off:prior-default';
83
99
  const IDENTITY_KEYS = ['email', 'accountId', 'orgId', 'projectId'];
@@ -603,7 +619,7 @@ async function buildUsageBody(controls = facade, readUsage) {
603
619
  if (readUsage) return JSON.stringify(await controls.enrich(await readUsage()));
604
620
  let entry = cache;
605
621
  try {
606
- if (!entry || Date.now() - entry.at > CACHE_MS) entry = await fetchUsage();
622
+ entry = await usageEntry(cache, fetchUsage);
607
623
  } catch {
608
624
  if (!entry) {
609
625
  if (!localControl) throw controlError(502, 'usage_unavailable');
@@ -893,4 +909,5 @@ module.exports = {
893
909
  MANUAL_UNTIL_MS,
894
910
  createSampleStore,
895
911
  applyDaySlots,
912
+ usageEntry,
896
913
  };
@@ -28,7 +28,7 @@
28
28
  그 자리에서 멈춰 원인 근거·시도한 것·남은 막힘을 보고한다.
29
29
  - 도구·저장소·현재 문맥으로 해결할 수 있는 작업은 확인을 요청하거나 중간 단계에서 멈추지 않고 끝까지 수행한다. 단, 삭제·배포·비용 발생·호환성 파괴는 실행 전에 사용자 승인을 받는다.
30
30
  - MCP 설치·등록·인증·권한 변경은 대상과 범위를 설명하고 먼저 사용자 승인을 받는다. 승인 뒤에는 에이전트가 가능한 설치·설정·연결·검증을 끝까지 실행한다. "사용자 승인 필요"를 "사용자가 직접 실행해야 함"으로 바꿔 해석하지 않는다. 사용자 본인 로그인·인증정보 입력·제공자 안전 확인·동의처럼 사람이 필요한 단계만 사용자에게 넘긴다. JEV 추천·필요성 판정은 사용자 승인을 대신하지 않는다.
31
- - 배포 확인(사용자, 2026-09-26·2026-09-29): 집 PC(hostname `KYS`)의 CUELO 세션이 소스 변경을 검증하고 커밋·push했으면, 그 커밋의 GitHub CI가 끝날 때까지 지켜본 뒤 결과를 보고하고 배포 여부를 묻는다. 사용자가 승인하면 같은 revision의 `Tools/CUELO_Setup/deploy-live.ps1`과 `Tools/OMP_Global_Config/verify.ps1 -StrictRuntime`을 실행한다(`Tools/CUELO_Setup/setup.ps1`은 앱 전체 설치기라 이 단계가 아니다). 배포 트랜잭션이 새 서버를 띄우기 전에 `Tools/OMP_Global_Config/setup.ps1 -ProfileOnly`로 미러 프로필을 반영하고, 새 서버 `/api/models`의 역할 selector가 미러 `config.yml` `modelRoles`와 같은지 확인해 receipt `profile`에 남기므로 배포 뒤 ProfileOnly·`CUELO-Restart`를 따로 돌리지 않는다. 역할이 다르거나 관측되지 않으면 deploy-live가 exit 3으로 끝나며 rollback하지 않으니, 안내대로 재시작한 뒤 `/api/models`를 다시 확인한다. 세션 안 배포는 deploy-live가 worker 접수 뒤 반환하므로 재개 뒤 transaction receipt의 `profile.modelRoles.matched`가 `true`인지 직접 확인한다. 배포 없이 프로필만 바꿨으면 ProfileOnly 뒤 서버를 재시작하고 같은 역할 확인을 한다. 라이브 서버는 Settings를 시작 때 한 번만 읽어 파일 변경·touch로는 반영되지 않는다. 실행 전 `hostname`으로 PC를 확인한다. 예약 작업 같은 자동 배포는 두지 않는다. stage·rollback 삭제, 사무실 PC 배포, CLI 업데이트, 비용이 드는 작업은 따로 승인받는다.
31
+ - 배포 확인(사용자, 2026-09-26·2026-09-29·2026-09-30): 집 PC(hostname `KYS`)와 사무실 PC(hostname은 비공개 배포 표에 있다)는 같은 절차를 따른다. 그 PC의 CUELO 세션이 소스 변경을 검증하고 커밋·push했으면, 그 커밋의 GitHub CI가 끝날 때까지 지켜본 뒤 결과를 보고하고 배포 여부를 묻는다. 사용자가 승인하면 같은 revision의 `Tools/CUELO_Setup/deploy-live.ps1`과 `Tools/OMP_Global_Config/verify.ps1 -StrictRuntime`을 실행한다(`Tools/CUELO_Setup/setup.ps1`은 앱 전체 설치기라 이 단계가 아니다). 배포 트랜잭션이 새 서버를 띄우기 전에 `Tools/OMP_Global_Config/setup.ps1 -ProfileOnly`로 미러 프로필을 반영하고, 새 서버 `/api/models`의 역할 selector가 미러 `config.yml` `modelRoles`와 같은지 확인해 receipt `profile`에 남기므로 배포 뒤 ProfileOnly·`CUELO-Restart`를 따로 돌리지 않는다. 역할이 다르거나 관측되지 않으면 deploy-live가 exit 3으로 끝나며 rollback하지 않으니, 안내대로 재시작한 뒤 `/api/models`를 다시 확인한다. 세션 안 배포는 deploy-live가 worker 접수 뒤 반환하므로 재개 뒤 transaction receipt의 `profile.modelRoles.matched`가 `true`인지 직접 확인한다. 배포 없이 프로필만 바꿨으면 ProfileOnly 뒤 서버를 재시작하고 같은 역할 확인을 한다. 라이브 서버는 Settings를 시작 때 한 번만 읽어 파일 변경·touch로는 반영되지 않는다. 실행 전 `hostname`으로 PC를 확인한다. 예약 작업 같은 자동 배포는 두지 않는다. stage·rollback 삭제, 이 두 PC 밖의 배포, CLI 업데이트, 비용이 드는 작업은 따로 승인받는다.
32
32
  - CI 감시(사용자, 2026-09-28): 커밋의 CI를 지켜볼 때는 기다릴 워크플로를 이름으로 지정하고(`gh run list --workflow <이름>` 등), 그 run이 끝나는 즉시 결과를 보고한다. 같은 SHA에 걸린 run 전체의 완료를 조건으로 삼지 않는다. CI 성공이 트리거하는 릴리스·배포 run(`workflow_run`)이 몇 초 뒤 같은 SHA로 생겨 CI 완료 보고를 붙잡기 때문이다. 이어 붙는 run은 보고한 뒤 따로 지켜본다.
33
33
  - 구현 방법의 불확실성은 명시 요구·승인된 계약, 실제 호출부와 데이터 흐름, 테스트·재현 결과,
34
34
  현재 동작과 문서로 좁힌다. 증거로 방향이 정해지면 근거를 남기고 진행하며 사소한 구현 선택마다
@@ -6,7 +6,7 @@ thinking-level: medium
6
6
  tools: [read, bash, edit, write, grep, glob, skim, lsp, eval, generate_image, ast_grep, ast_edit, debug, todo, web_search, checkpoint]
7
7
  ---
8
8
 
9
- <!-- omp-global-config:generated source-hash=4d0cd3d73cbf
9
+ <!-- omp-global-config:generated source-hash=4e5719c2a636
10
10
  이 파일은 patches/build-agents.mjs 가 만든 빌드 산출물이다. 직접 수정하지 마라.
11
11
  고칠 곳: agent/sop/maker.md · agent/sop/_writer.md · agent/sop/_common.md
12
12
  재생성: node patches/build-agents.mjs 검사: node patches/build-agents.mjs --check
@@ -53,11 +53,9 @@ is yours end to end.
53
53
  must stay up. Give that service a name unique to your session - core 18.3.0 stops and replaces a
54
54
  live service of the same name regardless of who started it - read it with `read proc://<name>`
55
55
  and stop it with `write proc://<name>/kill`. Reuse
56
- a suitable same-revision build, server, or result first and redo only what a rework invalidated;
57
- an isolated server and a full production build are never the default. Build no separate
58
- environment for these checks: `implementationOwnership.writerValidation` puts the common isolation
59
- environment and any needed full build, integration, or acceptance check with Main, so request or
60
- reuse that artifact instead of producing your own, and never close a change with no check at all.
56
+ a suitable same-revision build, server, or result first; an isolated server and a full
57
+ production build are never the default, and when a check needs the common environment or a full
58
+ build, request or reuse Main's artifact instead of producing your own.
61
59
  Never hand this validation
62
60
  to someone else and never invent a validator handoff. A later failure must be classifiable as
63
61
  pre-existing or newly introduced.
@@ -79,17 +77,13 @@ is yours end to end.
79
77
  that now covers it, keeping the same finding id — no separate messenger or new reporting stage.
80
78
  Never weaken an expectation, relax a fixture, or hide a failure to make validation pass.
81
79
  - 관련 Skill을 먼저 읽고 이번 조치에 적용되는 주의사항만 이름·절/locator·위험 요약으로 추린다.
82
- 첫 예상 밖 실패 뒤 재시도 경계에서 런타임이 실패 도구·오류 분류·입력 변경·사이 도구 호출이라는
83
- 관측 사실만으로 이미 advisory를 낸다. 그것을 읽고 런타임이 관측하지 못하는 것 — Skill 충돌·적용
84
- 불가, 승인 필요, 관측 불가 판단 — 만 보충한다. 같은 관측 질문을 다시 batched `judge()`로
85
- 호출하지 않는다.
86
- Skill 원문·소스·로그·비밀은 보내지 않는다. 단순 보충·새 근거 없는 동일 질문은 반복하지 않는다.
87
- 검증 약화나 Skill 충돌·적용 불가가 나오면 문제 된 조치만 보류하고 기존 blocker/조향 DM으로
88
- 원문 오류 locator·Skill locator·제안 조치·보존할 수용 조건을 Main에 보낸다. 독립 작업은 계속한다.
80
+ pre-retry advisory를 보충하다가(Common Rules) 검증 약화나 Skill 충돌·적용 불가가 나오면 문제 된
81
+ 조치만 보류하고 기존 blocker/조향 DM으로 원문 오류 locator·Skill locator·제안 조치·보존할 수용
82
+ 조건을 Main에 보낸다. 독립 작업은 계속한다.
89
83
  Jev는 통지할 위험을 찾는 보조 수단이며 검사 생략 승인자가 아니다. 필수 검사 비활성화·기대치
90
84
  완화는 Jev가 안전하다고 하거나 응답하지 못해도 Main의 사전 판단 없이 실행하지 않는다.
91
85
  환경 오류는 생성물 위치의 모듈 해석·경로·런타임 같은 가벼운 확인으로 먼저 좁힌 뒤 무거운 검사를
92
- 다시 실행한다. `routing.typedJudgmentRouting`의 기존 placement와 통신 경계를 유지한다.
86
+ 다시 실행한다.
93
87
  - Capture original source, contracts, impact-bearing caller locators, and before/after evidence
94
88
  during implementation for the review packet. Hand the confirmed delta and that evidence to Main,
95
89
  who owns the mid-flight and final review and assembles it with your command evidence without
@@ -167,9 +161,9 @@ is yours end to end.
167
161
  build error. Never put a broken intermediate state on the user's screen. Use the user's browser
168
162
  only when their live session is genuinely required, or when Main tells you to hand a FINISHED
169
163
  surface over for judgement — do not open it on your own initiative.
170
- - Run surface checks in the environment Main provides. Creating a new common isolation environment
171
- or running a full build is Main's by default; do it yourself only when Main explicitly delegated
172
- that run to you in the brief. When you do launch a server (delegated, or no environment exists
164
+ - Run surface checks in the environment Main provides; create a common isolation environment or
165
+ run a full build yourself only when the brief explicitly delegates that run. When you do launch a
166
+ server (delegated, or no environment exists
173
167
  and your slice needs one), start it from the project's own `package.json` script, changing only
174
168
  the port. Hand-reassembling the command drops bundler or runtime flags and breaks the whole
175
169
  dependency graph. When an existing environment already reflects your revision, confirm its
@@ -255,8 +249,6 @@ is yours end to end.
255
249
  - If a git command fails on `index.lock` or a worktree lock, never delete the lock file —
256
250
  another agent may be working in the same repository. Re-analyze, wait briefly, and retry at
257
251
  most once; if the identical lock failure appears a second time, stop and report it to Main.
258
- - You have **no verdict authority**. Never report `PASS`/`FAIL` on someone else's work; report
259
- facts and let the caller judge.
260
252
 
261
253
  ## Common Rules
262
254
 
@@ -271,13 +263,12 @@ is yours end to end.
271
263
  the change to named files, that list is the boundary: read access is never write permission,
272
264
  and unrelated cleanup, unrelated features, and other owners' files stay untouched.
273
265
  - Run only the validation that the brief or role-specific rules authorize. The Maker runs the
274
- minimum focused checks its own slice needs without building a separate environment; Main owns
275
- the common isolation environment and any needed full build, integration, or acceptance check,
276
- runs them once on the frozen revision without editing it, and never repeats the slice's focused
277
- check in the same environment or edits a path a live child owns. A slice never closes with no
278
- check at all. When a command is authorized, run it exactly and report its output and exit code.
279
- Main owns the mid-flight and final review: it inspects the owner's immutable raw artifacts and
280
- locators and never repeats the owner's focused check in the same environment.
266
+ minimum focused checks its own slice needs and builds no separate environment; Main owns the
267
+ common isolation environment and any needed full build, integration, or acceptance check, runs
268
+ them once on the frozen revision without editing it, owns the mid-flight and final review from
269
+ the owner's immutable raw artifacts and locators, and never repeats the slice's focused check in
270
+ the same environment or edits a path a live child owns. A slice never closes with no check at
271
+ all. When a command is authorized, run it exactly and report its output and exit code.
281
272
  - Resolve ambiguity with evidence first: the explicit requirement, the approved contract, real
282
273
  callers and data flow, tests and reproductions, and current behavior with its documentation.
283
274
  Once that evidence settles the direction, record the basis and continue; do not stop for
@@ -302,7 +293,7 @@ is yours end to end.
302
293
  tools. Read that advisory and supplement only what the runtime cannot observe — applicable Skill
303
294
  guidance, approval, and unobservable judgment. Never re-ask the observed parts yourself and never
304
295
  make a second batched `judge()` call for them. Send only your
305
- minimal structured summary, never the raw user/system prompt, source, diff, secret, or raw tool
296
+ minimal structured summary, never the raw user/system prompt, Skill text, source, diff, secret, or raw tool
306
297
  output. A probabilistic bool is true at `>= 0.5`. When the cause is the same and no new evidence
307
298
  or condition exists, stop the identical retry and re-analyze or report. Otherwise change the next
308
299
  action from the new evidence and use the authentication/provider-versus-code result to choose the
@@ -327,20 +318,14 @@ is yours end to end.
327
318
  - Rework invalidates only what it touched. Redo the check it invalidates, review the diff, inputs,
328
319
  impact-bearing callers, and domain evidence Main marks invalidated, and reuse the unaffected
329
320
  source, caller, and raw evidence.
330
- - Main owns the final orchestration verdict. Never declare it.
321
+ - Main owns the final orchestration verdict. Never declare it, and never report `PASS`/`FAIL` on
322
+ someone else's work; report facts and let the caller judge.
331
323
  - Automatic result delivery is the default for every async role and job; never send a duplicate
332
- completion message for a terminal result. You have no `wait` tool: core 18.3.0 gives `wait` to the
333
- top-level session only, and the results of jobs you launched re-wake your session automatically,
334
- so keep working and never build a substitute for waiting. Main alone calls the argument-free
335
- `wait`, and only at a real dependency or synthesis barrier with no independent judgment left. It
336
- blocks until the first event (a queued message, an undelivered settled job, or a running job,
337
- peer message, or owned service exit) with a 30-minute safety cap and never returns empty-handed,
338
- so there is no ladder or window to count; re-waiting after an unrelated event while the awaited
339
- target is still unfinished is the normal path. Still banned: re-waiting after the terminal result
340
- is already in hand, repeated `read proc://` status checks without a changed decision point,
341
- timer/sleep-based waiting, and a wait with no unfinished target. The canonical values are in
342
- `harness-policy.json` `mainLane.waitContract`. User steering may interrupt that call; after
343
- handling it, resume the still-required barrier once. Elapsed time is not failure evidence or
324
+ completion message for a terminal result. You have no `wait` tool (core gives it to the
325
+ top-level session only): results of jobs you launched re-wake your session automatically, so
326
+ keep working and never build a substitute for waiting — no repeated `read proc://` status checks
327
+ without a changed decision point and no timer/sleep-based waiting. Main's barrier semantics are
328
+ `harness-policy.json` `mainLane.waitContract`. Elapsed time is not failure evidence or
344
329
  permission to reduce scope or validation.
345
330
  - Neither automatic delivery nor Main's `wait` shows progress. While a job you launched or an awaited
346
331
  target runs a long external build, install, or test, observe that work directly —
@@ -376,8 +361,6 @@ is yours end to end.
376
361
 
377
362
  ## Conversation
378
363
 
379
- - Write user-facing prose in Korean. Keep code, commands, filenames, API names, and original error
380
- messages verbatim.
381
364
  - **Every line of prose you emit is Korean, not only the final report.** The one-line narration
382
365
  you write while working ("I'll start by reading...", "Now checking X") is rendered straight
383
366
  into the user's chat window as your own inline utterance next to your account face, so it is
@@ -562,12 +562,14 @@ export function registerMakerRouting(pi: ExtensionAPI, deps: RoutingDeps) {
562
562
  if (retryable.length > 0) {
563
563
  // 같은 준비→발주 계약에서 같은 provider의 online 갱신은 한 번만 시작하고,
564
564
  // 서로 다른 provider는 함께 시작한다. 새 prepare/reset은 새 map으로 다시 시도한다.
565
+ // refreshProvider는 그 provider의 rate-limit 쿨다운(suppressed selector)을 지우고 정적 모델을
566
+ // 다시 읽으므로, 발견만 다시 하는 refreshDiscoverableProviders를 쓴다(character-voice와 같은 경로).
565
567
  const attempt = (provider: string): Promise<string | null> => {
566
568
  const shared = attempts?.get(provider);
567
569
  if (shared) return shared;
568
570
  const started = (async () => {
569
571
  try {
570
- await ctx.modelRegistry.refreshProvider(provider, "online");
572
+ await ctx.modelRegistry.refreshDiscoverableProviders([provider], "online");
571
573
  return null;
572
574
  } catch (error) {
573
575
  return `provider 갱신 실패: ${error instanceof Error ? error.message : String(error)}`;
@@ -640,7 +642,7 @@ export function registerMakerRouting(pi: ExtensionAPI, deps: RoutingDeps) {
640
642
  }
641
643
  };
642
644
 
643
- const INSTRUCTION = "Main은 profile·recommendations.uiUxBoundary·placement·history를 보고 후보와 concrete effort를 지정합니다. 등급 NORMAL/HARD와 모델 이름을 구분합니다. NORMAL UI/UX 경계는 NORMAL_OPUS, 비-UI는 NORMAL_SONNET 우선이며 실제 소진·사용 불가 때만 NORMAL_DEEPSEEK를 추천합니다. 한도 미관측은 소진이 아닙니다. 기존 NORMAL의 명시적 Opus 선택은 ROUTING_REASON으로 유지합니다. HARD는 UI_UX→HARD_UI_OPUS, CODE_SYSTEM→HARD_CODE_OPUS이며 HARD_CODE_SONNET는 명시적 대안입니다. 후보별 허용·registry 지원 강도만 쓰고 max나 coarse effort는 쓰지 않습니다. 작업 중 UI/UX 경계가 드러나면 기존 owner의 실제 모델을 확인하고, 비-Opus의 미완 변경·증거를 freeze해 소유권을 넘깁니다. active writer와 겹치거나 실행 중 모델·effort를 바꾸지 않습니다. 같은 Opus owner와 완료된 비-UI 작업은 재사용합니다. Opus unavailable을 다른 후보로 숨기지 않습니다. 계정 warm/exact pin·전환·쿨다운·리셋은 유지합니다. 추천 변경·Jev 불가·기존 owner 대신 새 발주는 ROUTING_REASON을 남깁니다. history는 같은 등급 최근 attempt의 중립 건수이며 후보·규칙을 자동 변경하지 않습니다. routing_verdict에는 실제 spawn identity를 씁니다. context='PREPARED_CONTEXT', task='PREPARED_TASK: <preparedId>'로 원문을 재사용하며 같은 브리프에 judge를 중복 호출하지 않습니다.";
645
+ const INSTRUCTION = "Main은 profile·recommendations.uiUxBoundary·placement·history를 보고 후보와 concrete effort(model selector suffix, 그 후보의 efforts 안)를 지정합니다. 등급 NORMAL/HARD와 모델 이름을 구분합니다. 한도 미관측은 소진이 아닙니다. 기존 NORMAL의 명시적 Opus 선택은 ROUTING_REASON으로 유지하고, 같은 Opus owner와 완료된 비-UI 작업은 재사용합니다. 계정 쿨다운·리셋은 유지합니다. 추천 변경·Jev 불가·기존 owner 대신 새 발주는 ROUTING_REASON 한 줄을 남깁니다. 발주는 context='PREPARED_CONTEXT', task='PREPARED_TASK: <preparedId>'로 원문을 재사용합니다.";
644
646
  /** 배치 공통 정보(candidates·quota·instruction)는 한 번만, task별 route는 배열로 돌려준다. */
645
647
  async function prepareBatch(context: string, tasks: RouteTask[], ctx: ExtensionContext, signal?: AbortSignal, callId = "") {
646
648
  const current = policy();
@@ -1032,7 +1034,9 @@ export function registerMakerRouting(pi: ExtensionAPI, deps: RoutingDeps) {
1032
1034
  // core가 위 schema로 검증한 입력이며 SDK generic 경계에서 소실된 타입만 복원한다.
1033
1035
  const request = params as { context: string; tasks: RouteTask[] };
1034
1036
  const batch = await prepareBatch(request.context, request.tasks, ctx, signal, String(callId ?? ""));
1035
- return { content: [{ type: "text", text: JSON.stringify(batch) }], details: batch };
1037
+ // 준비 handle(plan)은 발주 identity가 아니므로(routing_verdict는 spawn identity) 모델 문맥에는 싣지 않고 details에만 둔다.
1038
+ const view = { ...batch, routes: batch.routes.map(({ plan: _plan, ...route }) => route) };
1039
+ return { content: [{ type: "text", text: JSON.stringify(view) }], details: batch };
1036
1040
  },
1037
1041
  });
1038
1042
  }
@@ -1,4 +1,4 @@
1
- <!-- source-fingerprint: 274911b002091649 -->
1
+ <!-- source-fingerprint: a136dd099e511b1d -->
2
2
  # Global Rules
3
3
 
4
4
  (Model-facing English copy of the Korean source `RULES.md`.)
@@ -13,7 +13,7 @@
13
13
  - Do not repeat the same action under the same conditions. Diagnosis that narrows the cause from observation and changes the next action accordingly is not blind retrying; the same error string alone does not make it the same attempt. If after the first failure there is neither an action to change nor a safe path forward, do not confirm the same failure a second time — stop there and report the cause evidence, what was tried, and the remaining blocker.
14
14
  - Work solvable with tools, the repository, and the current context is carried to completion without asking for confirmation or stopping midway. Exception: get user approval before deletion, deployment, incurring cost, or breaking compatibility.
15
15
  - Before installing/registering MCP servers or changing their authentication/permissions, explain the target and scope and get user approval. After approval, the agent carries out the supported installation, configuration, connection, and verification. Do not reinterpret "user approval required" as "the user must execute it manually." Hand over only steps requiring the person, such as personal login, credential entry, or interactive provider safety checks/consent. JEV recommendations or relevance judgments never substitute for user approval.
16
- - Deploy confirmation (user, 2026-09-26 and 2026-09-29): on the home PC (hostname `KYS`), once a CUELO session has verified a source change and committed and pushed it, watch that commit's GitHub CI until it finishes, report the result, and ask whether to deploy. After the user approves, run `Tools/CUELO_Setup/deploy-live.ps1` and `Tools/OMP_Global_Config/verify.ps1 -StrictRuntime` for that same revision (`Tools/CUELO_Setup/setup.ps1` is the full app installer, not this step). The deploy transaction applies the mirror profile with `Tools/OMP_Global_Config/setup.ps1 -ProfileOnly` before starting the new server, then checks that the new server's `/api/models` role selectors match the mirror `config.yml` `modelRoles` and records it in the receipt `profile`, so do not run ProfileOnly or `CUELO-Restart` separately after a deploy. If the roles differ or could not be observed, deploy-live exits 3 without rolling back; restart as its guidance says and check `/api/models` again. An in-session deploy returns once the worker accepts, so after resuming check yourself that the transaction receipt's `profile.modelRoles.matched` is `true`. If only the profile changed without a deploy, restart the server after ProfileOnly and do the same role check. The live server reads Settings once at startup; file changes or a touch do not reload it. Check the PC with `hostname` first. Do not add automatic deployment such as a scheduled task. Deleting stages or rollbacks, deploying to the office PC, updating the CLI, and anything that incurs cost still need separate approval.
16
+ - Deploy confirmation (user, 2026-09-26, 2026-09-29 and 2026-09-30): the home PC (hostname `KYS`) and the office PC (its hostname is in the private deploy table) follow the same procedure. Once that PC's CUELO session has verified a source change and committed and pushed it, watch that commit's GitHub CI until it finishes, report the result, and ask whether to deploy. After the user approves, run `Tools/CUELO_Setup/deploy-live.ps1` and `Tools/OMP_Global_Config/verify.ps1 -StrictRuntime` for that same revision (`Tools/CUELO_Setup/setup.ps1` is the full app installer, not this step). The deploy transaction applies the mirror profile with `Tools/OMP_Global_Config/setup.ps1 -ProfileOnly` before starting the new server, then checks that the new server's `/api/models` role selectors match the mirror `config.yml` `modelRoles` and records it in the receipt `profile`, so do not run ProfileOnly or `CUELO-Restart` separately after a deploy. If the roles differ or could not be observed, deploy-live exits 3 without rolling back; restart as its guidance says and check `/api/models` again. An in-session deploy returns once the worker accepts, so after resuming check yourself that the transaction receipt's `profile.modelRoles.matched` is `true`. If only the profile changed without a deploy, restart the server after ProfileOnly and do the same role check. The live server reads Settings once at startup; file changes or a touch do not reload it. Check the PC with `hostname` first. Do not add automatic deployment such as a scheduled task. Deleting stages or rollbacks, deploying to any PC other than these two, updating the CLI, and anything that incurs cost still need separate approval.
17
17
  - CI watching (user, 2026-09-28): when watching a commit's CI, name the workflow you wait on (`gh run list --workflow <name>` or similar) and report the moment that run finishes. Never use "every run for this SHA is completed" as the condition: a release/deploy run triggered by CI success (`workflow_run`) appears seconds later on the same SHA and holds back the CI report. Watch such follow-on runs separately after reporting.
18
18
  - Narrow implementation uncertainty using explicit requirements and approved contracts, actual callers and data flow, test/reproduction results, and current behavior and docs. Once evidence settles the direction, proceed and record the basis; do not ask for confirmation on every minor implementation choice. Tests, docs, and current behavior are not automatically right; when they conflict with the requirements, check the actual behavior. Escalate to the user only items that change product meaning and cannot be settled by evidence, or that lack authority or external approval; keep doing independently allowed work even if that part is blocked.
19
19
  - Direct causes found within the approved goal, and regressions your change created, are fixed and verified without the user asking again. Outside the allowed boundary, other owners' files, and cleanup or features unrelated to the original completion criteria remain out of scope; being able to read something is not permission to modify it.
@@ -11,13 +11,12 @@
11
11
  the change to named files, that list is the boundary: read access is never write permission,
12
12
  and unrelated cleanup, unrelated features, and other owners' files stay untouched.
13
13
  - Run only the validation that the brief or role-specific rules authorize. The Maker runs the
14
- minimum focused checks its own slice needs without building a separate environment; Main owns
15
- the common isolation environment and any needed full build, integration, or acceptance check,
16
- runs them once on the frozen revision without editing it, and never repeats the slice's focused
17
- check in the same environment or edits a path a live child owns. A slice never closes with no
18
- check at all. When a command is authorized, run it exactly and report its output and exit code.
19
- Main owns the mid-flight and final review: it inspects the owner's immutable raw artifacts and
20
- locators and never repeats the owner's focused check in the same environment.
14
+ minimum focused checks its own slice needs and builds no separate environment; Main owns the
15
+ common isolation environment and any needed full build, integration, or acceptance check, runs
16
+ them once on the frozen revision without editing it, owns the mid-flight and final review from
17
+ the owner's immutable raw artifacts and locators, and never repeats the slice's focused check in
18
+ the same environment or edits a path a live child owns. A slice never closes with no check at
19
+ all. When a command is authorized, run it exactly and report its output and exit code.
21
20
  - Resolve ambiguity with evidence first: the explicit requirement, the approved contract, real
22
21
  callers and data flow, tests and reproductions, and current behavior with its documentation.
23
22
  Once that evidence settles the direction, record the basis and continue; do not stop for
@@ -42,7 +41,7 @@
42
41
  tools. Read that advisory and supplement only what the runtime cannot observe — applicable Skill
43
42
  guidance, approval, and unobservable judgment. Never re-ask the observed parts yourself and never
44
43
  make a second batched `judge()` call for them. Send only your
45
- minimal structured summary, never the raw user/system prompt, source, diff, secret, or raw tool
44
+ minimal structured summary, never the raw user/system prompt, Skill text, source, diff, secret, or raw tool
46
45
  output. A probabilistic bool is true at `>= 0.5`. When the cause is the same and no new evidence
47
46
  or condition exists, stop the identical retry and re-analyze or report. Otherwise change the next
48
47
  action from the new evidence and use the authentication/provider-versus-code result to choose the
@@ -67,20 +66,14 @@
67
66
  - Rework invalidates only what it touched. Redo the check it invalidates, review the diff, inputs,
68
67
  impact-bearing callers, and domain evidence Main marks invalidated, and reuse the unaffected
69
68
  source, caller, and raw evidence.
70
- - Main owns the final orchestration verdict. Never declare it.
69
+ - Main owns the final orchestration verdict. Never declare it, and never report `PASS`/`FAIL` on
70
+ someone else's work; report facts and let the caller judge.
71
71
  - Automatic result delivery is the default for every async role and job; never send a duplicate
72
- completion message for a terminal result. You have no `wait` tool: core 18.3.0 gives `wait` to the
73
- top-level session only, and the results of jobs you launched re-wake your session automatically,
74
- so keep working and never build a substitute for waiting. Main alone calls the argument-free
75
- `wait`, and only at a real dependency or synthesis barrier with no independent judgment left. It
76
- blocks until the first event (a queued message, an undelivered settled job, or a running job,
77
- peer message, or owned service exit) with a 30-minute safety cap and never returns empty-handed,
78
- so there is no ladder or window to count; re-waiting after an unrelated event while the awaited
79
- target is still unfinished is the normal path. Still banned: re-waiting after the terminal result
80
- is already in hand, repeated `read proc://` status checks without a changed decision point,
81
- timer/sleep-based waiting, and a wait with no unfinished target. The canonical values are in
82
- `harness-policy.json` `mainLane.waitContract`. User steering may interrupt that call; after
83
- handling it, resume the still-required barrier once. Elapsed time is not failure evidence or
72
+ completion message for a terminal result. You have no `wait` tool (core gives it to the
73
+ top-level session only): results of jobs you launched re-wake your session automatically, so
74
+ keep working and never build a substitute for waiting — no repeated `read proc://` status checks
75
+ without a changed decision point and no timer/sleep-based waiting. Main's barrier semantics are
76
+ `harness-policy.json` `mainLane.waitContract`. Elapsed time is not failure evidence or
84
77
  permission to reduce scope or validation.
85
78
  - Neither automatic delivery nor Main's `wait` shows progress. While a job you launched or an awaited
86
79
  target runs a long external build, install, or test, observe that work directly —
@@ -116,8 +109,6 @@
116
109
 
117
110
  ## Conversation
118
111
 
119
- - Write user-facing prose in Korean. Keep code, commands, filenames, API names, and original error
120
- messages verbatim.
121
112
  - **Every line of prose you emit is Korean, not only the final report.** The one-line narration
122
113
  you write while working ("I'll start by reading...", "Now checking X") is rendered straight
123
114
  into the user's chat window as your own inline utterance next to your account face, so it is
@@ -36,11 +36,9 @@
36
36
  must stay up. Give that service a name unique to your session - core 18.3.0 stops and replaces a
37
37
  live service of the same name regardless of who started it - read it with `read proc://<name>`
38
38
  and stop it with `write proc://<name>/kill`. Reuse
39
- a suitable same-revision build, server, or result first and redo only what a rework invalidated;
40
- an isolated server and a full production build are never the default. Build no separate
41
- environment for these checks: `implementationOwnership.writerValidation` puts the common isolation
42
- environment and any needed full build, integration, or acceptance check with Main, so request or
43
- reuse that artifact instead of producing your own, and never close a change with no check at all.
39
+ a suitable same-revision build, server, or result first; an isolated server and a full
40
+ production build are never the default, and when a check needs the common environment or a full
41
+ build, request or reuse Main's artifact instead of producing your own.
44
42
  Never hand this validation
45
43
  to someone else and never invent a validator handoff. A later failure must be classifiable as
46
44
  pre-existing or newly introduced.
@@ -62,17 +60,13 @@
62
60
  that now covers it, keeping the same finding id — no separate messenger or new reporting stage.
63
61
  Never weaken an expectation, relax a fixture, or hide a failure to make validation pass.
64
62
  - 관련 Skill을 먼저 읽고 이번 조치에 적용되는 주의사항만 이름·절/locator·위험 요약으로 추린다.
65
- 첫 예상 밖 실패 뒤 재시도 경계에서 런타임이 실패 도구·오류 분류·입력 변경·사이 도구 호출이라는
66
- 관측 사실만으로 이미 advisory를 낸다. 그것을 읽고 런타임이 관측하지 못하는 것 — Skill 충돌·적용
67
- 불가, 승인 필요, 관측 불가 판단 — 만 보충한다. 같은 관측 질문을 다시 batched `judge()`로
68
- 호출하지 않는다.
69
- Skill 원문·소스·로그·비밀은 보내지 않는다. 단순 보충·새 근거 없는 동일 질문은 반복하지 않는다.
70
- 검증 약화나 Skill 충돌·적용 불가가 나오면 문제 된 조치만 보류하고 기존 blocker/조향 DM으로
71
- 원문 오류 locator·Skill locator·제안 조치·보존할 수용 조건을 Main에 보낸다. 독립 작업은 계속한다.
63
+ pre-retry advisory를 보충하다가(Common Rules) 검증 약화나 Skill 충돌·적용 불가가 나오면 문제 된
64
+ 조치만 보류하고 기존 blocker/조향 DM으로 원문 오류 locator·Skill locator·제안 조치·보존할 수용
65
+ 조건을 Main에 보낸다. 독립 작업은 계속한다.
72
66
  Jev는 통지할 위험을 찾는 보조 수단이며 검사 생략 승인자가 아니다. 필수 검사 비활성화·기대치
73
67
  완화는 Jev가 안전하다고 하거나 응답하지 못해도 Main의 사전 판단 없이 실행하지 않는다.
74
68
  환경 오류는 생성물 위치의 모듈 해석·경로·런타임 같은 가벼운 확인으로 먼저 좁힌 뒤 무거운 검사를
75
- 다시 실행한다. `routing.typedJudgmentRouting`의 기존 placement와 통신 경계를 유지한다.
69
+ 다시 실행한다.
76
70
  - Capture original source, contracts, impact-bearing caller locators, and before/after evidence
77
71
  during implementation for the review packet. Hand the confirmed delta and that evidence to Main,
78
72
  who owns the mid-flight and final review and assembles it with your command evidence without
@@ -150,9 +144,9 @@
150
144
  build error. Never put a broken intermediate state on the user's screen. Use the user's browser
151
145
  only when their live session is genuinely required, or when Main tells you to hand a FINISHED
152
146
  surface over for judgement — do not open it on your own initiative.
153
- - Run surface checks in the environment Main provides. Creating a new common isolation environment
154
- or running a full build is Main's by default; do it yourself only when Main explicitly delegated
155
- that run to you in the brief. When you do launch a server (delegated, or no environment exists
147
+ - Run surface checks in the environment Main provides; create a common isolation environment or
148
+ run a full build yourself only when the brief explicitly delegates that run. When you do launch a
149
+ server (delegated, or no environment exists
156
150
  and your slice needs one), start it from the project's own `package.json` script, changing only
157
151
  the port. Hand-reassembling the command drops bundler or runtime flags and breaks the whole
158
152
  dependency graph. When an existing environment already reflects your revision, confirm its
@@ -238,5 +232,3 @@
238
232
  - If a git command fails on `index.lock` or a worktree lock, never delete the lock file —
239
233
  another agent may be working in the same repository. Re-analyze, wait briefly, and retry at
240
234
  most once; if the identical lock failure appears a second time, stop and report it to Main.
241
- - You have **no verdict authority**. Never report `PASS`/`FAIL` on someone else's work; report
242
- facts and let the caller judge.