PPT 스킬 비교 실험
HERMES CLI --SKILLS × GEMMA · 2026.10.22

강남A현장 3분기 보고
네이티브 스킬 재실험

같은 10장 요청 · 같은 Gemma 모델 · 같은 설치 도구. 기존 Baseline / GenOffice / Claude PPT 결과에 GenOffice + uni-verification 조건 1회를 추가했습니다.

일반 운영 기본: GenOffice 스킬 + CLI
운영 설정은 DOCX·XLSX·PPTX에 GenOffice를 사용하도록 정리했습니다. HWP/HWPX는 기존 한글 엔진을 유지하며, Claude PPT는 비교 실험에만 제공합니다. 운영 배포 전입니다.
GenOffice + uni-verification을 추가했습니다. 모델 호출은 20회에서 15회로 줄었지만 실행 시간은 428.9초에서 466.7초로 늘었습니다. 두 GenOffice 조건 모두 생성 모델의 이미지 검수는 0개입니다. 조건별 1회이고 OpenRouter 공급자도 달라, 일괄 검증의 일반적인 속도 효과로 해석할 수 없습니다.

GenOffice + uni-verification 추가 실험

장별 작성·검사 왕복을 줄이면 빨라지는지 확인하기 위해 기존 GenOffice에 일괄 작성·검증 조건 1회를 추가했습니다. 같은 10장 요청과 Gemma 모델로 실제 PPTX와 PDF를 만들었고, 원본 스킬 대비 변경 내용과 최종 산출물을 함께 공개합니다.

검사 대상은 유지하고 모델 왕복을 묶었습니다

공식 스킬의 3단계만 C1 방식으로 바꿨습니다. style·outline 작성과 outline 검사는 그대로 두고, 10장 JSON을 함께 작성한 뒤 한 terminal 호출에서 모든 페이지를 검사합니다. 페이지 파일은 각각 유지하며, 오류가 있는 장만 수정·재검사합니다. 최종 PPTX 생성·렌더·전체 이미지 검수·audit도 유지합니다.

여기서 uni-verification은 검증을 조율하는 모델 왕복을 묶는다는 뜻입니다. CLI의 페이지별 검사까지 한 번으로 줄이거나 검사를 생략한다는 뜻은 아닙니다. 이 변경은 일괄 작성과 style·outline 반복 읽기 제거도 포함하므로 검증 병합만의 효과를 분리한 실험은 아닙니다.

기존 GenOffice → uni-verification: 전체 실행 428.9 → 466.7초(+8.8%), 첫 파일 관측 416.8 → 433.1초(+3.9%), 모델 호출 20 → 15회(−25%), 비용 $0.071373 → $0.078557(+10.1%). 출력 토큰은 20,330 → 30,136개입니다. 기존은 DeepInfra, 추가 실행은 CoreWeave로 라우팅됐습니다. 모델 ID는 같지만 공급자·시각·생성 내용은 통제되지 않았습니다.

실제 동작은 6장+4장의 두 응답으로 최초 작성 → 10장 일괄 검사 → style 및 2–10번 페이지 수정 → 10장 전체 재검사였습니다. 마지막 페이지 검사 10건은 모두 audit·outline·offPalette 지적이 없었습니다. 오류 장만 재검사하라는 지침 대신 정상 장도 다시 검사했으며, GUI 렌더 실패 뒤 공통 LibreOffice 경로를 사용하지 않아 모델 이미지 검수는 누락됐습니다.

참고 C1의 c1-r1은 361.0초·17회·29/45, c1-r2는 529.6초·14회·30/45입니다. 두 실행의 평균 최종 파일 시간은 445.3초입니다. Luna를 사용한 외부 실험의 수치를 이번 Gemma의 개선율로 환산하지 않았습니다.

참고 C1 조건과 결과 · 공식 스킬 대비 diff · 실험용 스킬 전문 · 추가 실행 증거 JSON

기존 세 조건과 일괄 검증 조건의 실측값

기존 세 조건은 17시대 실행을 보존했고, uni-verification을 별도 세션에서 추가 실행했습니다. Docker 이미지 digest·Hermes revision·GenOffice 원본 스킬 hash·사용자 원문·공통 환경 지침이 일치합니다. 모든 조건은 독립된 메모리와 작업 공간을 사용합니다.

