Agent 모듈 설치 경로의 루트 재정의 반영, E2E 흐름 30 판정 로직 수정, 검증 기록 갱신

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
zzabisagent-lab
2026-10-26 13:18:20 +00:00
co-authored by Claude Fable 5.1
parent 98f4182bbb
commit acb69c7650
4 changed files with 235 additions and 274 deletions
+132 -169
View File
@@ -1,23 +1,23 @@
{
"generatedAt": "2026-10-26T13:12:56.197Z",
"startedAt": "2026-10-26T13:10:36.090Z",
"generatedAt": "2026-10-26T13:18:11.518Z",
"startedAt": "2026-10-26T13:15:47.881Z",
"env": {
"agents": 4,
"ports": {
"hal": 40927,
"portal": 43283,
"wm": 40985,
"am": 42921,
"mail": 34497
"hal": 42511,
"portal": 32983,
"wm": 35307,
"am": 33813,
"mail": 41473
},
"mailServerRegistered": true,
"node": "v24.22.1"
},
"summary": {
"verified_local": 17,
"verified_local": 19,
"partial": 14,
"not_verifiable_locally": 1,
"failed": 2,
"failed": 0,
"unrecorded": 0
},
"flows": [
@@ -99,12 +99,12 @@
{
"name": "팀 그룹 만들기 → 현재 그룹 전환",
"ok": true,
"detail": "g_01a17855a4277ac98f458d3057"
"detail": "g_01a1785a66113e63a08c972cc5"
},
{
"name": "이메일 초대(7일) → 초대 메일 링크",
"ok": true,
"detail": "Y4dXy0GV5b7pvqunRITvwVbgXFNedpwd"
"detail": "uVdQrHwu9UjZmbh1PlCVMIPsJFxbHnvo"
},
{
"name": "초대 수락(1회용) → 별칭 user-02 · 역할 member",
@@ -162,7 +162,7 @@
"detail": {
"count": 2,
"team": {
"id": "pv_01a17855a17f402b30366a2d5a",
"id": "pv_01a1785a6358a08c3194ac03c2",
"price": 49000,
"sites": 3
},
@@ -179,7 +179,7 @@
"orderNo": "AW-20261026-0001",
"status": "awaiting_payment",
"total": 63800,
"dueAt": "2026-11-02T13:10:41.050Z",
"dueAt": "2026-11-02T13:15:52.839Z",
"hasInstructions": true
}
},
@@ -221,7 +221,7 @@
"detail": {
"sites": 3,
"subs": 1,
"nextBilling": "2026-11-26T13:10:41.118Z"
"nextBilling": "2026-11-26T13:15:52.905Z"
}
}
],
@@ -233,7 +233,7 @@
"bill": {
"sites": 3,
"subs": 1,
"nextBilling": "2026-11-26T13:10:41.118Z"
"nextBilling": "2026-11-26T13:15:52.905Z"
}
}
},
@@ -248,7 +248,7 @@
"name": "사이트 생성(새 Webmaker 프로젝트·배포 방식 관리형) → 초안·사이트 수 미소비·다음 단계 안내",
"ok": true,
"detail": {
"id": "s_01a17855a51f4c70a0da049568",
"id": "s_01a1785a670945da067e955da4",
"lifecycle": "draft",
"projectId": "00000000000000000000000000000001",
"nextSteps": [
@@ -283,7 +283,7 @@
"name": "제작 화면 열기: 포털 SSO 티켓 → Webmaker /api/auth/sso 302(1회용)",
"ok": true,
"detail": {
"portalRedirect": "http://127.0.0.1:40985/api/auth/sso?ticket=…",
"portalRedirect": "http://127.0.0.1:35307/api/auth/sso?ticket=…",
"webmaker": 302,
"reuse": 401
}
@@ -299,7 +299,7 @@
],
"evidence": {
"sso": {
"portalRedirect": "http://127.0.0.1:40985/api/auth/sso?ticket=…",
"portalRedirect": "http://127.0.0.1:35307/api/auth/sso?ticket=…",
"webmaker": 302,
"reuse": 401
},
@@ -320,7 +320,7 @@
"name": "배포 요청 → 10단계 작업·사이트 수 예약·같은 요청 재제출은 하나",
"ok": true,
"detail": {
"jobId": "j_01a17855a56c302b142ccac6a7",
"jobId": "j_01a1785a6757555a33d6269bd8",
"steps": 10,
"again": false,
"siteCount": "reserved",
@@ -351,7 +351,7 @@
"ok": true,
"detail": {
"lifecycle": "needs_domain",
"version": "20261026131041-rev-c1-000000",
"version": "20261026131553-rev-c1-000000",
"verify": "needs_domain",
"health": "ok",
"agentHasSite": true
@@ -360,7 +360,7 @@
],
"evidence": {
"d": {
"jobId": "j_01a17855a56c302b142ccac6a7",
"jobId": "j_01a1785a6757555a33d6269bd8",
"steps": 10,
"again": false,
"siteCount": "reserved",
@@ -383,7 +383,7 @@
},
"after": {
"lifecycle": "needs_domain",
"version": "20261026131041-rev-c1-000000",
"version": "20261026131553-rev-c1-000000",
"verify": "needs_domain",
"health": "ok",
"agentHasSite": true
@@ -401,7 +401,7 @@
"name": "도메인 추가(웹·대표 지정) → 소유 확인 TXT 값 안내 → 작업이 외부 대기(TXT)",
"ok": true,
"detail": {
"domainId": "d_01a17855b5405b38f36942a6e1",
"domainId": "d_01a1785a772932b8936927ad0a",
"txtName": "_ariweb-verify.aw-e2e.localhost",
"txtValueShape": "ariweb-verify=…",
"copyable": true
@@ -422,7 +422,7 @@
],
"evidence": {
"dm": {
"domainId": "d_01a17855b5405b38f36942a6e1",
"domainId": "d_01a1785a772932b8936927ad0a",
"txtName": "_ariweb-verify.aw-e2e.localhost",
"txtValueShape": "ariweb-verify=…",
"copyable": true
@@ -500,7 +500,7 @@
"name": "사이트 대표 메일 생성(사이트 연결 도메인·배정) → AriMail 테넌트 준비·도메인별 보장량·ariweb 표시",
"ok": true,
"detail": {
"id": "msv_01a178563dd6f7ac39957c38a1",
"id": "msv_01a1785affa395a9602c99bbb5",
"status": "needs_setup",
"tenant": true,
"ariwebKind": "site_bound",
@@ -517,7 +517,7 @@
"name": "메일함 생성: 초기 비밀번호 1회 표시·접속 안내 → 재조회에는 비밀번호 없음",
"ok": true,
"detail": {
"id": "mb_01a178563e14cf15ea191a4de5",
"id": "mb_01a1785affda99dffac745d1e9",
"address": "kim@aw-e2e.localhost",
"passwordShownOnce": "[redacted]",
"mustChange": true,
@@ -584,7 +584,7 @@
],
"evidence": {
"svc": {
"id": "msv_01a178563dd6f7ac39957c38a1",
"id": "msv_01a1785affa395a9602c99bbb5",
"status": "needs_setup",
"tenant": true,
"ariwebKind": "site_bound",
@@ -592,7 +592,7 @@
"siteCountAllocated": 0
},
"mb": {
"id": "mb_01a178563e14cf15ea191a4de5",
"id": "mb_01a1785affda99dffac745d1e9",
"address": "kim@aw-e2e.localhost",
"passwordShownOnce": "[redacted]",
"mustChange": true,
@@ -644,7 +644,7 @@
"name": "메일 전용 도메인 등록(solo-e2e.localhost, purpose mail)",
"ok": true,
"detail": {
"id": "d_01a17856662c41b1d8aaf0c851",
"id": "d_01a1785b2be9c7ee6d0d94a95c",
"jobCancelled": null
}
},
@@ -652,7 +652,7 @@
"name": "독립 메일 서비스 생성(독립 옵션 소비·사이트 수 미소비)",
"ok": true,
"detail": {
"id": "msv_01a178566634f50d5e0c8ce0c7",
"id": "msv_01a1785b2bf14cefa9e1f81fd7",
"kind": "standalone",
"mailServicesAllocated": 1,
"sitesAllocated": 0
@@ -661,7 +661,7 @@
],
"evidence": {
"r": {
"id": "msv_01a178566634f50d5e0c8ce0c7",
"id": "msv_01a1785b2bf14cefa9e1f81fd7",
"kind": "standalone",
"mailServicesAllocated": 1,
"sitesAllocated": 0
@@ -701,8 +701,8 @@
"ok": true,
"detail": {
"status": "active",
"firstDue": "2026-10-27T13:11:30.755Z",
"nextRun": "2026-10-26T13:11:30.755Z"
"firstDue": "2026-10-27T13:16:43.530Z",
"nextRun": "2026-10-26T13:16:43.530Z"
}
},
{
@@ -712,7 +712,7 @@
"timedOut": false,
"optionStatus": "active",
"lastJob": null,
"siteServer": "srv_01a178559b3ef8b19bacf9e7bf",
"siteServer": "srv_01a1785a5d26219326f7ad26ec",
"backup": {
"status": "done",
"tier": "monthly",
@@ -733,14 +733,14 @@
},
"opt": {
"status": "active",
"firstDue": "2026-10-27T13:11:30.755Z",
"nextRun": "2026-10-26T13:11:30.755Z"
"firstDue": "2026-10-27T13:16:43.530Z",
"nextRun": "2026-10-26T13:16:43.530Z"
},
"run1": {
"timedOut": false,
"optionStatus": "active",
"lastJob": null,
"siteServer": "srv_01a178559b3ef8b19bacf9e7bf",
"siteServer": "srv_01a1785a5d26219326f7ad26ec",
"backup": {
"status": "done",
"tier": "monthly",
@@ -763,19 +763,19 @@
"ok": true,
"detail": {
"backup": {
"id": "bk_01a1785678cb538e124484669b",
"createdAt": "2026-10-26T13:11:30.762Z",
"id": "bk_01a1785b465fad18eaeb8a679e",
"createdAt": "2026-10-26T13:16:43.538Z",
"scope": {
"files": true,
"db": true,
"uploads": true,
"config": true,
"storeServerId": "srv_01a178559bee1c3a73f5640021",
"storeServerId": "srv_01a1785a5dd874fe86b67f0f38",
"verifyMethod": "sha256 + 격리 환경 읽기 확인"
},
"sizeBytes": 1909,
"sizeBytes": 1896,
"verifyState": "verified",
"expiresAt": "2027-01-27T13:11:35.372Z",
"expiresAt": "2027-01-27T13:16:50.144Z",
"tier": "monthly"
},
"included": [
@@ -809,7 +809,7 @@
"name": "복원 요청 → 운영자 승인 대기 · 중복 요청 없음",
"ok": true,
"detail": {
"id": "rs_01a178567e7ec8dd46d83c957c",
"id": "rs_01a1785b4a2808cc16818090d9",
"status": "awaiting_approval",
"dup": false,
"finalConfirmation": {
@@ -838,19 +838,19 @@
"evidence": {
"info": {
"backup": {
"id": "bk_01a1785678cb538e124484669b",
"createdAt": "2026-10-26T13:11:30.762Z",
"id": "bk_01a1785b465fad18eaeb8a679e",
"createdAt": "2026-10-26T13:16:43.538Z",
"scope": {
"files": true,
"db": true,
"uploads": true,
"config": true,
"storeServerId": "srv_01a178559bee1c3a73f5640021",
"storeServerId": "srv_01a1785a5dd874fe86b67f0f38",
"verifyMethod": "sha256 + 격리 환경 읽기 확인"
},
"sizeBytes": 1909,
"sizeBytes": 1896,
"verifyState": "verified",
"expiresAt": "2027-01-27T13:11:35.372Z",
"expiresAt": "2027-01-27T13:16:50.144Z",
"tier": "monthly"
},
"included": [
@@ -880,7 +880,7 @@
"deferred": []
},
"rq": {
"id": "rs_01a178567e7ec8dd46d83c957c",
"id": "rs_01a1785b4a2808cc16818090d9",
"status": "awaiting_approval",
"dup": false,
"finalConfirmation": {
@@ -970,8 +970,8 @@
"name": "외부 배포 사이트 생성(초안) + 저장본",
"ok": true,
"detail": {
"id": "s_01a1785769fa0becc28ee2efbc",
"group_id": "g_01a17855a4277ac98f458d3057",
"id": "s_01a1785c35f8d649e375f0c391",
"group_id": "g_01a1785a66113e63a08c972cc5",
"name": "E2E 외부 사이트",
"purpose": "e2e",
"webmaker_project_id": "00000000000000000000000000000004",
@@ -999,9 +999,9 @@
"retention_until": null,
"delete_after": null,
"deleted_at": null,
"created_by": "u_01a17855a37efae6dc46b789fa",
"created_at": "2026-10-26T13:12:37.114Z",
"updated_at": "2026-10-26T13:12:37.124Z",
"created_by": "u_01a1785a65614c4deeec61ea3d",
"created_at": "2026-10-26T13:17:51.480Z",
"updated_at": "2026-10-26T13:17:51.485Z",
"runtime": "static",
"consent_version": null,
"pending_cleanup_json": null,
@@ -1042,8 +1042,8 @@
"ok": true,
"detail": {
"token": "[redacted]",
"install": "curl -fsSL http://127.0.0.1:40927/agent/v1/install.sh | bash -s -- --hal http://127.0.0.1:40927 --token … --external --site s_01a1785769fa0becc28ee2efbc",
"expiresAt": "2026-10-26T13:22:37.404Z",
"install": "curl -fsSL http://127.0.0.1:42511/agent/v1/install.sh | bash -s -- --hal http://127.0.0.1:42511 --token … --external --site s_01a1785c35f8d649e375f0c391",
"expiresAt": "2026-10-26T13:27:51.761Z",
"status": "pending"
}
},
@@ -1126,8 +1126,8 @@
"agreed": false
},
"tok": {
"install": "curl -fsSL http://127.0.0.1:40927/agent/v1/install.sh | bash -s -- --hal http://127.0.0.1:40927 --token … --external --site s_01a1785769fa0becc28ee2efbc",
"expiresAt": "2026-10-26T13:22:37.404Z"
"install": "curl -fsSL http://127.0.0.1:42511/agent/v1/install.sh | bash -s -- --hal http://127.0.0.1:42511 --token … --external --site s_01a1785c35f8d649e375f0c391",
"expiresAt": "2026-10-26T13:27:51.761Z"
},
"conn": {
"status": "connected",
@@ -1311,7 +1311,7 @@
"approve": 200,
"sites": 1,
"mailboxes": 5,
"product": "pv_01a17855a17f31a67b1ac8d3f0"
"product": "pv_01a1785a6358a0946ad508ee8d"
}
}
],
@@ -1347,7 +1347,7 @@
"approve": 200,
"sites": 1,
"mailboxes": 5,
"product": "pv_01a17855a17f31a67b1ac8d3f0"
"product": "pv_01a1785a6358a0946ad508ee8d"
}
}
},
@@ -1430,9 +1430,9 @@
"name": "요청(보내는 그룹, 초안 사이트) → 받는 사용자 알림",
"ok": true,
"detail": {
"id": "tr_01a1785788f3921de196eb902e",
"id": "tr_01a1785c58c47561320ed6f007",
"status": "requested",
"expiresAt": "2026-11-02T13:12:45.043Z",
"expiresAt": "2026-11-02T13:18:00.388Z",
"bobNotified": true
}
},
@@ -1460,7 +1460,7 @@
"bad": "final_confirmation_mismatch",
"ok": 200,
"status": "completed",
"cutover": "2026-10-26T13:12:45.093Z"
"cutover": "2026-10-26T13:18:00.432Z"
}
},
{
@@ -1489,9 +1489,9 @@
"excluded": 3
},
"rq": {
"id": "tr_01a1785788f3921de196eb902e",
"id": "tr_01a1785c58c47561320ed6f007",
"status": "requested",
"expiresAt": "2026-11-02T13:12:45.043Z",
"expiresAt": "2026-11-02T13:18:00.388Z",
"bobNotified": true
},
"acc": {
@@ -1503,7 +1503,7 @@
"bad": "final_confirmation_mismatch",
"ok": 200,
"status": "completed",
"cutover": "2026-10-26T13:12:45.093Z"
"cutover": "2026-10-26T13:18:00.432Z"
},
"after": {
"aliceSees": 404,
@@ -1649,8 +1649,8 @@
{
"no": 22,
"title": "HAL 우선 배포 후 HAL을 통한 전체 모듈 배포",
"verdict": "failed",
"note": "HAL 우선 순서(hal_first 거부)·릴리스 승인·부트스트랩 잠김은 확인. 모듈 배포 작업은 완료되지 않음(진단 증거 참조)",
"verdict": "verified_local",
"note": "HAL 우선 순서·릴리스 승인·모듈 설치",
"blockedBy": null,
"steps": [
{
@@ -1702,15 +1702,15 @@
"name": "HAL 모듈 0.1.1 을 제어 서버에 배포(실제 Agent module.install: artifact 내려받기·sha256·releases/current·유닛(stub)·실제 버전 확인)",
"ok": true,
"detail": {
"status": "failed",
"status": "done",
"steps": [
"precheck:done",
"fanout:done",
"collect:failed"
"collect:done"
],
"error": "1대 중 1대 실패·대기 — 대상별 결과를 확인하세요",
"error": null,
"children": [
"failed:EACCES: permission denied, mkdir '/srv/ariweb/hal/releases'"
"done:"
],
"agentJobs": [],
"timedOut": false
@@ -1752,31 +1752,20 @@
"complete": true
},
"dep": {
"status": "failed",
"status": "done",
"steps": [
"precheck:done",
"fanout:done",
"collect:failed"
"collect:done"
],
"error": "1대 중 1대 실패·대기 — 대상별 결과를 확인하세요",
"error": null,
"children": [
"failed:EACCES: permission denied, mkdir '/srv/ariweb/hal/releases'"
"done:"
],
"agentJobs": [],
"timedOut": false
},
"diag": {
"stuckNow": [],
"halLog": [
"2026-10-26T13:10:38.150Z [hal] Ariweb HAL v0.1.1 — http://127.0.0.1:40927 (공개 http://127.0.0.1:40927, 데이터 /home/master/work/Ariweb-suite/test/.tmp/e2e-20261026131036/hal, 부트스트랩 진행 중)",
"2026-10-26T13:12:45.488Z [jobs] module.deploy j_01a17857894f044d5d9552218a 실패: HAL 이 아직 0.1.2 으로 실행되고 있지 않습니다(현재 0.1.1). HAL 을 먼저 배포하세요",
"2026-10-26T13:12:47.496Z [jobs] module.deploy.target j_01a178578ca73b9fe8276f58e3 실패: EACCES: permission denied, mkdir '/srv/ariweb/hal/releases'",
"2026-10-26T13:12:47.996Z [jobs] module.deploy j_01a178578c7e94c12a61d85f10 실패: 1대 중 1대 실패·대기 — 대상별 결과를 확인하세요"
],
"ctlAgentLog": [
"2026-10-26T13:10:38.789Z [agent] Ariweb Node Agent v0.1.1 ag_01a178559b15aed8b0e25f47a5 (managed) → http://127.0.0.1:40927"
]
}
"diag": null
}
},
{
@@ -1792,7 +1781,7 @@
"detail": {
"status": "done",
"canRetry": false,
"jobId": "j_01a17855a56c302b142ccac6a7"
"jobId": "j_01a1785a6757555a33d6269bd8"
}
},
{
@@ -1817,7 +1806,7 @@
"dep": {
"status": "done",
"canRetry": false,
"jobId": "j_01a17855a56c302b142ccac6a7"
"jobId": "j_01a1785a6757555a33d6269bd8"
},
"rt": {
"status": 400,
@@ -1843,7 +1832,7 @@
"detail": {
"title": "주문 AW-20261026-0001 승인 — 권리가 활성화되었습니다",
"category": "billing",
"link": "/orders/o_01a17855a499a9b2c94a482c83"
"link": "/orders/o_01a1785a6686ffeba5d2781add"
}
},
{
@@ -1859,7 +1848,7 @@
"ok": true,
"detail": {
"status": "approved",
"approvedAt": "2026-10-26T13:10:41.118Z"
"approvedAt": "2026-10-26T13:15:52.905Z"
}
}
],
@@ -1867,7 +1856,7 @@
"n": {
"title": "주문 AW-20261026-0001 승인 — 권리가 활성화되었습니다",
"category": "billing",
"link": "/orders/o_01a17855a499a9b2c94a482c83"
"link": "/orders/o_01a1785a6686ffeba5d2781add"
},
"a": {
"action": "order.approve",
@@ -1875,7 +1864,7 @@
},
"same": {
"status": "approved",
"approvedAt": "2026-10-26T13:10:41.118Z"
"approvedAt": "2026-10-26T13:15:52.905Z"
}
}
},
@@ -1918,9 +1907,9 @@
"rpo_minutes": 30,
"snapshot_interval_minutes": 60,
"retention_count": 3,
"external_store": "/home/master/work/Ariweb-suite/test/.tmp/e2e-20261026131036/dr-external",
"updated_at": "2026-10-26T13:12:53.244Z",
"updated_by": "op_01a178559a40f4802a91a5fb1a"
"external_store": "/home/master/work/Ariweb-suite/test/.tmp/e2e-20261026131547/dr-external",
"updated_at": "2026-10-26T13:18:08.570Z",
"updated_by": "op_01a1785a5c27caed1a96f25d99"
}
},
{
@@ -1980,9 +1969,9 @@
"rpo_minutes": 30,
"snapshot_interval_minutes": 60,
"retention_count": 3,
"external_store": "/home/master/work/Ariweb-suite/test/.tmp/e2e-20261026131036/dr-external",
"updated_at": "2026-10-26T13:12:53.244Z",
"updated_by": "op_01a178559a40f4802a91a5fb1a"
"external_store": "/home/master/work/Ariweb-suite/test/.tmp/e2e-20261026131547/dr-external",
"updated_at": "2026-10-26T13:18:08.570Z",
"updated_by": "op_01a1785a5c27caed1a96f25d99"
},
"snap": {
"verify": "ok",
@@ -2016,7 +2005,7 @@
"ok": true,
"detail": {
"mailJob": {
"id": "j_01a178565252141cf5e3859e6c",
"id": "j_01a1785b141b2aba663738d139",
"status": "awaiting_external"
},
"halJobs": 18
@@ -2028,7 +2017,7 @@
"detail": {
"sessionKept": "[redacted]",
"mailJob": {
"id": "j_01a178565252141cf5e3859e6c",
"id": "j_01a1785b141b2aba663738d139",
"status": "awaiting_external"
},
"same": true
@@ -2047,7 +2036,7 @@
"evidence": {
"before": {
"mailJob": {
"id": "j_01a178565252141cf5e3859e6c",
"id": "j_01a1785b141b2aba663738d139",
"status": "awaiting_external"
},
"halJobs": 18
@@ -2055,7 +2044,7 @@
"pr": {
"sessionKept": "[redacted]",
"mailJob": {
"id": "j_01a178565252141cf5e3859e6c",
"id": "j_01a1785b141b2aba663738d139",
"status": "awaiting_external"
},
"same": true
@@ -2086,8 +2075,8 @@
"ok": true,
"detail": [
{
"id": "s_01a1785631d62a2fbdf27a60d6",
"group_id": "g_01a17855a453ba2b2c5bf88ecd",
"id": "s_01a1785af3ab8d0d00e0063124",
"group_id": "g_01a1785a663da04c2c5802e990",
"name": "동시 A",
"purpose": "e2e",
"webmaker_project_id": "00000000000000000000000000000002",
@@ -2115,9 +2104,9 @@
"retention_until": null,
"delete_after": null,
"deleted_at": null,
"created_by": "u_01a17855a4526739e73bc5adbf",
"created_at": "2026-10-26T13:11:17.206Z",
"updated_at": "2026-10-26T13:11:17.215Z",
"created_by": "u_01a1785a663df67cc036d6bc02",
"created_at": "2026-10-26T13:16:28.971Z",
"updated_at": "2026-10-26T13:16:28.978Z",
"runtime": "static",
"consent_version": null,
"pending_cleanup_json": null,
@@ -2136,8 +2125,8 @@
"nextJob": null
},
{
"id": "s_01a1785631da943306e342eba7",
"group_id": "g_01a17855a453ba2b2c5bf88ecd",
"id": "s_01a1785af3aeacb2a4c3e486f3",
"group_id": "g_01a1785a663da04c2c5802e990",
"name": "동시 B",
"purpose": "e2e",
"webmaker_project_id": "00000000000000000000000000000003",
@@ -2165,9 +2154,9 @@
"retention_until": null,
"delete_after": null,
"deleted_at": null,
"created_by": "u_01a17855a4526739e73bc5adbf",
"created_at": "2026-10-26T13:11:17.210Z",
"updated_at": "2026-10-26T13:11:17.218Z",
"created_by": "u_01a1785a663df67cc036d6bc02",
"created_at": "2026-10-26T13:16:28.974Z",
"updated_at": "2026-10-26T13:16:28.980Z",
"runtime": "static",
"consent_version": null,
"pending_cleanup_json": null,
@@ -2225,8 +2214,8 @@
"name": "외부 배포 사이트 생성(초안) + 저장본",
"ok": true,
"detail": {
"id": "s_01a1785769fa0becc28ee2efbc",
"group_id": "g_01a17855a4277ac98f458d3057",
"id": "s_01a1785c35f8d649e375f0c391",
"group_id": "g_01a1785a66113e63a08c972cc5",
"name": "E2E 외부 사이트",
"purpose": "e2e",
"webmaker_project_id": "00000000000000000000000000000004",
@@ -2254,9 +2243,9 @@
"retention_until": null,
"delete_after": null,
"deleted_at": null,
"created_by": "u_01a17855a37efae6dc46b789fa",
"created_at": "2026-10-26T13:12:37.114Z",
"updated_at": "2026-10-26T13:12:37.124Z",
"created_by": "u_01a1785a65614c4deeec61ea3d",
"created_at": "2026-10-26T13:17:51.480Z",
"updated_at": "2026-10-26T13:17:51.485Z",
"runtime": "static",
"consent_version": null,
"pending_cleanup_json": null,
@@ -2297,8 +2286,8 @@
"ok": true,
"detail": {
"token": "[redacted]",
"install": "curl -fsSL http://127.0.0.1:40927/agent/v1/install.sh | bash -s -- --hal http://127.0.0.1:40927 --token … --external --site s_01a1785769fa0becc28ee2efbc",
"expiresAt": "2026-10-26T13:22:37.404Z",
"install": "curl -fsSL http://127.0.0.1:42511/agent/v1/install.sh | bash -s -- --hal http://127.0.0.1:42511 --token … --external --site s_01a1785c35f8d649e375f0c391",
"expiresAt": "2026-10-26T13:27:51.761Z",
"status": "pending"
}
},
@@ -2481,21 +2470,21 @@
{
"no": 30,
"title": "모듈 업데이트, 일부 서버 실패, 대상별 되돌리기와 상태 조정",
"verdict": "failed",
"note": "대상별 자식 작업 생성·되돌리기 3단계 확인 거부는 확인. 일부 실패 요약·건강 확인·drift 조정은 작업 엔진 교착(흐름 22 결함)으로 완료되지 않음",
"blockedBy": 22,
"verdict": "verified_local",
"note": "대상별 자식 작업·일부 실패 partial 요약(전체 성공으로 묶지 않음)·건강 확인·drift 조정·되돌리기 3단계 확인 거부",
"blockedBy": null,
"steps": [
{
"name": "agent 모듈을 두 서버 + 없는 서버에 배포 → 대상별 자식 작업·일부 실패를 성공으로 묶지 않음(partial/all_failed)",
"ok": true,
"detail": {
"status": "failed",
"errorCode": "all_failed",
"overall": "failed",
"errorCode": "partial_failure",
"overall": "partial",
"children": [
"srv_missing_e2e:failed:서버가 없습니다",
"srv_01a178559bee1c3a73f5640021:failed:EACCES: permission denied, mkdir '/srv/ariweb/agent/releases'",
"srv_01a178559b3ef8b19bacf9e7bf:failed:EACCES: permission denied, mkdir '/srv/ariweb/agent/releases'"
"srv_01a1785a5d26219326f7ad26ec:done:",
"srv_01a1785a5dd874fe86b67f0f38:done:"
],
"timedOut": false
}
@@ -2505,7 +2494,7 @@
"ok": true,
"detail": {
"health": "done",
"drift": 1,
"drift": 0,
"reconcile": 200,
"overviewComponents": [
"HAL:ok",
@@ -2529,18 +2518,18 @@
"evidence": {
"d": {
"status": "failed",
"errorCode": "all_failed",
"overall": "failed",
"errorCode": "partial_failure",
"overall": "partial",
"children": [
"srv_missing_e2e:failed:서버가 없습니다",
"srv_01a178559bee1c3a73f5640021:failed:EACCES: permission denied, mkdir '/srv/ariweb/agent/releases'",
"srv_01a178559b3ef8b19bacf9e7bf:failed:EACCES: permission denied, mkdir '/srv/ariweb/agent/releases'"
"srv_01a1785a5d26219326f7ad26ec:done:",
"srv_01a1785a5dd874fe86b67f0f38:done:"
],
"timedOut": false
},
"h": {
"health": "done",
"drift": 1,
"drift": 0,
"reconcile": 200,
"overviewComponents": [
"HAL:ok",
@@ -2573,7 +2562,7 @@
"name": "critical 사건 등록 → 선언 → 승인 부족 자격 거부 → 3단계(순서·식별정보·문구) 거부/승인 → 자격 발급(1회)",
"ok": true,
"detail": {
"id": "em_01a17857aa1262003c4dfd08d9",
"id": "em_01a1785c79d6aa634fc6516b7b",
"noCred": "approvals_insufficient",
"wrongStep": "wrong_step",
"badIds": "identifiers_mismatch",
@@ -2581,7 +2570,7 @@
"approved": "approved",
"approvals": 3,
"credential": "[redacted]",
"expiresAt": "2026-10-26T13:42:53.551Z"
"expiresAt": "2026-10-26T13:48:08.882Z"
}
},
{
@@ -2602,14 +2591,14 @@
"evidence": {
"healthy": "hal_healthy",
"sess": {
"id": "em_01a17857aa1262003c4dfd08d9",
"id": "em_01a1785c79d6aa634fc6516b7b",
"noCred": "approvals_insufficient",
"wrongStep": "wrong_step",
"badIds": "identifiers_mismatch",
"badText": "final_confirm_mismatch",
"approved": "approved",
"approvals": 3,
"expiresAt": "2026-10-26T13:42:53.551Z"
"expiresAt": "2026-10-26T13:48:08.882Z"
},
"perf": {
"forbidden": "action_forbidden",
@@ -2661,8 +2650,8 @@
"ok": true,
"detail": {
"status": "readonly",
"deleteAfter": "2026-11-25T13:12:44.974Z",
"readonlyUntil": "2026-11-25T13:12:44.974Z"
"deleteAfter": "2026-11-25T13:18:00.329Z",
"readonlyUntil": "2026-11-25T13:18:00.329Z"
}
},
{
@@ -2688,8 +2677,8 @@
},
"un": {
"status": "readonly",
"deleteAfter": "2026-11-25T13:12:44.974Z",
"readonlyUntil": "2026-11-25T13:12:44.974Z"
"deleteAfter": "2026-11-25T13:18:00.329Z",
"readonlyUntil": "2026-11-25T13:18:00.329Z"
},
"sweep": {
"sweep": 200,
@@ -2879,33 +2868,7 @@
}
}
],
"bugs": [
{
"title": "모듈 설치가 ARIWEB_SRV_ROOT 를 무시하고 절대 경로(/srv/ariweb/<module>)에 쓰려 해 일반 계정·검증 환경에서 실패",
"file": "hal/jobs.mjs (module.deploy.target: appDir 기본값) / agent/jobs/module.mjs",
"route": "POST /ops/api/modules/:name/deploy",
"expected": "Agent 가 payload.appDir 가 없거나 루트 override 가 있으면 roots.srv 아래에 설치",
"actual": {
"status": "failed",
"steps": [
"precheck:done",
"fanout:done",
"collect:failed"
],
"error": "1대 중 1대 실패·대기 — 대상별 결과를 확인하세요",
"children": [
"failed:EACCES: permission denied, mkdir '/srv/ariweb/hal/releases'"
],
"agentJobs": [],
"timedOut": false
},
"repro": "ARIWEB_SRV_ROOT 를 둔 Agent 에 module.deploy → mkdir /srv/ariweb/hal 권한 오류",
"flows": [
22,
30
]
}
],
"bugs": [],
"needsInfrastructure": [
"도메인 소유 확인(TXT)·DNS 반영·HTTPS 발급·외부 접속 확인은 실제 DNS 와 공인 서버가 필요하다(흐름 7·8·11·14·15)",
"메일 DNS(MX·SPF·DKIM·DMARC) 반영과 외부 송신·수신·회신 왕복은 실 도메인·실 AriMail(SMTP 587/수신함)·외부 검증 주소가 필요하다(흐름 10 활성화 완료·11·33 완료)",