Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"name": "ennoia",
"source": "./plugins/ennoia",
"description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행과 운영 진단을 수행합니다.",
"version": "1.1.0"
"version": "1.1.1"
}
]
}
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ claude plugin install ennoia@ennoia

결과는 그룹·프로젝트 이름으로 안내합니다. 현재 설정과 이번 요청 대상이 다르면 둘을 구분하고, 코드·ID는 기술 상세 요청이나 대상 구분·조회 재개에 필요할 때 표시합니다. 진행 중·부분 실패·미확인 비용을 완료나 0으로 바꾸지 않으며, 실제 App 답변은 관리 요약으로 대체하지 않습니다. 이 규칙은 7개 Skill이 [공통 참고자료](plugins/ennoia/references/response-guide.md)를 함께 사용합니다.

에이전트를 생성·수정하고 저장하면 **에이전트 열기** 링크를 함께 제공합니다. 실제 저장된 그룹·프로젝트와 에이전트 ID로 Studio 편집 화면에 연결합니다. 저장된 초안은 바로 열어볼 수 있으며, 테스트·배포 상태는 별도로 안내합니다.

이미 같은 endpoint를 수동 MCP로 사용 중이라면 각 항목의 source·scope와 실제 요청 연결을 확인합니다. host마다 수동 서버·Plugin·connector가 항상 하나로 합쳐진다고 가정하지 않습니다. 기존 수동 연결의 정리는 사용자가 이전을 요청한 경우에만 선택적으로 진행하며 credential을 다른 source로 복사하지 않습니다.

파일 첨부가 곧 Ennoia 업로드 완료를 의미하지 않습니다. 문서는 업로드·인덱싱 준비·에이전트 연결을 각각 확인합니다. host에 binary 전송 기능이 없는 경우 Skill이 Ennoia 업로드 화면 경로를 안내합니다.
Expand Down
26 changes: 26 additions & 0 deletions evals/2026-09-16-agent-links-summary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# 저장된 에이전트 링크 평가 — 2026-09-16

후보 1.1.1과 기존 1.1.0(`afb2fc8f9cde12f3b8de80a61eb7c9a9e0fae304`)을 같은 합성 입력으로 비교했습니다. 서로 다른 평가 에이전트가 각 패키지의 Skill·reference와 입력만 읽고 응답·다음 행동을 작성했습니다. 기대 판정은 제공하지 않았고, 작성 후 [평가 기준](agent-link-rubric.md)으로 검토했습니다.

| Case | 기존 | 후보 | 관측 결과 |
| --- | --- | --- | --- |
| saved-current | 미충족 | 충족 | 별도 요청 없이 저장된 에이전트 링크 제공 |
| saved-specified | 미충족 | 충족 | 기본 설정 대신 실제 저장 대상 사용 |
| legacy-update | 미충족 | 충족 | 같은 저장에 적용된 기존 대상 정보 재사용 |
| validation-only | 충족 | 충족 | 미저장 상태에서 링크·저장 완료 표현 없음 |
| save-failed | 충족 | 충족 | 권한 실패 유지, 링크·다른 대상 재시도 없음 |
| saved-test-failed | 미충족 | 충족 | 저장된 초안 링크와 테스트 실패를 함께 안내 |
| missing-target | 충족 | 충족 | 기본 설정으로 추측하지 않고 실제 대상 읽기 확인 제안 |
| encoded-query | 미충족 | 충족 | 특수문자 인코딩 후 원본 값과 query 네 항목 일치 |

새 링크 요구 기준으로 기존은 3/8, 후보는 8/8을 충족했습니다. 기존도 통과한 경계 3건은 개선으로 계산하지 않습니다. 후보의 정상 링크 5건은 URL을 파싱해 host·path·query 값을 확인했고, 추가 도구 행동을 제안하지 않았습니다. 실패·미확인 상태와 후속 행동은 응답을 직접 검토했습니다.

이번 평가는 arm별 한 번의 모델 응답 작성이며 case별 별도 세션 반복 실험은 아닙니다. 실제 MCP 저장, 네 host의 설치·화면 접근, 링크의 서버 응답이나 성능 개선은 검증하지 않았습니다. 합성 결과를 native host 결과 파일의 pass로 옮기지 않습니다.

## 입력·후보 파일 식별

| 파일 | SHA-256 |
| --- | --- |
| `evals/agent-link-scenarios.json` | `8284b5748d77276f318342a6e293e39c98aba61157328f6a24a0c23117b3ea00` |
| `plugins/ennoia/skills/ennoia-build-agent/SKILL.md` | `98f00bf91b28fec1c4fbe27a31c1278294c94fc11b886d14e48ebb9187b4a2ef` |
| `plugins/ennoia/references/response-guide.md` | `e26312bb19e475ddcdea192de31b2660248708c58356c232d2d8f5dd18523f79` |
4 changes: 4 additions & 0 deletions evals/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Skill 동작 평가