google/gemma-4-31b-it · reasoning medium · 30분/80턴 · 조건별 2 CPU / 2 GiB · 순차 생성 · LibreOffice 공통 렌더

Baseline

10장 생성 · 내용 보완 필요

작성 도구
PptxGenJS
슬라이드
10
네이티브 표 / 차트
10 / 0
모델 이미지 입력
10개
실행 시간
221초
첫 파일 관측
157초
관측 최고 메모리
504 MiB
모델 호출
20회
총비용
$0.0768
구조 검사
통과

GenOffice

10장 생성 · 시각 검수 미준수

작성 도구
GenOffice
슬라이드
10
네이티브 표 / 차트
0 / 0
모델 이미지 입력
0개
실행 시간
429초
첫 파일 관측
417초
관측 최고 메모리
411 MiB
모델 호출
20회
총비용
$0.0714
구조 검사
통과

GenOffice + uni-verification

10장 생성 · 일괄 검사 수행 · 이미지 검수 미준수

작성 도구
GenOffice
슬라이드
10
네이티브 표 / 차트
0 / 0
모델 이미지 입력
0개
실행 시간
467초
첫 파일 관측
433초
관측 최고 메모리
424 MiB
모델 호출
15회
총비용
$0.0786
구조 검사
통과

Claude PPT

10장 생성 · 스킬·내용 보완 필요

작성 도구
PptxGenJS
슬라이드
10
네이티브 표 / 차트
1 / 0
모델 이미지 입력
10개
실행 시간
552초
첫 파일 관측
448초
관측 최고 메모리
614 MiB
모델 호출
26회
총비용
$0.2832
구조 검사
통과

비용은 OpenRouter 응답의 usage.cost입니다. 누락이 있으면 미확인으로 표시합니다. 첫 파일·메모리는 3초 간격으로 관측한 값입니다. 이미지 입력 수는 실제 모델 요청에 포함된 서로 다른 이미지 수이며, 평가자가 사후 렌더한 이미지는 포함하지 않습니다.

Langfuse 재조회: 기존 GenOffice 20/20 호출(2026-10-22 19:06 KST), 추가 uni-verification 15/15 호출(19:15 KST). 추가 비용 $0.07855734가 로컬 OpenRouter 응답 합계와 일치했습니다. 기존 Baseline 20/20·Claude PPT 26/26은 앞선 17:55 KST 조회 기록입니다.

실제 사용자 원문과 환경 입력

사용자 원문 · 831자
다음 내용으로 경영진 보고용 PowerPoint 10장을 만들어 주세요. 디자인은 깔끔하고 세련되게, 표와 도표를 적극적으로 써 주세요.

주제: 강남A현장 3분기 공정·안전·원가 현황 보고 (2026년 7~9월)
1. 표지: 강남A현장 3분기 현황 보고, 2026.10.21, 공사관리팀
2. 현장 개요: 지하 4층·지상 25층 업무시설, 연면적 48,200㎡, 공사기간 2025.03~2027.08, 공정률 계획 52% / 실적 49%
3. 월별 공정률: 7월 계획 40%·실적 39%, 8월 46%·44%, 9월 52%·49%
4. 주요 공종 진행: 골조 지상 14층 완료(계획 16층), 외장 커튼월 착수(5층까지), 설비 배관 지하층 완료, 전기 간선 공사 60%
5. 지연 원인: 8월 집중호우 6일 작업 중지, 철근 수급 지연 4일, 타워크레인 정기점검 2일
6. 만회 대책: 10월부터 골조 2개 조 운영, 주말 작업 4회, 커튼월 협력사 인원 30% 증원, 11월 말 계획 공정률 회복 목표
7. 안전 현황: 3분기 무재해 92일, 아차사고 보고 14건(추락 5·낙하물 4·전도 3·기타 2), 안전교육 이수율 98%, 위험성평가 개선 조치 21건 완료
8. 원가 현황: 실행예산 1,420억 원, 3분기 누적 집행 690억 원(48.6%), 자재비 상승으로 철근 +3.2억·레미콘 +1.8억 증액 예상
9. 협력사 현황: 협력사 9팀, 3분기 평가 상위(신우건설·대명설비), 개선 필요 1팀(외장 인원 부족)
10. 4분기 계획 및 요청 사항: 골조 25층 완료, 커튼월 15층, 공정률 70% 목표 / 요청: 철근 단가 조정 승인, 동절기 보양비 2.5억 사전 승인
원문 TXT · SHA-256 520e01ad767dc435d70a5cb30fb49ca8f7317aa424bcf5eae675ce33770e2166
네 조건의 공통 실행 지침
This is an authorized presentation workflow comparison. Use the user's original question as the content brief and preserve every fact. Save the final presentation to /data/workspace/gangnam-review.pptx and keep your source files in /data/workspace.

