genetics-mcp 2.26.0 → 2.27.0
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.
- package/bin/aarch64-apple-darwin/gcell +0 -0
- package/bin/aarch64-unknown-linux-musl/gcell +0 -0
- package/bin/manifest.json +5 -5
- package/bin/x86_64-apple-darwin/gcell +0 -0
- package/bin/x86_64-pc-windows-gnu/gcell.exe +0 -0
- package/bin/x86_64-unknown-linux-musl/gcell +0 -0
- package/genetics.mjs +1527 -191
- package/package.json +1 -1
- package/skills/gazette-report/SKILL.md +11 -1
- package/skills/gazette-report/scripts/tone.mjs +30 -3
- package/skills/gazette-report/scripts/tone.test.mjs +31 -0
- package/skills/genetics-cell-id/SKILL.md +73 -54
- package/skills/genetics-define/SKILL.md +34 -1
- package/skills/genetics-report/SKILL.md +67 -69
- package/skills/genetics-report/assets/example/cases-briefing-designs.json +15 -5
- package/skills/genetics-report/assets/example/cases-briefing.json +14 -5
- package/skills/genetics-report/assets/example/cases.json +25 -9
- package/skills/genetics-report/assets/example/decision.json +313 -0
- package/skills/genetics-report/assets/example/report-briefing-designs.json +2 -2
- package/skills/genetics-report/assets/example/report-briefing.json +1 -1
- package/skills/genetics-report/assets/example/report.json +65 -21
- package/skills/genetics-report/assets/render.py +204 -49
- package/skills/genetics-report/references/content-pipeline.md +6 -6
- package/skills/genetics-report/references/decision-format.md +112 -0
- package/skills/genetics-report/references/diagrams.md +52 -94
- package/skills/genetics-report/references/edition-review.workflow.js +81 -31
- package/skills/genetics-report/references/history.md +35 -0
- package/skills/genetics-report/references/lim-portal-format.md +92 -236
- package/skills/genetics-report/references/linear-read-test.workflow.js +33 -10
- package/skills/genetics-report/references/process.md +32 -25
- package/skills/genetics-report/references/readability.md +9 -8
- package/skills/genetics-report/references/reader-review.workflow.js +167 -25
- package/skills/genetics-report/references/visual-first.md +54 -42
- package/skills/genetics-report/assets/diagram.mjs +0 -208
package/package.json
CHANGED
|
@@ -218,6 +218,9 @@ Chapter [1][2][3][4][5][6] 지금 부탁드리는 것 │ 1 / 6 │ 요청
|
|
|
218
218
|
잘린 화면이 아니라 여백으로 읽힌다. 도해를 넣더라도 내용에서 도출된 것만 — 표지에
|
|
219
219
|
전환 전/후를 다시 그리는 식으로 **본문·메타에 이미 있는 사실을 되풀이하지 마라.**
|
|
220
220
|
|
|
221
|
+
**lim-decision 에서는 1쪽 단독 표지를 쓰지 않는다** — 결정 브리핑 서식(genetics-report)의 첫 화면은 머리 한 띠와
|
|
222
|
+
「확인해 주실 것 · 정하실 것 · 막을 결정·일정이 아직 없는 위험」 목록이다(2026-10-06 사용자 승인). 빈 마당 규칙은 그 밖의 관보에 그대로 남는다.
|
|
223
|
+
|
|
221
224
|
---
|
|
222
225
|
|
|
223
226
|
## 색 — 팔레트를 베끼지 말고 문서의 의미에서 뽑는다
|
|
@@ -258,6 +261,10 @@ PDF의 파스텔을 그대로 옮기면 「로봇처럼 베낀 것」이 된다.
|
|
|
258
261
|
|
|
259
262
|
원전 PDF는 도해·흐름도·매트릭스·아이콘·썸네일이 없는 쪽이 거의 없다. 단 **내용에서 도출된 것만** 넣는다. 장식은 금지.
|
|
260
263
|
|
|
264
|
+
**포털 관보(genetics-report 스킬)의 장치는 장치 목록 한 벌이 정본이다** — 무엇을 어느 칸에 · 서버 조건 · 한도 · 만드는 법은
|
|
265
|
+
`private/builder/devices.py`(그 스킬 `references/visual-first.md` §4 표가 거기서 굽힌다). 아래 표는 단일 HTML 을 손으로 조판할 때 CSS 로 짓는 법이다 —
|
|
266
|
+
같은 장치의 「언제」를 여기 따로 정하지 않는다.
|
|
267
|
+
|
|
261
268
|
| 장치 | 언제 | 만드는 법 |
|
|
262
269
|
|---|---|---|
|
|
263
270
|
| **상태 막대** | 전체 분포를 숫자로만 말하고 있을 때 | flex 세그먼트 + `--w:%` |
|
|
@@ -300,7 +307,7 @@ PDF의 파스텔을 그대로 옮기면 「로봇처럼 베낀 것」이 된다.
|
|
|
300
307
|
「확인 **부탁드립니다**」·「회신 주시면 **반영하겠습니다**」·「열어 **주시기 바랍니다**」.
|
|
301
308
|
명사형 종결 `-ㅁ/-음` 은 한국어 상대높임 등급 **밖**이라 청자 높임이 0 이고, 사람에게 직접 쓰면
|
|
302
309
|
하대로 읽힌다 — 겸양 어간이 든 「부탁드림」도 존대가 아니다. 제목은 명사형 「~ 요청」(검수·보고) 또는 물음(결정 문서의 판단 항목)으로 둔다.
|
|
303
|
-
`tone.mjs` 는 요청 자리(판단 항목 본문·강조문·요청 PART 의 간지·판권지 회신 안내)와 「」 인용을 빼고 센다(2026-09-26, 그 파일 ① 경어체 절) — 읽는 법 요청 한 줄은 세며 그 경고는 의도다.
|
|
310
|
+
`tone.mjs` 는 요청 자리(판단 항목 본문·강조문·요청 PART 의 간지·판권지 회신 안내 · lim-decision 의 `data-zone="ask"` 자리)와 「」 인용을 빼고 센다(2026-09-26, 그 파일 ① 경어체 절) — 읽는 법 요청 한 줄은 세며 그 경고는 의도다.
|
|
304
311
|
요청 자리를 세면 규칙을 지킨 문서가 떨어지고, 떨어지지 않으려고 하대로 돌아간다. 요청 자리 밖에서 독자를 부린 꼴(보고 칸 요청문·해라체·칸 정의)까지 합치면
|
|
305
312
|
말투 반려는 여섯 번이다(2026-09-02 · 09-03 ×2 · 09-11 · 09-17 · 09-26, genetics-report `references/history.md` §5). 정본은 genetics(hnl)
|
|
306
313
|
`decisions/고객-문서-요청-자리는-하십시오체로-맺는다-명사형-종결은-하대로-읽힌다.md`.
|
|
@@ -310,6 +317,9 @@ PDF의 파스텔을 그대로 옮기면 「로봇처럼 베낀 것」이 된다.
|
|
|
310
317
|
**문장을 이어 붙인 한글 문단은 기계가 쓴 글처럼 읽힌다.** 한글 보고서의 기본은 한 문장 한 줄이다.
|
|
311
318
|
톤을 개조식으로 고쳐도 이걸 안 하면 AI 티가 남는다 — 낱말이 아니라 **조판**의 문제다.
|
|
312
319
|
|
|
320
|
+
**lim-decision 에서는 문장 칸이 문단으로 선다** — 문장 표식(`.sn`)은 그대로 새기고 표시만 인라인이다. 그래서 `tone.mjs` 의
|
|
321
|
+
이 판정은 그 서식에서 늘 통과하고 아무것도 뜻하지 않는다 — 그 몫은 처음 읽는 독자가 진다(2026-10-06 사용자 승인). 아래는 그 밖의 관보다.
|
|
322
|
+
|
|
313
323
|
**줄만 바꾸면 안 된다.** 실측(report-v2 문장 296개): **26%가 글줄 폭(43자)을 넘어 접힌다.**
|
|
314
324
|
좁은 여백 주석 단(19자/줄)은 **54%**다. 접히면 둘째 줄과 다음 문장의 첫 줄이 같은 자리에서
|
|
315
325
|
시작해 독자가 구별할 수 없다. 그래서 문장마다 **블록으로 세우고 이어지는 줄만 내어쓴다.**
|
|
@@ -17,6 +17,27 @@
|
|
|
17
17
|
import fs from 'fs';
|
|
18
18
|
import { pathToFileURL } from 'url';
|
|
19
19
|
|
|
20
|
+
// `data-zone="ask"` 를 단 요소를 닫는 태그까지 통째로 들어낸다 — 안에 같은 이름의 태그가 겹쳐도 짝을 센다.
|
|
21
|
+
// 결정 브리핑(서식 lim-decision)은 요청 자리를 클래스가 아니라 이 표식으로 단다(2026-10-06, 관보 버전2).
|
|
22
|
+
function dropAskZones(html) {
|
|
23
|
+
const OPEN = /<([a-zA-Z][\w-]*)\b[^>]*\sdata-zone="ask"[^>]*>/g;
|
|
24
|
+
let out = '', from = 0, m;
|
|
25
|
+
while ((m = OPEN.exec(html))) {
|
|
26
|
+
const re = new RegExp(`<(/?)${m[1]}\\b[^>]*>`, 'gi');
|
|
27
|
+
re.lastIndex = m.index + m[0].length;
|
|
28
|
+
let depth = 1, end = html.length, t;
|
|
29
|
+
while ((t = re.exec(html))) {
|
|
30
|
+
if (t[0].endsWith('/>')) continue;
|
|
31
|
+
depth += t[1] ? -1 : 1;
|
|
32
|
+
if (!depth) { end = t.index + t[0].length; break; }
|
|
33
|
+
}
|
|
34
|
+
out += html.slice(from, m.index) + ' ';
|
|
35
|
+
from = end;
|
|
36
|
+
OPEN.lastIndex = end;
|
|
37
|
+
}
|
|
38
|
+
return out + html.slice(from);
|
|
39
|
+
}
|
|
40
|
+
|
|
20
41
|
export function analyze(raw0) {
|
|
21
42
|
const raw = String(raw0)
|
|
22
43
|
.replace(/<script[\s\S]*?<\/script>/g, '')
|
|
@@ -63,6 +84,9 @@ export function analyze(raw0) {
|
|
|
63
84
|
// 아닌 문서(「I」)를 놓치고, 두 PART 가 같은 no 를 가지면(렌더러는 뒤 PART 가 절을 가져간다) 엉뚱한 간지를 뺀다.
|
|
64
85
|
// 단 첫 PART 에 제목도 절도 없으면 렌더러가 그 간지를 안 세운다 — 그때 첫 간지는 PART II 의 것이다. 차례는 PART 를
|
|
65
86
|
// 빠짐없이 순서대로 싣으므로(`li.toc__part`) 첫 간지의 no 가 차례 첫 PART 의 no 와 같을 때만 PART I 로 본다(차례가 없는 조각은 자리로).
|
|
87
|
+
// 2026-10-06 — `[data-zone="ask"]` 안의 글도 요청 자리다(dropAskZones). 결정 브리핑의 확인 요청(물으실 말·하실 일)·대칭 표
|
|
88
|
+
// 「고객 쪽이 하실 일」 칸·결정 장 회신 줄·판권지 회신 안내가 그 자리다. 서버 문체 관문이 빼는 원고 칸과 같은 목록이고,
|
|
89
|
+
// 렌더러가 짓는 회신 문장은 원고 칸이 아니라 서버는 애초에 세지 않는다.
|
|
66
90
|
const pts = [...raw.matchAll(/<section class="pt"[^>]*data-part-no="([^"]*)"[^>]*>/g)];
|
|
67
91
|
const toc1 = (raw.match(/<li class="toc__part" data-part-no="([^"]*)"/) || [])[1];
|
|
68
92
|
let rawReq = raw;
|
|
@@ -71,7 +95,7 @@ export function analyze(raw0) {
|
|
|
71
95
|
const end = raw.indexOf('</section>', pts[0].index);
|
|
72
96
|
if (end > 0) rawReq = raw.slice(0, pts[0].index) + ' ' + raw.slice(end + '</section>'.length);
|
|
73
97
|
}
|
|
74
|
-
const politeTxt = rawReq
|
|
98
|
+
const politeTxt = dropAskZones(rawReq)
|
|
75
99
|
.replace(/<p class="ask__body"[^>]*>[\s\S]*?<\/p>/g, ' ')
|
|
76
100
|
.replace(/<aside class="urgent"[^>]*>[\s\S]*?<\/aside>/g, ' ')
|
|
77
101
|
.replace(/<p class="colophon__note"[^>]*>[\s\S]*?<\/p>/g, ' ')
|
|
@@ -187,7 +211,10 @@ export function analyze(raw0) {
|
|
|
187
211
|
}
|
|
188
212
|
// HTML 블록이 하나도 없으면(.md·평문) 빈 줄로 가른 문단을 블록으로 삼는다.
|
|
189
213
|
if (!blockTexts.length) blockTexts.push(...raw.split(/\n{2,}/).map(s => s.replace(/\s+/g, ' ').trim()).filter(Boolean));
|
|
190
|
-
|
|
214
|
+
// 결정 브리핑(서식 lim-decision)은 문장 표식(.sn)을 새기되 인라인으로 세워 문단으로 읽힌다(2026-10-06 사용자 승인 13-2).
|
|
215
|
+
// 표식이 있으니 이 판정은 그 문서에서 늘 0 이다 — 통과로 읽지 않게 줄 끝에 밝힌다. 그 몫은 처음 읽는 독자가 진다.
|
|
216
|
+
const decision = /<main\b[^>]*\sdata-template="lim-decision"/.test(raw);
|
|
217
|
+
lines.push(`\n[S1] 한 문장 한 줄: 이어 붙인 블록 ${runOn.length}개 (0 이어야 함 — 마침표에서 줄을 바꾼다)${decision ? ' (lim-decision 산문은 문단으로 서므로 이 판정은 뜻이 없다)' : ''}`);
|
|
191
218
|
runOn.slice(0, 10).forEach(r => lines.push(` ✗ ${r.n + 1}문장 한 덩어리 ${r.t}`));
|
|
192
219
|
if (runOn.length) lines.push(' → scripts/sentbreak.py <파일> --apply · CSS 에 .sn { display:block; padding-left:1em; text-indent:-1em }');
|
|
193
220
|
|
|
@@ -221,7 +248,7 @@ export function analyze(raw0) {
|
|
|
221
248
|
const s1extra = student.length + buffer.length + negation.length + order.length + duty.length;
|
|
222
249
|
lines.push(`\n경어체 ${polite.length}건 · 상대에게 내리는 명령 ${order.length + duty.length}건 · 이어 붙인 블록 ${runOn.length}개 · 밀도 초과 ${over}항 · 학생투 ${student.length} · 완충어 ${buffer.length} · 이유 없는 부정 종결 ${negation.length}`);
|
|
223
250
|
const fail = Boolean(polite.length || over || runOn.length || s1extra);
|
|
224
|
-
return { polite, order, duty, runOn, over, student, buffer, negation, inlineEmph, textLen: txt.length, lines, fail };
|
|
251
|
+
return { polite, order, duty, runOn, over, student, buffer, negation, inlineEmph, decision, textLen: txt.length, lines, fail };
|
|
225
252
|
}
|
|
226
253
|
|
|
227
254
|
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
@@ -202,6 +202,37 @@ test('경어체 — PART I 은 문서 순서로 첫 간지다, no 가 「1」이
|
|
|
202
202
|
assert.equal(pos(analyze(dupNo).polite.length), 1);
|
|
203
203
|
});
|
|
204
204
|
|
|
205
|
+
test('경어체 — 결정 브리핑의 data-zone="ask" 안은 요청 자리라 세지 않는다, 밖은 센다(2026-10-06)', () => {
|
|
206
|
+
// 확인 요청 본문 · 대칭 표 「고객 쪽이 하실 일」 칸 · 회신 줄 — 렌더러가 클래스가 아니라 표식으로 단 요청 자리.
|
|
207
|
+
const zones = '<article class="dec-ask" data-uid="q3x8a1"><h3>계절 주제 질문에서도 더 잘 찾는가</h3>'
|
|
208
|
+
+ '<p data-zone="ask" data-field="ask">질문을 보내 주시면 같은 시험으로 재겠습니다.</p></article>'
|
|
209
|
+
+ '<table><tr><td data-zone="ask">바꾸는 날짜를 정해 주시면 반영하겠습니다.</td><td>하실 일 없음</td></tr></table>'
|
|
210
|
+
+ '<section class="dec-reply" data-zone="ask"><p>「지금 방식 유지」, 「방식 A」 가운데 하나로 회신해 주십시오.</p></section>';
|
|
211
|
+
assert.equal(analyze(zones).polite.length, 0, analyze(zones).polite.join(' | '));
|
|
212
|
+
// 같은 세 문장에서 표식만 걷으면 셋 다 센다 — 위 0 이 문장이 경어체가 아니어서 난 0 이 아님을 보인다.
|
|
213
|
+
assert.equal(pos(analyze(zones.replaceAll(' data-zone="ask"', '')).polite.length), 3);
|
|
214
|
+
// 겹친 같은 이름 태그 — 안쪽 </section> 에서 자리를 닫으면 뒤 문장이 새어 센다. 뮤테이션: 짝 세기를 첫 닫는 태그로 바꾸면 2 가 되어 죽는다.
|
|
215
|
+
const nested = '<section class="dec-reply" data-zone="ask"><section><p>앞 줄입니다.</p></section>'
|
|
216
|
+
+ '<p>조건이 있으면 함께 적어 주십시오.</p></section><p>자리 밖의 문장입니다.</p>';
|
|
217
|
+
const n = analyze(nested);
|
|
218
|
+
assert.equal(pos(n.polite.length), 1, n.polite.join(' | '));
|
|
219
|
+
assert.equal(n.polite[0].includes('자리 밖'), true, n.polite.join(' | '));
|
|
220
|
+
// 대조군 — 표식이 없는 같은 칸은 센다. 뮤테이션: 표식 없이 td 를 다 빼면 여기서 죽는다.
|
|
221
|
+
assert.equal(pos(analyze('<table><tr><td>바꾸는 날짜를 정해 주시면 반영하겠습니다.</td></tr></table>').polite.length), 1);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
test('한 문장 한 줄 — 결정 브리핑(lim-decision)에서는 판정이 뜻이 없다고 줄 끝에 밝힌다(2026-10-06)', () => {
|
|
225
|
+
const body = '<p><span class="sn">첫 문장임.</span> <span class="sn">둘째 문장임.</span></p>';
|
|
226
|
+
const dec = analyze(`<main class="doc dec" id="main" data-template="lim-decision">${body}</main>`);
|
|
227
|
+
assert.equal(dec.decision, true);
|
|
228
|
+
assert.equal(dec.lines.some((l) => l.includes('[S1] 한 문장 한 줄') && l.includes('lim-decision 산문은 문단으로 서므로 이 판정은 뜻이 없다')), true);
|
|
229
|
+
// 대조군 — 서식 표식이 없는 관보(lim-report)에는 붙지 않는다. 뮤테이션: 표식 검사를 빼면 여기서 죽는다.
|
|
230
|
+
const rep = analyze(`<main class="doc" id="main">${body}</main>`);
|
|
231
|
+
assert.equal(rep.decision, false);
|
|
232
|
+
assert.equal(rep.lines.some((l) => l.includes('뜻이 없다')), false);
|
|
233
|
+
pos(1);
|
|
234
|
+
});
|
|
235
|
+
|
|
205
236
|
test('양성 표본 수 — 0표본 통과 방지', () => {
|
|
206
237
|
console.log(` 양성 표본 ${positives}건 (0 이면 이 시험은 아무것도 안 잰 것)`);
|
|
207
238
|
assert.equal(positives >= 28, true, String(positives));
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
name: genetics-cell-id
|
|
3
3
|
description: |
|
|
4
4
|
이 기계에서 **누가 무엇을 만지고 있는지** 세포(gcell)에게 물어 답합니다 —
|
|
5
|
-
내 세션
|
|
5
|
+
내 세션 uuid, 옆 세션의 주소(세션 uuid)와 지금 이름, 이 파일의 주인, 내가 모르는 사이 바뀐 것.
|
|
6
6
|
다음과 같은 요청 시 사용하세요:
|
|
7
7
|
- "너 세션번호가?" / "내 세션 id 뭐야" / "제네틱에서 나는 누구야"
|
|
8
8
|
- "지금 이거 누가 만지고 있어?" / "이 파일 주인이 누구야" / "다른 창에서 뭐 하고 있어"
|
|
9
|
-
- "옆 세션한테 물어봐" / "그쪽에 알려줘" (→
|
|
9
|
+
- "옆 세션한테 물어봐" / "그쪽에 알려줘" (→ 그 세션의 uuid 를 알아내고 mail)
|
|
10
10
|
- "내가 모르는 사이에 뭐 바뀌었어?" / "지금 알고 있는 게 아직 맞아?"
|
|
11
11
|
그리고 사람이 안 시켜도 부를 때: **공유 트리에 커밋·배포하기 전**, 여러 세션이 도는
|
|
12
12
|
저장소를 고치기 전, 그리고 「내 모델이 낡았나」가 의심될 때.
|
|
13
13
|
[책임 경계] vs genetics-report: 저 스킬=고객에게 낼 문서, 이 스킬=지금 이 기계의 사람·세션 지형.
|
|
14
14
|
[책임 경계] vs genetics-sync: 저 스킬=내 지식을 지금에 맞추는 절차(내 일·결정·바뀐 파일), 이 스킬=누가 어디 있나·나는 누구인가.
|
|
15
|
-
version: "1.
|
|
15
|
+
version: "1.4.0"
|
|
16
16
|
---
|
|
17
17
|
|
|
18
18
|
# 세포에게 신원을 묻는다 (genetics-cell-id)
|
|
@@ -58,41 +58,52 @@ PATH 에 있고 쓸 수 있는 첫 자리에 심링크). 전에는 안 걸어서
|
|
|
58
58
|
|
|
59
59
|
## 묻는 법 — 명령 넷
|
|
60
60
|
|
|
61
|
-
### 1. 여기 누가 있는가 ·
|
|
61
|
+
### 1. 여기 누가 있는가 · 어디로 보내나 → `agents`
|
|
62
62
|
|
|
63
|
-
**옆 세션에게 말을 걸어야 할 때 이것부터입니다.**
|
|
64
|
-
|
|
63
|
+
**옆 세션에게 말을 걸어야 할 때 이것부터입니다.** 행의 머리가 그 세션의 **주소, 세션 uuid** 입니다. 그 아래
|
|
64
|
+
「지금 이름 X(HH:MMZ 기준)」은 그 시각 하네스 등록부(`~/.claude/sessions`)의 값으로, `ListAgents`·`SendMessage` 가
|
|
65
|
+
쓰는 그 이름이지만 **그 순간의 값**입니다(아래 「말 걸기」).
|
|
65
66
|
|
|
66
67
|
```bash
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
gcell agents # 현재 폴더의 저장소 · 최근 360분
|
|
69
|
+
gcell agents --since 60 # 최근 1시간
|
|
70
|
+
gcell agents --path frontend # 그 경로를 만진 세포만
|
|
71
|
+
gcell agents --session <uuid> # 그 세션 하나의 지금 이름 — 저장소를 안 훑어 바로 끝난다
|
|
72
|
+
gcell agents --self # 나
|
|
70
73
|
```
|
|
71
74
|
|
|
72
|
-
실측
|
|
75
|
+
실측 출력(2026-10-07, `gcell agents --since 1440 --path dev/`):
|
|
73
76
|
|
|
74
77
|
```text
|
|
75
|
-
최근
|
|
78
|
+
최근 1440분 · 세포 1곳 · 이름은 19:13Z 기준 하네스 등록부의 값
|
|
76
79
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
·
|
|
81
|
-
|
|
82
|
-
app-2f [812eb5]
|
|
83
|
-
세션 065131a7-4e15-467a-b159-63eb727e7269 · claude-code · 마지막 12:52Z
|
|
84
|
-
· FCG-CX-Agent/frontend/src/shell/LlmStatusBadge.jsx
|
|
80
|
+
469cd2a5-196a-43cb-bb6e-f8751b9dcd18
|
|
81
|
+
지금 이름 report-portal-37(19:13Z 기준) · claude-code · 마지막 15:55Z · 하위 에이전트 포함
|
|
82
|
+
참고: 전사의 마지막 자기소개는 옛 이름 report-portal-26 — 프로세스가 다시 뜨며 이름이 바뀌었다
|
|
83
|
+
· dev/suites/access.sh
|
|
85
84
|
```
|
|
86
85
|
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
행 하나가 세션 하나이고, 워크플로·Task 의 하위 에이전트가 만진 파일은 부모 세션 행에 붙습니다(「하위 에이전트 포함」).
|
|
87
|
+
「지금 목록에 없음」이면 떠 있지 않아 `SendMessage` 로는 안 닿습니다 — 말을 남기려면 `mail` 에 uuid 로. 「참고:」 줄의
|
|
88
|
+
옛 이름은 주소가 아닙니다. 내 행에는 「이 세션」이 붙습니다.
|
|
89
|
+
|
|
90
|
+
이름 줄이 셋 말고 둘 더 있습니다.
|
|
91
|
+
- **「떠 있는지 못 잼」** — 세포가 그 줄을 잴 수 없었다는 뜻입니다(Windows 판 세포는 프로세스를 못 잰다 · 다른 기계·컨테이너의
|
|
92
|
+
줄 · 시작 시각을 못 맞춤). 「목록에 없음」이 아니니 `ListAgents` 에 보이면 그 이름으로 `SendMessage` 가 닿습니다. `mail` 은 uuid 로.
|
|
93
|
+
- **「⚠ 이 uuid 를 지금 창 N곳이 함께 띄우고 있다」** — 한 대화를 창 여럿이 열었습니다(같은 대화를 다른 창에서 이어 연 경우 —
|
|
94
|
+
2026-10-07 이 기계 실측 7쌍). 그 uuid 앞 `mail` 은 한 편지함이라 **어느 창이 받을지 정해지지 않습니다.** 한 창에 닿으려면 그 줄에
|
|
95
|
+
적힌 그 창의 지금 이름으로 `SendMessage` 합니다. 이런 세션은 MCP 가 메일 주소록에 이름을 안 댑니다(창마다 이름이 달라 번갈아 뒤집힌다).
|
|
96
|
+
|
|
97
|
+
`--json`(목록·`--session`·`--self` 모두)은 한 줄에 한 세션 JSON 입니다 — `session · name · live · pid · source · stale_name ·
|
|
98
|
+
checked_at` 에 `matched_by`(`--self` 가 나를 찾은 열쇠 — 소켓·CLAUDE_PID·세션 id) · `live_rows`(그 uuid 의 산 줄 수 — 2 이상이면
|
|
99
|
+
창 여럿) · `measured`(떠 있지 않다는 답을 재서 냈나 — 거짓이면 「못 잼」)가 붙습니다.
|
|
89
100
|
|
|
90
101
|
### 2. 이 파일의 주인이 누구인가 → `who --path`
|
|
91
102
|
|
|
92
103
|
고치기 전에 묻습니다. 파일 중심으로 답합니다.
|
|
93
104
|
|
|
94
105
|
```bash
|
|
95
|
-
|
|
106
|
+
gcell who --path www/portal
|
|
96
107
|
```
|
|
97
108
|
|
|
98
109
|
```text
|
|
@@ -103,14 +114,15 @@ PATH 에 있고 쓸 수 있는 첫 자리에 심링크). 전에는 안 걸어서
|
|
|
103
114
|
· www/portal/lib/genetics_weights.php — claude-code 04:50Z
|
|
104
115
|
```
|
|
105
116
|
|
|
106
|
-
|
|
117
|
+
괄호 안은 세션 uuid 의 **끝 8자**라 `mail` 의 `to` 로는 안 풀립니다. 말을 걸려면 같은 경로로
|
|
118
|
+
`agents --path` 를 돌려 그 행 머리의 uuid 를 씁니다.
|
|
107
119
|
|
|
108
120
|
### 3. 내가 모르는 사이 무엇이 바뀌었는가 → `delta`
|
|
109
121
|
|
|
110
122
|
「내가 알고 있는 게 아직 맞나」에 답합니다. 오래 도는 세션에서 특히 그렇습니다.
|
|
111
123
|
|
|
112
124
|
```bash
|
|
113
|
-
|
|
125
|
+
gcell delta
|
|
114
126
|
```
|
|
115
127
|
|
|
116
128
|
```text
|
|
@@ -121,24 +133,21 @@ PATH 에 있고 쓸 수 있는 첫 자리에 심링크). 전에는 안 걸어서
|
|
|
121
133
|
### 4. 세포가 무엇을 쥐고 있는가 → `status`
|
|
122
134
|
|
|
123
135
|
세션별 믿음·깨움·전사 줄수를 냅니다. 진단용이고, 신원 확인용은 아닙니다 —
|
|
124
|
-
**어느 줄이 나인지 표시해 주지 않습니다.**
|
|
136
|
+
**어느 줄이 나인지 표시해 주지 않습니다.** 나는 `agents --self` 로 묻습니다.
|
|
125
137
|
|
|
126
138
|
## 나는 누구인가
|
|
127
139
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
프로젝트 슬러그는 작업 폴더 경로를 `-` 로 바꾼 것입니다(예: `-Users-me-project-app`).
|
|
135
|
-
스크래치패드 경로에도 같은 uuid 가 들어 있습니다.
|
|
140
|
+
`gcell agents --self` 가 하네스 등록부에서 **이 프로세스의 줄**을 찾아(메시징 소켓 → `CLAUDE_PID` → 세션 id 차례)
|
|
141
|
+
내 세션 uuid 와 지금 이름을 냅니다. 하위 에이전트(워크플로·Task)에서 불러도 부모 세션이 나옵니다 — 메일도 쓰기도 그
|
|
142
|
+
세션 몫입니다. 세포가 없으면 `echo $CLAUDE_CODE_SESSION_ID`(Claude Code 가 Bash 에 넣어 준다)가 내 세션 uuid 입니다.
|
|
143
|
+
`/clear` 뒤에는 등록부 줄의 세션이 새 대화의 uuid 로 바뀝니다 — `--self` 와 MCP 의 메일 주소는 그 새 uuid 를 따라가고, 옛 uuid
|
|
144
|
+
앞으로 온 답장도 다른 창이 그 대화를 이어 열기 전까지는 이 창이 긷습니다(그런 통에는 「/clear 앞 대화 앞으로 온 통」이 붙는다).
|
|
136
145
|
|
|
137
146
|
**사람·소속처는 세포가 아니라 MCP 에 묻습니다.**
|
|
138
147
|
|
|
139
148
|
| 무엇 | 어디에 |
|
|
140
149
|
|---|---|
|
|
141
|
-
| 내 세션 uuid |
|
|
150
|
+
| 내 세션 uuid · 지금 이름 | `gcell agents --self` |
|
|
142
151
|
| 내가 어느 사람·어느 권한으로 붙어 있나 | `whoami` 도구 |
|
|
143
152
|
| 내가 닿는 소속처 목록(slug 포함) | `list_my_tenants` 도구 |
|
|
144
153
|
| 내 세션이 서버에 올라가 있나 | `list_sessions` 도구 — 목록에 내 앞자리가 있는지 본다 |
|
|
@@ -149,32 +158,41 @@ ls -t ~/.claude/projects/<프로젝트-슬러그>/*.jsonl | head -1
|
|
|
149
158
|
창구를 가르지 않습니다. `SendMessage` 는 **양쪽이 이 기계의 Claude Code 이고 `ListAgents` 에
|
|
150
159
|
있을 때만** 쓰는 임의 지름길입니다. 목록에 없다고 해서 안 닿는 것이 아닙니다.
|
|
151
160
|
|
|
161
|
+
**규칙은 하나입니다 — 주소는 세션 uuid 이고, 이름은 보내기 직전에 풉니다.** 적어 두었다가 다시 쓸 주소(세션 시작
|
|
162
|
+
안내의 이웃 줄, `agents` 출력, 받은 메일, 메모)는 uuid 이고, `mail` 은 uuid 로 보냅니다. 이름은 `SendMessage` 에만
|
|
163
|
+
필요하고, **보내기 직전에** `gcell agents --session <uuid>` 나 `ListAgents` 로 풉니다.
|
|
164
|
+
|
|
165
|
+
까닭은 하네스가 세션 이름을 **프로세스가 뜰 때마다 새로 뽑기** 때문입니다(접미 2자리 16진, 256가지). 적어 둔 이름은
|
|
166
|
+
상대가 다시 뜨면 「No agent named …」로 죽거나, 같은 이름을 새로 받은 **남의 세션에게 오류 없이** 갑니다. 실측(2026-10-07):
|
|
167
|
+
469cd2a5 의 이름은 닷새 사이 `report-portal-eb` → `-26` → `-37` 이었고, 7afd1d02(그때 `hnl-99`)의 전사에 남은 옛 이름
|
|
168
|
+
`hnl-73` 은 그때 남의 세션 110cd958 의 이름이었으며, 같은 초에 뜬 두 세션이 `app-09` 를 함께 받기도 했습니다. 이름으로
|
|
169
|
+
부친 메일이 39초 만에 동명이인에게 배달된 일도 있습니다(2026-08-25).
|
|
170
|
+
|
|
152
171
|
```
|
|
153
|
-
mail({tenant: "<소속처 slug>", to: "
|
|
154
|
-
mail({tenant: "<소속처 slug>", to: "brain", body: "…"})
|
|
155
|
-
|
|
172
|
+
mail({tenant: "<소속처 slug>", to: "<세션 uuid>", body: "…"}) # 정본 — 같은 기계·다른 기계·Cursor·Codex
|
|
173
|
+
mail({tenant: "<소속처 slug>", to: "brain", body: "…"}) # 두뇌
|
|
174
|
+
gcell agents --session <세션 uuid> # SendMessage 직전 — 「지금 이름 X」를 받는다
|
|
175
|
+
SendMessage({to: "X", message: "…"}) # 지름길 — 이 기계 Claude Code 끼리만
|
|
156
176
|
```
|
|
157
177
|
|
|
158
|
-
|
|
159
|
-
|
|
178
|
+
`SendMessage` 가 「No agent named …」로 실패하면 uuid 로 다시 풉니다. 오류에 붙는 「Did you mean: …?」은 편집 거리
|
|
179
|
+
2 이하인 이름을 셋까지 고른 **철자 추천**이라 남의 세션일 수 있어 따르지 않습니다(10-07 등록부로 재면 옛 이름
|
|
180
|
+
`app-6c` 의 첫 추천은 남의 세션 `app-ac`). 같은 이름의 산 세션이 둘이면 이름으로는 못 가르니 uuid 로 `mail` 합니다.
|
|
160
181
|
|
|
161
|
-
|
|
182
|
+
답장에는 받은 메일의 **답장 주소**(보낸 세션 uuid)를 `to` 에, `· 실:` 줄의 32자리 값을 `thread` 에 그대로 씁니다(같은
|
|
183
|
+
실로 이어진다). `SendMessage` 로 받은 것에 곧바로 답할 때는 그 메시지의 `from` 을 그대로 `to` 에 씁니다.
|
|
184
|
+
|
|
185
|
+
`mail` 의 `to` 에 쓸 것은 **셋**입니다. **지어내지 마세요** — 셋 중 하나가 아니면
|
|
162
186
|
사용자에게 묻습니다. 소속처 값(slug — 이름도 받는다)을 모르면 `list_my_tenants` 로 먼저 확인합니다.
|
|
163
187
|
|
|
164
|
-
| `to` |
|
|
188
|
+
| `to` | 누구에게 |
|
|
165
189
|
|---|---|
|
|
166
|
-
| **세션 uuid** |
|
|
167
|
-
| 세포 이름 (`app-2f`) | 이 기계 안에서 사람이 부를 때. **불안정한 별칭입니다 — 아래** |
|
|
190
|
+
| **세션 uuid** | 세션에게 — `agents` 행 머리, 받은 메일의 답장 주소 |
|
|
168
191
|
| `brain` | 두뇌에게. 주소가 필요 없습니다 |
|
|
169
192
|
| 담당의 이메일 | 사람에게. **그 소속처 담당만** 받고 포털 알림이 남습니다. 모르면 사용자에게 묻습니다 |
|
|
170
193
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
그 이름으로 부친 통은 **먼저 쥔 쪽에게 갑니다.**
|
|
174
|
-
|
|
175
|
-
2026-08-25 실측 — 이름 접미가 2자리 16진(256가지)인데 한 기계에 세션 13개가 돌아
|
|
176
|
-
충돌 확률이 **26.6%** 입니다. 실제로 났습니다: 이름으로 부친 통(실 `bc3b4f59`)은 39초 만에
|
|
177
|
-
**동명이인에게** 배달됐고, uuid 로 부친 통(실 `9003652b`)은 47초 만에 제자리에 닿았습니다.
|
|
194
|
+
세션 이름도 받지만 그 순간의 별칭입니다 — 사람이 방금 부른 이름이면 그대로 보내고, 그 뒤로는 보낸 결과의
|
|
195
|
+
「받는 세션: <uuid>」를 주소로 씁니다.
|
|
178
196
|
|
|
179
197
|
받는 것은 부를 필요가 없습니다 — 온 것은 **다른 도구를 부를 때 응답 꼬리에 저절로 실립니다.**
|
|
180
198
|
|
|
@@ -191,7 +209,7 @@ SendMessage({to: "app-2f", message: "…"}) # 지름길 —
|
|
|
191
209
|
|
|
192
210
|
1. `agents --path <내가 만질 경로>` — 지금 그 자리에 누가 있나
|
|
193
211
|
2. `git status` — **인덱스에 남의 스테이징이 있나**
|
|
194
|
-
3. 있으면 커밋하지 말고 그 세포에게 물어봅니다(`mail`)
|
|
212
|
+
3. 있으면 커밋하지 말고 그 세포에게 물어봅니다(`mail` — `to` 는 그 행의 uuid)
|
|
195
213
|
4. 내가 만든 것만 골라 커밋합니다
|
|
196
214
|
|
|
197
215
|
「mtime 이 최근이니 내 것이겠지」는 근거가 아닙니다. 세포에게 물으면 **누가 언제 썼는지**가
|
|
@@ -207,14 +225,15 @@ HEAD 사본 검사)은 `genetics-sync` 스킬이 정본입니다.
|
|
|
207
225
|
| `gcell` 이 PATH 에 없다 | 전체 경로 또는 `GENETICS_CELL_BIN` 을 쓴다 |
|
|
208
226
|
| `--since` 기본이 360분 | 그보다 오래된 작업은 **안 보인다**. 「아무도 없다」는 6시간 안의 이야기다 |
|
|
209
227
|
| 저장소 판정이 현재 폴더 기준 | 다른 저장소를 보려면 `--root <경로>` |
|
|
210
|
-
| `who` 의 짧은 id 로는 말을 못 건다 | 주소는 `agents` 의 이름이다 |
|
|
211
228
|
| 세포는 이 기계만 본다 | 다른 기계를 **보는** 것은 `world`, **말 거는** 것은 `mail` |
|
|
212
229
|
| `ListAgents` 에 없어서 안 닿는다 했다 | 그 목록은 Claude Code 만 본다. 발견은 `agents`, 말걸기는 `mail` |
|
|
213
230
|
| `SendMessage` 로 Cursor·다른 기계에 보냈다 | **안 간다.** 지름길은 이 기계 Claude Code 끼리만 — `mail` 을 쓴다 |
|
|
231
|
+
| 적어 둔 이름으로 보냈다 — 「No agent named …」·딴 세션이 받음 | 「말 걸기」의 규칙 — 주소는 uuid, 이름은 보내기 직전에 푼다. 「Did you mean」은 따르지 않는다 |
|
|
232
|
+
| uuid 로 보냈는데 엉뚱한 창이 받았다 | 그 uuid 를 창 여럿이 띄우고 있다(`agents --session <uuid>` 의 「창 N곳」). 한 창에는 그 창의 이름으로 `SendMessage` |
|
|
233
|
+
| 「떠 있는지 못 잼」을 「끝났다」로 읽었다 | 못 잰 것이지 없는 것이 아니다(Windows 세포 · 다른 기계의 줄). `ListAgents` 로 확인하고, 말은 `mail` 에 uuid 로 |
|
|
234
|
+
| `agents --session`·`--self` 에 목록이 나온다 | 깔린 세포가 그 옵션 전의 판이다. 이름은 `ListAgents` 로, `mail` 은 uuid 로 — 세포 교체는 사람의 결정이다 |
|
|
214
235
|
| 왕복이 길어진다 | 한 실에 상한이 있다 — **왕복(보내고 답하면 1왕복) 사람이 낀 실 5회·기계끼리 3회, 답 없이 연달아 3통.** 넘으면 409 로 거절되고 **사람에게 저절로 알리는 기능은 아직 없다** — 사람의 판단이 필요하면 이 세션의 사용자에게 말하거나 담당의 이메일로 thread 없이 보낸다 |
|
|
215
|
-
| 이름으로 부쳤는데 딴 세션이 받았다 | 같은 이름의 **산 세션**이 있다. 이름은 별칭이니 **uuid** 로 부친다 |
|
|
216
236
|
| 보냈는데 답이 없다 | 받는 쪽 꼬리는 **그쪽이 도구를 불러야** 붙는다 — 폴 60초 + 그 간격이다(실측 47·39초) |
|
|
217
|
-
| `status` 에 내 줄이 표시되지 않는다 | 내 uuid 는 전사 파일 이름에서 얻는다 |
|
|
218
237
|
|
|
219
238
|
## 무엇을 하지 않는가
|
|
220
239
|
|
|
@@ -130,7 +130,7 @@ source(genetics|code|guess)를 적어라. 애매하면 guess 다.」
|
|
|
130
130
|
### 6. 결정문 — remember_decision 의 규율
|
|
131
131
|
|
|
132
132
|
- **글자 상한은 장 전체(제목+what+why+who+reopen 합산)다, why 만이 아니다.** 어느 회차에서 why 3809자가
|
|
133
|
-
「4522자」로 거절됐다. 상한은 포털의 `WIKI_DECISION_MAX_CHARS` — 결정 장은 10000 으로 올라갔고 사례 장(remember_case)은 4000
|
|
133
|
+
「4522자」로 거절됐다. 상한은 포털의 `WIKI_DECISION_MAX_CHARS` — 결정 장은 10000 으로 올라갔고 사례 장(remember_case)은 8000 이다(2026-10-01 4000 → 8000).
|
|
134
134
|
거절되면 실물 줄 인용을 지우지 말고 절 단위로 장을 가른다(I-A/I-B 처럼).
|
|
135
135
|
- **같은 제목 = 덮어쓰기.** 서로 다른 결정은 장을 가른다(사업 규칙 하나당 장 하나).
|
|
136
136
|
- **`work:` 는 항목 장에만.** 설계·계약·사업 규칙 장에 붙이면 항목이 늘어난다.
|
|
@@ -181,6 +181,18 @@ source(genetics|code|guess)를 적어라. 애매하면 guess 다.」
|
|
|
181
181
|
| **R-03**(단일 저장소, 반박 워크플로 3렌즈+합침 먼저 → 실측) 1차 | 1 / 18 | 0 / 18 | 54칸 전부 genetics. 갈림 1 은 문서에 **있는** 화면 하나를 한 세션이 놓친 것 → 그 절을 「화면 집합 셋」 한 줄 목록으로 다시 씀 |
|
|
182
182
|
| R-03 2차 | **0 / 18** | **0 / 18** | 이름 갈림 0. 오너 미결 5(잠정값을 계약에 적어 두니 셋이 같은 잠정값으로 읽음) |
|
|
183
183
|
| R-03 3차(규칙 뒤집힘 뒤 축소 5문항) | **0 / 5** | **0 / 5** | 뒤집힌 옛 장에 「상태: 뒤집힘」이 있어 셋 다 새 장을 따름 — 뒤집을 땐 옛 장 상태를 반드시 표시 |
|
|
184
|
+
| **G-01**(큰 항목: 대표 결정 6 · 계약 8장 + 부록 13장 · 실측 모음 1장 · 18문항, 저장소 하나 — 렌즈 반박을 실측 사이마다) 옛 계약 1~4차 | 4 → 7 → 1 → 1 / 18 | 0 / 18 | 대표가 뼈대(외부 변환 엔진에 기대는 길)를 뒤집어 새 계약으로 1차부터 다시 |
|
|
185
|
+
| G-01 새 계약 1차 | 9 / 18 | 0 / 18 | 54칸 genetics. 적히지 않음 위주(찾는 차례 · 입출력 틀 · 실행 단위 · 재시도) |
|
|
186
|
+
| G-01 2차 | 2 / 18 | 0 / 18 | 같은 측정에 **어긋남 찾기 감사자 + 반박 검증자**를 붙임 — 찾음 29 · 맞음 20 |
|
|
187
|
+
| G-01 3차 | 1 / 18 | 0 / 18 | 산출물 자리 겹침 하나. 어긋남 15(맞음 14) · 고친 판 렌즈 재검증 31(맞음 29) |
|
|
188
|
+
| G-01 4차 | 1 / 18 | 1 / 18 | 화질 문턱의 정의 하나. 어긋남 16(맞음 12) · 렌즈 재검증 38(맞음 25) |
|
|
189
|
+
| **G-01 5차** | **0 / 18** | **0 / 18** | 54칸 genetics. 그러나 같은 측정의 어긋남 찾기 16건이 **전부 맞음** — 문항이 닿지 않는 장끼리 어긋남이 남아 있었다 |
|
|
190
|
+
| **G-01 6차**(5차 어긋남 16 · 「내가 정함」 로직 여섯 반영, 렌즈 재검증 39(맞음 32)) | **0 / 18** | **0 / 18** | 54칸 genetics, 어긋남 8(맞음 4). 두 회차 연속 0 |
|
|
191
|
+
| G-01 7차(6차 뒤 못 박은 판 — 렌즈 재검증 28(맞음 24) 반영) | 1 / 18 | 0 / 18 | **0 을 두 번 채운 뒤 못 박은 문장이 새 갈림을 냈다** — 절을 새 부록으로 옮기자 세션들이 그 절의 세부(「같은 채운 도형 안」 판정)까지 파 들어감. 어긋남 13(맞음 8) |
|
|
192
|
+
| **G-01 8차** | **0 / 18** | **0 / 18** | 54칸 genetics, 7차 갈림과 잠재 갈림 둘이 같은 로직으로 닫힘. 어긋남 13(맞음 9) |
|
|
193
|
+
| **G-01 9차**(8차 어긋남 9 · 한 줄 반영) | **0 / 18** | **0 / 18** | 54칸 genetics(대조자 「이 회차로 정의를 닫는다」), 어긋남 7(맞음 6). 그러나 그 고친 판을 렌즈로 다시 찾자 28건 — 셋은 서명 판정을 외부 도구의 종료코드에 기댄 자리였다(같은 표본 9개를 도구 두 판으로 재니 빈 서명 칸도 「서명 있음」 쪽 종료코드였고 값이 틀린 서명은 판마다 달랐다) → 구조 검사로 바꿈 |
|
|
194
|
+
| G-01 10차(9차 뒤 고친 판 — 렌즈 재검증 28 · 반박 에이전트가 한도로 0건이라 기록자가 원문 · 실측으로 판정) | 2 / 18 | 0 / 18 | 둘 다 「문서가 애매함」 — 입력이 없는 하위 명령의 stdin 꼴 · 빈 표를 누가 짓나(그 엔진엔 빈 문서를 만드는 명령이 없음 — 읽기 세션 하나가 코드에서 찾음). 어긋남 9(맞음 5) |
|
|
195
|
+
| **G-01 11차**(갈림 둘 · 어긋남 맞음 5 · 대조자가 짚은 잠재 갈림 둘 반영) | **0 / 18** | **0 / 18** | 54칸 genetics · 18문항 모두 「이름만」. **닫음** — 어긋남 찾기 5(맞음 4)와 대조자 메모는 판을 바꾸지 않고 genetics 후보 장으로. 맞음 4 중 하나는 10차 고침이 한 장만 고치고 같은 문장을 가진 두 장을 놓친 것 |
|
|
184
196
|
|
|
185
197
|
**UI 말줄임류의 교훈**: 「부모 폭」을 파일 하나로 적으면 회차마다 한 층씩 올라간다. 처음부터 **조상 사슬 전부**를
|
|
186
198
|
규칙 한 줄 + 실측 목록으로 적는다.
|
|
@@ -208,6 +220,27 @@ W-02 의 교훈: **로직 갈림 0 이어도 「내가 정함」·code 출처가
|
|
|
208
220
|
지점 단위 지표). 수렴은 결정이 아니다 — 오너에게 물었고 넷을 확정했으며, 그중 하나(인원 필터)는
|
|
209
221
|
질문 자체가 반려됐다.
|
|
210
222
|
|
|
223
|
+
G-01 의 교훈(장 20장이 넘는 큰 항목 — 새 계약 11회차, 갈림 9 → 2 → 1 → 1 → 0 → 0 → 1 → 0 → 0 → 2 → 0):
|
|
224
|
+
① **18문항과 따로 「어긋남 찾기」 감사자와 반박 검증자를 같은 측정에 붙인다** — 문항이 닿지 않는 장끼리 어긋남은 갈림 0 인 회차에도
|
|
225
|
+
16건이 남아 있었다(문항은 「같은 로직을 내나」, 감사는 「장끼리 맞나」를 잰다).
|
|
226
|
+
② **고친 판은 올리기 전에 렌즈 셋(충실 · 새 어긋남 · 코드 인용)으로 찾고 렌즈마다 반박한다** — 회차마다 내 고침이 새로 연 자리가
|
|
227
|
+
맞음 24~32건 나왔다. 규칙을 잘게 박을수록 그 규칙의 이웃 자리가 새로 열린다(예: 값을 ÷ 100 으로 정하자 레이블 · 서식 · 비교 자가 줄줄이 열림).
|
|
228
|
+
③ **0 을 채운 뒤 못 박은 문장도 최종 판에서 다시 잰다** — 6차 0 뒤 못 박고 절을 옮긴 판이 7차에 갈림 1, 9차 0 뒤 렌즈 28건을 고친 판이 10차에 갈림 2 를 냈다.
|
|
229
|
+
④ **장 글자 상한이 절 쪼개기를 강제한다** — 부록 장을 「본 장의 절을 옮김」으로 두고 항목 장 「읽는 순서」에 넣는다. who 줄에 회차를
|
|
230
|
+
적으면 회차마다 모든 장이 바뀌니 회차는 항목 장 한 곳에(항목 장 회차 줄도 상한에 닿으면 옛 줄을 묶어 줄인다). 가리키는 장의 제목 목록도 「항목 장 「읽는 순서」」 한 줄로.
|
|
231
|
+
⑤ 「내가 정함」을 못 박기 전에 **그 자리가 관문과 부딪히는지** 본다 — 세 세션이 같게 고른 「문단 하나 = 상자 하나」를 그대로 박았으면
|
|
232
|
+
상자 경계 100% 관문을 글머리 목록에서 영원히 못 넘었다.
|
|
233
|
+
⑥ **세션 사용 한도에 걸린 측정은 결과 0건이다** — 한 회차 첫 실행은 읽기 셋과 감사자가 5분 만에 모두 한도에 걸렸다. 재설정 시각 뒤 탐침 하나로 풀린 것을 보고 새로 띄운다(셋 미만이면 측정이 아님).
|
|
234
|
+
⑦ 할 일 보고(report_task)는 소속처의 할 일 표가 켜져 있어야 한다 — 꺼져 있으면 항목 장(work)이 기록을 대신한다.
|
|
235
|
+
⑧ **어긋남 찾기는 0 으로 수렴하지 않는다**(5차부터 회차마다 맞음 4~16) — 닫음은 「최종 판에서 셋 갈림 0 ∧ 기준과 다름 0」 한 번으로 하고,
|
|
236
|
+
그 회차 찾기의 맞음은 판을 바꾸지 않고 genetics 후보 장 하나로 옮긴다(원자료 폴더가 git 밖이면 구현자가 못 본다). 이 규칙은 항목 장에 **닫기 전에** 적어 둔다.
|
|
237
|
+
⑨ **반박 에이전트가 한도로 못 돌면 「반박 0 = 맞음」으로 받지 않는다** — 기록자가 주장마다 원문을 다시 읽고, 실측 주장은 같은 표본으로 다시 잰다(다시 잰 값이 렌즈 값과 같았다).
|
|
238
|
+
외부 도구의 종료코드 · 출력 문구로 판정하는 계약은 **도구 판 둘 이상**에서 재기 전엔 쓰지 않는다.
|
|
239
|
+
⑩ **큰 저장은 하위 에이전트 없이 직접 한다** — 한도가 풀린 창은 측정(읽기 셋 · 찾기 · 검증 · 대조)에 남긴다(13장 · 10장을 손으로 올려 예측 판 번호 23/23 일치).
|
|
240
|
+
예측 판 번호는 **저장하는 날**로 짓는다 — 장 머리의 created · updated 가 서버 날짜라 자정을 넘기면 바뀐다(덮어써도 created 가 그날로 바뀐다).
|
|
241
|
+
⑪ **한 문장을 고치면 같은 주장을 하는 장을 전부 찾아 함께 고친다** — 10차 갈림(빈 표를 누가 짓나)을 계약 한 장에서만 고치고 같은 문장을 가진 두 장을 놓쳐,
|
|
242
|
+
닫는 회차의 어긋남 찾기 맞음 하나가 됐다. 고칠 문장의 핵심 낱말로 모든 장을 훑은 뒤 고친다.
|
|
243
|
+
|
|
211
244
|
## 하지 않는 것
|
|
212
245
|
|
|
213
246
|
- 할지 말지, 항목 순서를 정하지 않는다 — 오너의 것.
|