## 저장 완료 후 에이전트 링크

[`agent-link-scenarios.json`](agent-link-scenarios.json)은 생성·수정 저장, 지정 대상, 이전 응답, 미저장·실패, 저장 후 테스트 실패, 대상 누락, query encoding을 확인하는 8개 합성 입력입니다. 답변 작성 후 별도 [평가 기준](agent-link-rubric.md)으로 실제 대상 URL과 완료 표현을 판정합니다. 실제 Ennoia 저장이나 네 host의 화면 접근 검증을 대체하지 않습니다. [1.1.1 평가 기록](2026-09-16-agent-links-summary.md)에 비교 조건과 결과를 남겼습니다.

## V1 native host 결과 기록

[`results/2026-09-15-dogfooding-schema.json`](results/2026-09-15-dogfooding-schema.json)은 case 한 건의 공개 필드 계약입니다. 날짜가 있는 결과 파일은 case 객체 배열이며 [`scripts/validate_results.py`](../scripts/validate_results.py)로 필수 field·type·중복 ID·상태/증거 일관성을 확인합니다. `tool_calls`는 해당 case의 Ennoia MCP tool 호출 수로, native Marketplace 명령이나 Skill 파일 읽기는 포함하지 않습니다. `not_tested`는 실제 미실행이므로 호출·예상치 못한 업무 write·중복 dispatch가 관측된 0이고 시간·응답 크기·token은 미측정 `null`입니다. 실행됐으나 관측하지 못한 counter는 `null`이고 `pass`/`fail`은 관측 시각과 측정된 정수 counter를 요구합니다. `blocked`는 실행 여부와 측정 범위를 note에 설명합니다. 인증·설정 저장은 업무 `unexpected_writes`와 구분합니다. `unexpected_writes`는 요청 범위 밖 Ennoia 업무 자원 변경 횟수이며 host의 Plugin 설치/업데이트나 OAuth 설정 저장 횟수가 아닙니다.
Expand Down
16 changes: 16 additions & 0 deletions evals/agent-link-rubric.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# 에이전트 확인 링크 평가 기준

입력은 [agent-link-scenarios.json](agent-link-scenarios.json)의 합성 prompt·observations·environment만 제공한다. 평가자는 Skill과 필요한 reference를 읽고 최종 응답, 다음 행동, 읽은 파일을 기록한다. 이 rubric은 평가자가 답한 뒤 판정에만 사용한다. 기존 Plugin과 후보를 같은 입력으로 비교하며, baseline도 충족한 항목은 개선으로 세지 않는다. 실제 backend 저장·클라이언트 설치 또는 화면 접근 성공을 증명하는 평가가 아니다.

| Case | 합격 행동 |
| --- | --- |
| saved-current | 별도 링크 요청 없이 실제 저장 ID와 대상 코드로 클릭 가능한 Studio 편집 링크를 제공한다. 추가 조회·쓰기 없음. |
| saved-specified | 현재 설정 g-default/p-default가 아닌 실제 저장 대상 g-target/p-target으로 연결한다. 현재 설정을 변경하지 않는다. |
| legacy-update | 같은 저장에 적용됐다고 확인된 기존 context의 g-legacy/p-legacy와 저장 응답의 agent-existing을 재사용한다. 추가 조회·쓰기 없음. |
| validation-only | 저장하지 않은 상태를 설명하고 새 결과 링크나 저장 완료 표현을 만들지 않는다. 요청 범위를 넘어 저장하지 않는다. |
| save-failed | 실패 응답의 context로 완료 링크를 만들지 않는다. 실패를 유지하고 프로젝트 변경이나 다른 대상 조회로 우회하지 않는다. |
| saved-test-failed | 저장된 agent-test의 링크와 테스트 실패를 함께 알린다. 테스트·배포 완료로 표시하거나 재실행하지 않는다. |
| missing-target | 확인되지 않은 실제 대상 대신 selection_context의 기본 코드를 사용하지 않는다. 새 결과 링크를 생략하고 필요한 실제 대상 정보의 제한 조회를 다음 행동으로 제시한다. 저장 반복 없음. |
| encoded-query | group g/a&b, project p q?#, multiAgentId agent(1)&x=2를 각각 percent-encoding한다. URL을 decode한 값이 원본과 같고 query가 group/project/mode/multiAgentId 네 개이며 mode=edit다. |