Installed tools: GenOffice CLI 0.10.0, PptxGenJS 4.0.1, Node.js, Python, LibreOffice, Poppler, markitdown, Pillow, lxml, defusedxml, React, react-icons and sharp. Node modules are available through NODE_PATH=/opt/presentation-tools/node_modules. Local PptxGenJS API declarations are /opt/presentation-tools/node_modules/pptxgenjs/types/index.d.ts. Consult installed API definitions or tool help when an API is uncertain; do not repeatedly guess after an error. Korean Noto fonts are available.

There is no restriction against intermediate style sheets, outlines, page specifications or scripts. No palette, typography, layout template, chart count or table count is prescribed beyond the user's question. Follow the original authoring and quality workflow of the skill preloaded by Hermes --skills. Skill resource paths are relative to its actual directory. Do not load or consult other presentation skills. With no preloaded presentation skill, choose freely among the same installed tools.

The GenOffice GUI renderer is unavailable inside this headless environment. For all conditions use this shared visual QA route: libreoffice -env:UserInstallation=file:///tmp/lo-model --headless --convert-to pdf --outdir /data/workspace /data/workspace/gangnam-review.pptx, then pdftoppm -jpeg -r 110 /data/workspace/gangnam-review.pdf /data/workspace/slide. Inspect the rendered slide images with vision_analyze; it passes actual pixels to this same Gemma model. Generating image files is not visual inspection.

Before reporting completion, check that the final PPTX exists, opens, contains exactly the requested ten slides and all requested facts, and that the required skill checks succeeded. Inspect every slide, correct issues you find in the source, and rerender after corrections. If generation fails, use the returned error and installed documentation to repair it. Never report a file as created unless it exists. Report unresolved limitations honestly. All conditions share this environment and user question. Each condition is limited to 30 minutes and 80 model calls.


실행 자원 설정(프롬프트 외): {"memory": "2g", "cpus": 2, "nodeHeapMiB": 512, "parallelism": 1, "workerNetwork": "internal; OpenRouter only through authenticated model proxy"}
환경 입력 TXT
조건별 차이

Baseline은 발표자료 스킬을 적재하지 않습니다. GenOffice는 --skills genoffice, Claude PPT는 --skills pptx로 실행합니다. 도구·문서·라이브러리·모델·원문·제한 시간은 같습니다. 기본 내장 스킬은 비활성화하여 다른 발표자료 스킬이 섞이지 않게 했습니다.

추가 조건도 --skills genoffice를 사용하되 격리된 컨테이너에 실험용 스킬을 읽기 전용으로 마운트했습니다. 운영 스킬은 변경하지 않았습니다. 원문·환경 지침 hash와 실제 모델 입력의 스킬 전문 포함 여부를 추가 실행 JSON에 기록했습니다.

{
  "harnessCommit": "835c3dd038d903182a66ecc45e34bf5e0de65f00",
  "image": "sha256:58e31cc6d0553d3f65fd11406a2143b3b87a578288e331d2d0654058f8ca30a9",
  "resourcePolicy": {
    "memory": "2g",
    "cpus": 2,
    "nodeHeapMiB": 512,
    "parallelism": 1,
    "workerNetwork": "internal; OpenRouter only through authenticated model proxy"
  }
}

참고 보고서와 같아진 부분, 남은 차이

항목이번 실험해석
원문강남A현장 831자 원문 동일이전 실험과 SHA-256 일치
스킬 적재네이티브 CLI --skills이전 수동 본문 주입 방식에서 변경
공식 작성 흐름중간표현 허용, 원본 스킬 전문 전달전달 여부와 실제 준수 여부는 별도 확인
모델·후보Gemma · 기존 세 조건 + 일괄 검증 1회참고 보고서의 GPT-6 Luna·다수 후보와 다름
렌더·격리LibreOffice · Docker 내부망GenOffice GUI·gVisor 환경과 다름
평가실제 파일·명령·수치·이미지 확인참고 보고서의 블라인드 채점은 미실시

