genetics-mcp 2.17.1 → 2.18.1
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/manifest.json +2 -2
- package/bin/x86_64-apple-darwin/gcell +0 -0
- package/genetics.mjs +71 -16
- package/package.json +1 -1
- package/skills/genetics-report/SKILL.md +146 -131
- package/skills/genetics-report/assets/example/cases-briefing-designs.json +32 -0
- package/skills/genetics-report/assets/example/plate-pair-after.png +0 -0
- package/skills/genetics-report/assets/example/plate-pair-before.png +0 -0
- package/skills/genetics-report/assets/example/plate-pair.html +25 -0
- package/skills/genetics-report/assets/example/report-briefing-designs.json +736 -0
- package/skills/genetics-report/assets/example/report-briefing.json +27 -22
- package/skills/genetics-report/assets/example/report.json +5 -5
- package/skills/genetics-report/assets/figure.mjs +390 -63
- package/skills/genetics-report/assets/mockshot.mjs +3 -2
- package/skills/genetics-report/assets/pair.mjs +138 -0
- package/skills/genetics-report/assets/shot.mjs +87 -19
- package/skills/genetics-report/references/content-pipeline.md +34 -33
- package/skills/genetics-report/references/history.md +117 -0
- package/skills/genetics-report/references/illustrations.md +16 -12
- package/skills/genetics-report/references/lim-portal-format.md +175 -91
- package/skills/genetics-report/references/linear-read-test.workflow.js +47 -0
- package/skills/genetics-report/references/process.md +152 -90
- package/skills/genetics-report/references/readability.md +48 -24
- package/skills/genetics-report/references/reader-review.workflow.js +160 -27
- package/skills/genetics-report/references/visual-first.md +100 -35
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// 선형 읽기 시험 — 원고를 「앞에서 뒤로 딱 한 번」 읽히고, 독자가 다른 자리로 뛰어야 이해되는 지점을 전부 센다.
|
|
2
|
+
// 실행: Workflow 도구에 이 파일을 scriptPath 로 주고 args 를 넘긴다.
|
|
3
|
+
// args = { file: "<report.json 절대경로>", reader: "<독자 한 줄>", round: "<회차 표지, 예: 2차 측정 · 4판>" }
|
|
4
|
+
// round 는 재측정 때 반드시 바꾼다 — 같은 프롬프트면 캐시가 옛 답을 돌려준다(genetics-define 스킬 4단계와 같은 함정).
|
|
5
|
+
// 돌아오는 것: merged.jumps[](at·needed·severity·fix) 전부 + order_ok/order_note + overall(「뜀 N(3등급 이상 M) · 사소 K」 + 할 일).
|
|
6
|
+
// 목표: 뜀 0. 3등급(되짚어야 함) 이상이 하나라도 있으면 발행 전에 그 자리에서 푼다.
|
|
7
|
+
//
|
|
8
|
+
// 2026-09-14 실사례(고객사 3차 보고) — 사용자 반려 「읽다가 시험보는 줄 알 것 같음. 보고서가 흐름이 이어지지 않고, 장을 넘나들면서
|
|
9
|
+
// 이해를 해야 되는 구조임.」 2판 본문 교차 참조 62곳 → 절 순서를 고치고 교차 참조를 0 으로 만든 3판에도 이 시험이 뜀 45곳을 냈다
|
|
10
|
+
// (5등급 1 · 4등급 1 · 3등급 16). 순서는 넷 다 「이야기처럼 이어짐」 — 원인은 「뒤에서 정의되는 낱말」과 「앞에서 쓰는 뒤 절 번호」였다.
|
|
11
|
+
// reader-review.workflow.js 의 linear 관점이 같은 읽기를 하나로 하고, 이 파일은 독자 셋 + 결정권자로 **실측**할 때 쓴다.
|
|
12
|
+
// 뜀이 아닌 것: 뒤 절이 앞 절을 되짚는 링크(도판 출처 줄의 「건 §n.n」), 활용법(guide)·요약면 수치 칸의 「N절로」(지도 구실),
|
|
13
|
+
// 요지 문단 끝의 refs(「근거」 단추). 같은 절 안에서 바로 아래 표로 이어 읽는 것도 뜀이 아니다 — 단 표 칸만으로 뜻이 안 서면 뜀이다.
|
|
14
|
+
export const meta = {
|
|
15
|
+
name: 'report-linear-read-test',
|
|
16
|
+
description: '보고서 원고를 처음 읽는 사람 셋이 앞에서 뒤로 한 번만 읽으며 「여기서 다른 자리로 뛰어야 이해된다」는 지점을 전부 적고, 결정권자 하나가 요청 절에서 답을 고를 수 있는지 재고, 합쳐서 남은 뜀 지점을 낸다',
|
|
17
|
+
phases: [{ title: 'Read', detail: '선형 읽기 3 + 결정권자 1' }, { title: 'Merge', detail: '뜀 지점 합치기' }],
|
|
18
|
+
}
|
|
19
|
+
const FILE = args.file
|
|
20
|
+
const READER = args.reader || '고객사 담당(비개발자). 이 보고서를 처음 읽는다'
|
|
21
|
+
const ROUND = args.round || '1차 측정'
|
|
22
|
+
const CTX = `[${ROUND}] [읽기 전용. 파일을 수정하지 말 것. 한글로 답할 것.]
|
|
23
|
+
원고: ${FILE} — Lim 포털 관보 서식 보고서의 발행 JSON. 렌더 순서는 고정: 표지(title·subtitle) → 발행 이력(history) → 차례 → 활용법(guide) → 요약면(notice·bar·bar_note·stats·grades 등급 범례) → PART 간지(parts[]) → 절(sections[] 순서대로; kind 별로 summary: summary[] 문단(문단 끝 refs 는 「근거」 링크 단추) → tables → flow / note: paragraphs → tables → flow → plates 도판 캡션·출처 줄 / cases: 그 group 의 cases[] 순서대로, 렌더 표기 「NN-1」… / asks: cta → open_items → tables) → 부록(appendix) → 판권지(colophon).
|
|
24
|
+
독자: ${READER}
|
|
25
|
+
판정 기준: 앞에서 뒤로 한 번 읽어 내려가면 이해돼야 하고, 어떤 문장도 독자를 다른 절·표·부록·원고 밖 문서로 보내면 안 된다. 뒤 절이 앞 절을 되짚는 링크(도판 출처 줄의 「건 §n.n」)는 뜀이 아니다. 활용법·요약면 수치 칸의 「N절로」는 지도 구실이라 뜀이 아니다.`
|
|
26
|
+
const JUMPS = { type: 'object', properties: { jumps: { type: 'array', items: { type: 'object', properties: {
|
|
27
|
+
at: { type: 'string', description: '읽던 자리(절·문단·항목·표 이름)' },
|
|
28
|
+
needed: { type: 'string', description: '이해하려면 필요했던 것과 그것이 있는 자리(없으면 「원고 어디에도 없음」)' },
|
|
29
|
+
severity: { type: 'integer', minimum: 1, maximum: 5, description: '5=이해 불가, 3=되짚어야 함, 1=사소' },
|
|
30
|
+
fix: { type: 'string', description: '그 자리에 무엇을 넣거나 빼면 뛰지 않아도 되는가 — 구체 문장으로' } },
|
|
31
|
+
required: ['at', 'needed', 'severity', 'fix'] } },
|
|
32
|
+
order_ok: { type: 'boolean', description: '절 순서가 앞에서 뒤로 이야기처럼 이어지는가' },
|
|
33
|
+
order_note: { type: 'string', description: '순서가 끊기는 곳과 바꿀 순서(있으면)' },
|
|
34
|
+
overall: { type: 'string' } }, required: ['jumps', 'order_ok', 'order_note', 'overall'] }
|
|
35
|
+
phase('Read')
|
|
36
|
+
const LENSES = [
|
|
37
|
+
['first-time-a', '처음 읽는 사람 A — 문서를 위 렌더 순서대로 딱 한 번 읽는다. 앞에서 뒤로 읽다가 「이 낱말/번호/표가 뭐지, 앞에서 봤나, 뒤에 있나」 하고 멈추는 지점을 전부 적는다. 뒤에 있는 것을 앞에서 전제하거나, 앞에 있던 것을 뒤에서 다시 찾아 올라가야 하거나, 정의가 부록·원고 밖(앞 회차 보고)에만 있으면 전부 뜀이다.'],
|
|
38
|
+
['first-time-b', '처음 읽는 사람 B — 같은 규칙으로 읽되 표·흐름도·도판 캡션에 집중한다. 표 한 칸·흐름도 칸·캡션·여백 주석(marg)의 낱말이 본문 어디서 정의됐는지, 그 정의가 이 자리보다 앞에 있는지 뒤에 있는지를 판정한다. 뒤에 있으면 뜀이다.'],
|
|
39
|
+
['first-time-c', '처음 읽는 사람 C — 절과 절 사이의 이음새만 본다. 각 절의 lede·첫 문단이 바로 앞 절의 무엇을 이어받는지 한 줄로 적고, 이어받지 않고 새로 시작하는 절(맥락 단절)을 뜀으로 적는다. PART 간지의 물음이 그 PART 의 절에서 답해지는지도 본다.'],
|
|
40
|
+
['decider', '결정권자 — 요청 절(kind asks)의 항목만 읽는다(앞 절은 읽었다고 가정). 항목마다 「그 항목 안의 글만으로 두 길 중 하나를 고를 수 있는가」를 판정하고, 고르려면 다른 자리를 봐야 하는 항목을 뜀으로 적는다. 항목 바로 아래의 표는 같은 절 안에서 이어 읽는 것이라 뜀이 아니다 — 단 표 칸만으로 뜻이 안 서는 항이면 뜀이다. 항목과 표가 서로를 전제하면 뜀이다.'],
|
|
41
|
+
]
|
|
42
|
+
const reads = (await parallel(LENSES.map(([k, inst]) => () => agent(`${CTX}\n[관점: ${k}] ${inst}\n원고 전체를 읽고 jumps 를 남김없이(0개면 0개) 적고 order_ok 를 정직하게 판정하라.`, { label: `read:${k}`, phase: 'Read', schema: JUMPS })))).filter(Boolean)
|
|
43
|
+
log(`선형 읽기 ${reads.length}/${LENSES.length} · 뜀 ${reads.reduce((n, r) => n + r.jumps.length, 0)}`)
|
|
44
|
+
if (reads.length < 3) { log('읽기 세션이 셋 미만 — 측정이 아니다. 한도가 풀린 뒤 round 를 바꿔 새로 띄운다'); return { merged: null, raw: reads, failed: true } }
|
|
45
|
+
phase('Merge')
|
|
46
|
+
const merged = await agent(`${CTX}\n[합치기] 아래 관점들의 뜀 지점을 같은 자리끼리 합치고 severity 합산으로 정렬해 전부 남겨라(상한 없음). 관점 하나만 짚었고 severity 1 인 것은 「사소」로 따로 세어 overall 에 수만 적고 jumps 에서는 빼라. 각 항목의 fix 는 가장 구체적인 것을 고르되 「다른 절을 보라」는 처방은 금지 — 그 자리에 넣을 문장 또는 뺄 문장으로만. order_ok 가 하나라도 false 면 order_note 를 합쳐 바꿀 순서를 하나로 제안하라. overall 첫 줄에 「뜀 N(3등급 이상 M) · 사소 K」를 적고, 이어서 「작성자가 지금 바로 할 일」을 순서대로 5줄 안.\n${JSON.stringify(reads)}`, { label: 'merge', phase: 'Merge', schema: JUMPS })
|
|
47
|
+
return { merged, raw: reads }
|