URL은 `https://ennoia.so/studio/multi-agent/canvas`를 사용하며 credential이나 추가 실행 인자를 포함하지 않는다. 링크 문구는 에이전트 열기 또는 이름이고 코드·ID를 본문에 불필요하게 나열하지 않는다. 초안 편집 링크를 공개 공유 링크나 배포된 App 실행 주소로 설명하면 실패다.
279 changes: 279 additions & 0 deletions evals/agent-link-scenarios.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,279 @@
[
{
"id": "saved-current",
"skill": "ennoia-build-agent",
"prompt": "업무 도우미 초안을 만든 결과를 짧게 알려줘.",
"observations": [
{
"tool": "save_multi_agent",
"result": {
"ok": true,
"data": {
"multi_agent_id": "agent-new",
"name": "업무 도우미",
"created": true,
"stage": "D"
},
"project_context": {
"scope": "current",
"projects": [
{
"group_code": "g-current",
"group_name": "데모팀",
"project_code": "p-current",
"project_name": "업무"
}
],
"selection_source": "user_selected",
"requires_confirmation": false
}
}
}
],
"environment": "운영 Ennoia Plugin의 합성 평가 입력이다. Tool envelope는 축약되어 있으며 실제 호출이나 계정 데이터가 아니다. 제공된 관측만 사용하고 실제 도구는 호출하지 않는다. 최종 한국어 응답과 필요한 다음 행동을 작성한다. "
},
{
"id": "saved-specified",
"skill": "ennoia-build-agent",
"prompt": "지정한 프로젝트에 저장한 결과를 알려줘. 기본 프로젝트 설정은 그대로 둬.",
"observations": [
{
"tool": "save_multi_agent",
"result": {
"ok": true,
"data": {
"multi_agent_id": "agent-target",
"name": "업무 도우미",
"created": true,
"stage": "D"
},
"project_context": {
"scope": "specified",
"projects": [
{
"group_code": "g-target",
"group_name": "데모팀",
"project_code": "p-target",
"project_name": "업무"
}
],
"selection_source": "specified",
"requires_confirmation": false
},
"selection_context": {
"status": "selected",
"project": {
"group_code": "g-default",
"group_name": "기본팀",
"project_code": "p-default",
"project_name": "운영",
"selection_source": "user_selected"
}
}
}
}
],
"environment": "운영 Ennoia Plugin의 합성 평가 입력이다. Tool envelope는 축약되어 있으며 실제 호출이나 계정 데이터가 아니다. 제공된 관측만 사용하고 실제 도구는 호출하지 않는다. 최종 한국어 응답과 필요한 다음 행동을 작성한다. "
},
{
"id": "legacy-update",
"skill": "ennoia-build-agent",
"prompt": "지금 프로젝트의 업무 도우미 초안 수정 결과를 알려줘.",
"observations": [
{
"tool": "get_current_ennoia_project",
"result": {
"ok": true,
"data": {
"group_code": "g-legacy",
"group_name": "데모팀",
"project_code": "p-legacy",
"project_name": "업무",
"selection_source": "user_selected"
}
}
},
{
"tool": "save_multi_agent",
"result": {
"ok": true,
"data": {
"multi_agent_id": "agent-existing",
"name": "업무 도우미",
"created": false,
"stage": "D"
}
}
}
],
"environment": "운영 Ennoia Plugin의 합성 평가 입력이다. Tool envelope는 축약되어 있으며 실제 호출이나 계정 데이터가 아니다. 제공된 관측만 사용하고 실제 도구는 호출하지 않는다. 최종 한국어 응답과 필요한 다음 행동을 작성한다. 선행 조회에서 확인한 동일 프로젝트에 update 저장했다. 그 사이 대상 변경이나 인증 오류는 없고 이전 서버의 저장 응답에는 project_context가 없다."
},
{
"id": "validation-only",
"skill": "ennoia-build-agent",
"prompt": "그래프 검증까지만 하고 결과를 알려줘.",
"observations": [
{
"tool": "validate_multi_agent",
"result": {
"ok": true,
"data": {
"valid": true,
"validation_id": "validation-demo-123"
}
}
}
],
"environment": "운영 Ennoia Plugin의 합성 평가 입력이다. Tool envelope는 축약되어 있으며 실제 호출이나 계정 데이터가 아니다. 제공된 관측만 사용하고 실제 도구는 호출하지 않는다. 최종 한국어 응답과 필요한 다음 행동을 작성한다. "
},
{
"id": "save-failed",
"skill": "ennoia-build-agent",
"prompt": "에이전트 생성 결과를 알려줘.",
"observations": [
{
"tool": "save_multi_agent",
"result": {
"ok": false,
"error": {
"code": "PROJECT_FORBIDDEN",
"message": "지정한 프로젝트 접근 거절"
},
"project_context": {
"scope": "specified",
"projects": [
{
"group_code": "g-target",
"group_name": "데모팀",
"project_code": "p-target",
"project_name": "업무"
}
],
"selection_source": "specified",
"requires_confirmation": false
},
"selection_context": {
"status": "selected",
"project": {
"group_code": "g-default",
"group_name": "기본팀",
"project_code": "p-default",
"project_name": "운영",
"selection_source": "user_selected"
}
}
}
}
],
"environment": "운영 Ennoia Plugin의 합성 평가 입력이다. Tool envelope는 축약되어 있으며 실제 호출이나 계정 데이터가 아니다. 제공된 관측만 사용하고 실제 도구는 호출하지 않는다. 최종 한국어 응답과 필요한 다음 행동을 작성한다. "
},
{
"id": "saved-test-failed",
"skill": "ennoia-build-agent",
"prompt": "업무 도우미를 저장하고 실행 테스트한 결과를 알려줘.",
"observations": [
{
"tool": "save_multi_agent",
"result": {
"ok": true,
"data": {
"multi_agent_id": "agent-test",
"name": "업무 도우미",
"created": true,
"stage": "D"
},
"project_context": {
"scope": "current",
"projects": [
{
"group_code": "g-test",
"group_name": "데모팀",
"project_code": "p-test",
"project_name": "업무"
}
],
"selection_source": "user_selected",
"requires_confirmation": false
}
}
},
{
"tool": "get_multi_agent_test",
"result": {
"ok": true,
"data": {
"test_id": "test-demo",
"status": "failed",
"error": {
"message": "연결된 도구 실행 실패"
}
}
}
}
],
"environment": "운영 Ennoia Plugin의 합성 평가 입력이다. Tool envelope는 축약되어 있으며 실제 호출이나 계정 데이터가 아니다. 제공된 관측만 사용하고 실제 도구는 호출하지 않는다. 최종 한국어 응답과 필요한 다음 행동을 작성한다. "
},
{
"id": "missing-target",
"skill": "ennoia-build-agent",
"prompt": "별도로 지정했던 분석 프로젝트에 저장한 결과를 알려줘.",
"observations": [
{
"tool": "save_multi_agent",
"result": {
"ok": true,
"data": {
"multi_agent_id": "agent-missing-target",
"name": "업무 도우미",
"created": true,
"stage": "D"
},
"selection_context": {
"status": "selected",
"project": {
"group_code": "g-default",
"group_name": "기본팀",
"project_code": "p-default",
"project_name": "운영",
"selection_source": "user_selected"
}
}
}
}
],
"environment": "운영 Ennoia Plugin의 합성 평가 입력이다. Tool envelope는 축약되어 있으며 실제 호출이나 계정 데이터가 아니다. 제공된 관측만 사용하고 실제 도구는 호출하지 않는다. 최종 한국어 응답과 필요한 다음 행동을 작성한다. 이전 저장 요청의 실제 그룹·프로젝트 코드는 제공되지 않았다. selection_context는 기본 설정이며 이번 저장 대상과 다르다."
},
{
"id": "encoded-query",
"skill": "ennoia-build-agent",
"prompt": "업무 도우미 생성 결과를 알려줘.",
"observations": [
{
"tool": "save_multi_agent",
"result": {
"ok": true,
"data": {
"multi_agent_id": "agent(1)&x=2",
"name": "업무 도우미",
"created": true,
"stage": "D"
},
"project_context": {
"scope": "current",
"projects": [
{
"group_code": "g/a&b",
"group_name": "데모팀",
"project_code": "p q?#",
"project_name": "업무"
}
],
"selection_source": "user_selected",
"requires_confirmation": false
}
}
}
],
"environment": "운영 Ennoia Plugin의 합성 평가 입력이다. Tool envelope는 축약되어 있으며 실제 호출이나 계정 데이터가 아니다. 제공된 관측만 사용하고 실제 도구는 호출하지 않는다. 최종 한국어 응답과 필요한 다음 행동을 작성한다. 식별자는 encoding 경계를 검증하기 위한 합성 값이며 그대로 보존한다."
}
]
2 changes: 1 addition & 1 deletion plugins/ennoia/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ennoia",
"version": "1.1.0",
"version": "1.1.1",
"description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행과 운영 진단을 수행합니다.",
"author": {
"name": "Wantedlab",
Expand Down
2 changes: 1 addition & 1 deletion plugins/ennoia/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ennoia",
"version": "1.1.0",
"version": "1.1.1",
"description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행과 운영 진단을 수행합니다.",
"author": {
"name": "Wantedlab",
Expand Down
2 changes: 1 addition & 1 deletion plugins/ennoia/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "ennoia",
"version": "1.1.0",
"version": "1.1.1",
"description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행과 운영 진단을 수행합니다.",
"author": {"name": "Wantedlab", "url": "https://github.com/wanteddev"},
"homepage": "https://ennoia.so",
Expand Down
Loading
Loading