앞선 12항목 대조 기록 · 사용자가 제공한 참고 보고서

10장을 같은 순서로 나란히 비교

이미지를 누르면 확대됩니다. 생성 이후 산출물 자체를 사람이 수정하지 않았습니다.

BaselineGenOfficeGenOffice + uni-verificationClaude PPT

01 / 표지

Baseline
Baseline 1번 슬라이드
GenOffice
GenOffice 1번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 1번 슬라이드
Claude PPT
Claude PPT 1번 슬라이드

02 / 현장 개요

Baseline
Baseline 2번 슬라이드
GenOffice
GenOffice 2번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 2번 슬라이드
Claude PPT
Claude PPT 2번 슬라이드

03 / 월별 공정률

Baseline
Baseline 3번 슬라이드
GenOffice
GenOffice 3번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 3번 슬라이드
Claude PPT
Claude PPT 3번 슬라이드

04 / 주요 공종

Baseline
Baseline 4번 슬라이드
GenOffice
GenOffice 4번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 4번 슬라이드
Claude PPT
Claude PPT 4번 슬라이드

05 / 지연 원인

Baseline
Baseline 5번 슬라이드
GenOffice
GenOffice 5번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 5번 슬라이드
Claude PPT
Claude PPT 5번 슬라이드

06 / 만회 대책

Baseline
Baseline 6번 슬라이드
GenOffice
GenOffice 6번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 6번 슬라이드
Claude PPT
Claude PPT 6번 슬라이드

07 / 안전

Baseline
Baseline 7번 슬라이드
GenOffice
GenOffice 7번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 7번 슬라이드
Claude PPT
Claude PPT 7번 슬라이드

08 / 원가

Baseline
Baseline 8번 슬라이드
GenOffice
GenOffice 8번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 8번 슬라이드
Claude PPT
Claude PPT 8번 슬라이드

09 / 협력사

Baseline
Baseline 9번 슬라이드
GenOffice
GenOffice 9번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 9번 슬라이드
Claude PPT
Claude PPT 9번 슬라이드

10 / 4분기 계획·요청

Baseline
Baseline 10번 슬라이드
GenOffice
GenOffice 10번 슬라이드
GenOffice + uni-verification
GenOffice + uni-verification 10번 슬라이드
Claude PPT
Claude PPT 10번 슬라이드

원본 스킬을 얼마나 수행했는가

Baseline

  • PptxGenJS로 10장을 생성했고 네이티브 표 10개를 사용했습니다. 네이티브 차트는 없습니다. 대부분의 본문이 같은 표 형식이며 여백이 큽니다.
  • 초기 도형 API 오류를 스스로 수정했습니다. 공통 LibreOffice 렌더 이후 10장의 실제 이미지가 모두 모델에 전달됐습니다. 사후 구조 검사도 통과했습니다.
  • 3번 공정 차이를 %로 표기했는데 %p가 맞습니다. 6번에서 원문의 11월 말 계획 공정률 회복 목표를 “계획 공정률 100% 달성”으로 바꾸었습니다.
  • 4번 “전기 공정률 정상 추진”, 5번 공급사 물류 차질·법정 점검, 9번 품질·공정 준수 우수 등 원문에 없는 설명을 추가했습니다. 이미지 검수만으로 내용 오류가 해결되지는 않았습니다.
실제 스킬·입력·실행 증거
{
  "nativeSessionId": "20261022_174150_6905ec",
  "inputVerification": {
    "exactBrief": true,
    "commonEnvironment": true,
    "fullSelectedSkill": null,
    "reasoningEffort": "medium",
    "model": "google/gemma-4-31b-it",
    "nativeCliCommand": [
      "python",
      "-m",
      "hermes_cli.main",
      "chat",
      "--query-file",
      "/data/question.txt",
      "--format",
      "stream-json",
      "--toolsets",
      "terminal,file,vision",
      "--max-turns",
      "80",
      "--run-budget",
      "1800",
      "--reasoning",
      "medium",
      "--yolo"
    ]
  },
  "skillHashes": {},
  "workflow": {
    "genofficeCreate": 0,
    "stagedCheck": 0,
    "genofficeAudit": 0,
    "claudeValidate": 0,
    "markitdown": 0,
    "modelViewedImages": 10,
    "successfulVisionCalls": 10,
    "successfulStagedCheckResults": 0,
    "successfulGenofficeAuditResults": 0
  },
  "trace": {
    "traceId": "94a3fc382ec6817edad227eaacde6364",
    "runId": "gangnam-native-v2-1792658073884-baseline",
    "environment": "hermes-migration-validation",
    "checkedAt": "2026-10-22T08:55:08.751Z",
    "httpStatus": 200,
    "timestamp": "2026-10-22T08:41:49.389Z",
    "observations": 20,
    "totalCost": 0.076757735
  },
  "traceId": "94a3fc382ec6817edad227eaacde6364",
  "externalVerification": {
    "pptx": true,
    "validator": 0,
    "genofficeAudit": 0,
    "renderer": 0,
    "at": "2026-10-22T08:45:39.269Z"
  }
}

GenOffice

  • 공식 GenOffice 스킬이 Hermes CLI --skills로 전문 적재됐습니다. style·outline·페이지별 spec을 작성하고 단계 검사 오류를 수정한 뒤 생성했습니다.
  • 파일 구조 검사와 GenOffice audit는 통과했습니다. 네이티브 표 0개·차트 0개이며, 3번 슬라이드에는 도형으로 그린 막대그래프가 있습니다. 수치 라벨과 축 눈금이 없어 월별 계획·실적 값을 정확히 읽기 어렵습니다.
  • GenOffice GUI 렌더 호출이 실패한 뒤 공통 LibreOffice 경로로 전환하지 않고 종료했습니다. 모델 이미지 입력은 0개입니다. 이 페이지 이미지는 평가자가 사후 렌더한 것입니다.
  • 2·4·5·9·10번의 일부 본문이 줄바꿈 없이 붙어 읽기 어렵습니다. 8번 집행률은 카드 아래쪽으로 넘어갑니다.
  • 9번의 신우건설(골조)·대명설비(기계)는 원문에 없는 업체별 공종을 추가했습니다. 주요 수치는 대부분 유지했지만 시각 검수를 마쳤다고 볼 수 없습니다.
실제 스킬·입력·실행 증거
{
  "nativeSessionId": "20261022_173436_62ecfa",
  "inputVerification": {
    "exactBrief": true,
    "commonEnvironment": true,
    "fullSelectedSkill": true,
    "reasoningEffort": "medium",
    "model": "google/gemma-4-31b-it",
    "nativeCliCommand": [
      "python",
      "-m",
      "hermes_cli.main",
      "chat",
      "--query-file",
      "/data/question.txt",
      "--format",
      "stream-json",
      "--toolsets",
      "terminal,file,vision",
      "--max-turns",
      "80",
      "--run-budget",
      "1800",
      "--reasoning",
      "medium",
      "--yolo",
      "--skills",
      "genoffice"
    ]
  },
  "skillHashes": {
    "genoffice": "fb61206b7b60fa901f0cdfb9286d066b0a77bab927b3ac4686598f17ee864e55"
  },
  "workflow": {
    "genofficeCreate": 1,
    "stagedCheck": 17,
    "genofficeAudit": 1,
    "claudeValidate": 0,
    "markitdown": 0,
    "modelViewedImages": 0,
    "successfulVisionCalls": 0,
    "successfulStagedCheckResults": 16,
    "successfulGenofficeAuditResults": 1
  },
  "trace": {
    "traceId": "5d5720bd417de7476aac7468213a7a54",
    "runId": "gangnam-native-v2-1792658073884-genoffice",
    "environment": "hermes-migration-validation",
    "checkedAt": "2026-10-22T08:55:06.890Z",
    "httpStatus": 200,
    "timestamp": "2026-10-22T08:34:34.999Z",
    "observations": 20,
    "totalCost": 0.071373465
  },
  "traceId": "5d5720bd417de7476aac7468213a7a54",
  "externalVerification": {
    "pptx": true,
    "validator": 0,
    "genofficeAudit": 0,
    "renderer": 0,
    "at": "2026-10-22T08:41:51.561Z"
  }
}

GenOffice + uni-verification

  • GenOffice 원본 스킬의 3단계만 C1 방식으로 변경했고 Hermes CLI --skills로 전문 적재했습니다. 최초 10장 작성은 6장+4장 두 응답으로 나뉘었으며, 모두 작성된 뒤 하나의 terminal 호출로 10장을 검사했습니다.
  • 첫 검사에서 겹침과 팔레트 지적이 나와 style과 2–10번 페이지를 수정했습니다. 이후 오류 장만 검사하지 않고 10장 모두 재검사했습니다. 페이지 검사 결과는 총 20건이며, 마지막 10건의 지적은 모두 비었습니다. outline 검사 1건과 최종 audit도 수행했습니다.
  • PPTX 10장과 사후 PDF 렌더, 파일 구조 검사와 GenOffice audit는 통과했습니다. 그러나 GenOffice GUI 렌더 실패 후 공통 LibreOffice 경로를 쓰지 않고 종료하여, 생성 모델에 전달된 이미지는 0개입니다. 아래 이미지는 평가자가 사후 렌더한 것입니다.
  • 사후 확인에서 주요 수치와 협력사명은 유지됐고 본문 줄바꿈과 원가 카드 배치는 읽을 수 있었습니다. 다만 3번 공정률도 글 목록이며, 네이티브 표·차트는 모두 0개입니다. 카드와 텍스트 중심으로 사용자의 표·도표 요구를 충분히 충족하지 못했습니다.
  • 5번에 원문 일수의 중복 여부를 확인하지 않은 “총 지연 일수 12일”을 추가했습니다. 6번은 원문 “주말 작업 4회”를 “월 4회”로 확장하고, “자재 적기 반입 관리 강화”도 추가했습니다. 구조 검사 통과가 내용 충실성을 보장하지 않습니다.
실제 스킬·입력·실행 증거
{
  "nativeSessionId": "20261022_190728_81cc2f",
  "inputVerification": {
    "exactBrief": true,
    "commonEnvironment": true,
    "fullSelectedSkill": true,
    "reasoningEffort": "medium",
    "model": "google/gemma-4-31b-it",
    "nativeCliCommand": [
      "python",
      "-m",
      "hermes_cli.main",
      "chat",
      "--query-file",
      "/data/question.txt",
      "--format",
      "stream-json",
      "--toolsets",
      "terminal,file,vision",
      "--max-turns",
      "80",
      "--run-budget",
      "1800",
      "--reasoning",
      "medium",
      "--yolo",
      "--skills",
      "genoffice"
    ]
  },
  "skillHashes": {
    "genoffice-uni": "3710e1fcae8ce2ba3b5e19c321957baa436cba36cbcab74c1df7b84dd205a58d"
  },
  "workflow": {
    "genofficeCreate": 1,
    "stagedCheck": 3,
    "genofficeAudit": 2,
    "claudeValidate": 0,
    "markitdown": 0,
    "modelViewedImages": 0,
    "successfulVisionCalls": 0,
    "successfulStagedCheckResults": 21,
    "successfulGenofficeAuditResults": 1
  },
  "batchVerification": {
    "initialAuthoringBatches": [
      [
        1,
        2,
        3,
        4,
        5,
        6
      ],
      [
        7,
        8,
        9,
        10
      ]
    ],
    "pageCountBeforeFirstPageCheck": 10,
    "pageCheckTerminalRounds": 2,
    "perPageCheckResults": 20,
    "checks": [
      {
        "message": 6,
        "command": "genoffice slides check /data/workspace/gangnam-review/outline.json --json",
        "pageFilesExisted": 0,
        "reports": [
          {
            "kind": "outline",
            "page": null,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          }
        ]
      },
      {
        "message": 23,
        "command": "for f in /data/workspace/gangnam-review/pages/*.json; do genoffice slides check \"$f\" --json; done",
        "pageFilesExisted": 10,
        "reports": [
          {
            "kind": "page",
            "page": 0,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 1,
            "status": "ok",
            "auditFindings": 2,
            "outlineFindings": 0,
            "offPalette": 2
          },
          {
            "kind": "page",
            "page": 2,
            "status": "ok",
            "auditFindings": 1,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 3,
            "status": "ok",
            "auditFindings": 3,
            "outlineFindings": 0,
            "offPalette": 2
          },
          {
            "kind": "page",
            "page": 4,
            "status": "ok",
            "auditFindings": 3,
            "outlineFindings": 0,
            "offPalette": 2
          },
          {
            "kind": "page",
            "page": 5,
            "status": "ok",
            "auditFindings": 3,
            "outlineFindings": 0,
            "offPalette": 1
          },
          {
            "kind": "page",
            "page": 6,
            "status": "ok",
            "auditFindings": 4,
            "outlineFindings": 0,
            "offPalette": 1
          },
          {
            "kind": "page",
            "page": 7,
            "status": "ok",
            "auditFindings": 3,
            "outlineFindings": 0,
            "offPalette": 2
          },
          {
            "kind": "page",
            "page": 8,
            "status": "ok",
            "auditFindings": 2,
            "outlineFindings": 0,
            "offPalette": 3
          },
          {
            "kind": "page",
            "page": 9,
            "status": "ok",
            "auditFindings": 2,
            "outlineFindings": 0,
            "offPalette": 0
          }
        ]
      },
      {
        "message": 39,
        "command": "for f in /data/workspace/gangnam-review/pages/*.json; do genoffice slides check \"$f\" --json; done",
        "pageFilesExisted": 10,
        "reports": [
          {
            "kind": "page",
            "page": 0,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 1,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 2,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 3,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 4,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 5,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 6,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 7,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 8,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          },
          {
            "kind": "page",
            "page": 9,
            "status": "ok",
            "auditFindings": 0,
            "outlineFindings": 0,
            "offPalette": 0
          }
        ]
      }
    ],
    "latestPageChecks": [
      {
        "kind": "page",
        "page": 0,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      },
      {
        "kind": "page",
        "page": 1,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      },
      {
        "kind": "page",
        "page": 2,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      },
      {
        "kind": "page",
        "page": 3,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      },
      {
        "kind": "page",
        "page": 4,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      },
      {
        "kind": "page",
        "page": 5,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      },
      {
        "kind": "page",
        "page": 6,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      },
      {
        "kind": "page",
        "page": 7,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      },
      {
        "kind": "page",
        "page": 8,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      },
      {
        "kind": "page",
        "page": 9,
        "status": "ok",
        "auditFindings": 0,
        "outlineFindings": 0,
        "offPalette": 0
      }
    ],
    "allTenLatestChecksClear": true,
    "successfulToolResults": 33,
    "visionCalls": [],
    "sourceMutationAfterFirstVision": null,
    "responseLatencySeconds": [
      15.476,
      26.882,
      100.088,
      62.946,
      2.916,
      11.605,
      52.647,
      48.147,
      85.791,
      4.139,
      3.465,
      2.454,
      7.267,
      5.241,
      17.451
    ],
    "inputTokens": 683111,
    "outputTokens": 30136,
    "tokenUsageCoverage": {
      "recorded": 15,
      "responses": 15
    },
    "providers": [
      "CoreWeave"
    ]
  },
  "trace": {
    "traceId": "c07ba0e3c546f4012ced4255ea4fa8b3",
    "runId": "gangnam-uni-v1-1792663646356-genoffice-uni",
    "environment": "hermes-migration-validation",
    "checkedAt": "2026-10-22T10:15:28.996Z",
    "httpStatus": 200,
    "timestamp": "2026-10-22T10:07:26.787Z",
    "observations": 15,
    "totalCost": 0.07855734
  },
  "traceId": "c07ba0e3c546f4012ced4255ea4fa8b3",
  "externalVerification": {
    "pptx": true,
    "validator": 0,
    "genofficeAudit": 0,
    "renderer": 0,
    "at": "2026-10-22T10:15:20.236Z"
  }
}

Claude PPT

  • Claude PPT 원본 스킬이 Hermes CLI --skills로 전문 적재됐습니다. 차트·텍스트 API 오류 이후 코드를 수정해 실제 PPTX 10장을 만들었습니다.
  • PptxGenJS 네이티브 표 1개를 사용했습니다. 차트 API 오류 뒤 3·7·8번 그래프를 도형으로 대체해, 원본 스킬의 네이티브 차트 사용 지침을 따르지 않았습니다.
  • markitdown 본문 확인과 validate.py 구조 검사를 수행했고, 최초 렌더된 10장 이미지가 실제 모델 요청에 들어갔습니다. 이후 소스 두 곳을 수정·재생성했지만 최종본 재렌더·이미지 재검수는 하지 않았습니다. 이 페이지는 평가자가 최종 PPTX를 사후 렌더한 것입니다.
  • 7번은 그래프 제목과 값 라벨이 겹치고, 9번은 하단 설명이 표 안으로 들어갑니다. 3번 실적 수치의 대비도 낮습니다.
  • 9번 협력사 평가 S/A/C 등급과 공기·품질·안전 세부 평가는 원문에 없는 내용입니다. 5번 원인에 강풍도 추가했습니다. 파일이 생성되고 이미지 검수를 수행해도 사실성·레이아웃 검증은 별도로 필요합니다.
실제 스킬·입력·실행 증거
{
  "nativeSessionId": "20261022_174536_70ac61",
  "inputVerification": {
    "exactBrief": true,
    "commonEnvironment": true,
    "fullSelectedSkill": true,
    "reasoningEffort": "medium",
    "model": "google/gemma-4-31b-it",
    "nativeCliCommand": [
      "python",
      "-m",
      "hermes_cli.main",
      "chat",
      "--query-file",
      "/data/question.txt",
      "--format",
      "stream-json",
      "--toolsets",
      "terminal,file,vision",
      "--max-turns",
      "80",
      "--run-budget",
      "1800",
      "--reasoning",
      "medium",
      "--yolo",
      "--skills",
      "pptx"
    ]
  },
  "skillHashes": {
    "claude": "a7ff03e2c85b636f55232a6b1555f5dd90216b7a1a359ab289d8364e6acbc6a0"
  },
  "workflow": {
    "genofficeCreate": 0,
    "stagedCheck": 0,
    "genofficeAudit": 0,
    "claudeValidate": 2,
    "markitdown": 1,
    "modelViewedImages": 10,
    "successfulVisionCalls": 10,
    "successfulStagedCheckResults": 0,
    "successfulGenofficeAuditResults": 0
  },
  "trace": {
    "traceId": "7dfafabf7195725afe1e53ae8d3333ec",
    "runId": "gangnam-native-v2-1792658073884-claude",
    "environment": "hermes-migration-validation",
    "checkedAt": "2026-10-22T08:55:11.060Z",
    "httpStatus": 200,
    "timestamp": "2026-10-22T08:45:34.962Z",
    "observations": 26,
    "totalCost": 0.28316044
  },
  "traceId": "7dfafabf7195725afe1e53ae8d3333ec",
  "externalVerification": {
    "pptx": true,
    "validator": 0,
    "genofficeAudit": 0,
    "renderer": 0,
    "at": "2026-10-22T08:54:57.843Z"
  }
}

해석 범위

  • 조건별 1회 결과이며 일반적인 모델·스킬 우열을 의미하지 않습니다.
  • Baseline에도 같은 라이브러리를 설치했습니다. Hermes 기본 배포판과는 다릅니다.
  • Hermes CLI --skills로 스킬 전문을 적재했습니다. 모델의 자율적인 스킬 선택 능력을 측정한 실험은 아닙니다.
  • GenOffice GUI 대신 공통 LibreOffice 렌더러를 사용했습니다.
  • Claude는 스킬 이름이며 세 조건의 생성 모델은 모두 Gemma입니다.
  • 참고 보고서의 GPT-6 Luna·19개 후보·블라인드 채점 실험과는 모델·범위·평가 방식이 다릅니다.
  • 생성물이 있더라도 단계 검사 통과나 내용·레이아웃 품질을 자동으로 보장하지 않습니다.
  • uni-verification은 기존 실행 이후에 추가한 단일 파일럿입니다. 같은 모델 ID라도 OpenRouter 공급자가 기존 DeepInfra에서 CoreWeave로 달라졌고 실행 시각·캐시·모델 출력도 통제하지 않았습니다. 관측된 8.8% 시간 증가를 스킬 변경의 인과 효과로 단정하지 않습니다.
  • 변경에는 일괄 작성, style·outline 반복 읽기 제거, 검증 왕복 병합이 함께 포함됩니다. 검증 병합만의 효과를 분리하지 않았습니다. 최초 작성도 두 응답에 걸쳤고 전체 재검사를 수행해 지침을 부분적으로만 준수했습니다.
  • 두 GenOffice 실행 모두 생성 모델의 이미지 검수가 누락됐습니다. 완전한 시각 검수·수정 절차를 마치는 데 필요한 시간과 비용은 미측정입니다. 블라인드 품질 점수나 품질 저하의 크기도 측정하지 않았습니다.

측정·입력 검증·감사 JSON · 일반 운영 기본값 검증 · 라이브러리 사전 실행 검사

확대한 슬라이드