Files
zzabisagent-labandClaude Fable 5.1 d1eefaa15f 실제 환경 배포·검증 기록(0.1.1): ariweb.net 호스트 배포 완료, 34개 흐름 실환경 판정(실제 7·부분 7·미수행 20), RUNBOOK 운영 사실, 로컬 E2E 보고서 갱신
- docs/verification/real-env-0.1.1.md/.json: 배포 경과·결함 수정 요약, 흐름별 단계·증거, 재검증(systemd/nginx/HAL·포털 건강/배포 영수증/모듈 버전) 기록
- docs/RUNBOOK-0.1.1.md: 서버 한 대 운영, 메일 서버 등록 값, 발신 메일, 같은 릴리스 재등록 절차
- VERSION_HISTORY.md 알려진 제한에 실환경 검증 결과 기입. 출시 완료는 선언하지 않음

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-26 14:35:04 +00:00

1082 lines
29 KiB
JSON

{
"generatedAt": "2026-10-26T14:33:19.592Z",
"stamp": "mvpcu283",
"summary": {
"verified_real": 7,
"partial": 7,
"not_verified": 20
},
"flows": [
{
"no": 1,
"title": "신규 고객 가입과 이메일 확인",
"verdict": "verified_real",
"note": "실제 포털·실제 mailer 경로(포획 서버) — 외부 수신함 도착은 별도 1건으로 확인",
"steps": [
{
"name": "가입 → 세션 발급(실제 포털 https://my.ariweb.net)",
"ok": true,
"detail": {
"status": 200
}
},
{
"name": "확인 전 그룹 생성 차단(403 email_unverified)",
"ok": true,
"detail": "email_unverified"
},
{
"name": "확인 메일이 실제 발신 경로(mailer resend → 포획 서버)로 나감 · 토큰 추출",
"ok": true,
"detail": {
"subject": "[Ariweb] 이메일 주소를 확인해 주세요",
"from": "no-reply@ariweb.net",
"linkHost": "https://my.ariweb.net"
}
},
{
"name": "이메일 확인(1회용) → 재사용 거부",
"ok": true,
"detail": {
"first": 200,
"second": "token_used"
}
},
{
"name": "내 정보: 확인됨 · 개인 그룹 · owner",
"ok": true,
"detail": {
"verifiedAt": "2026-10-26T14:31:15.078Z",
"group": "personal",
"role": "owner"
}
},
{
"name": "중복 가입은 존재를 드러내지 않는 안내(409)",
"ok": true,
"detail": "signup_unavailable"
},
{
"name": "로그인 화면(로그인 상태면 302, 아니면 200)·기기(세션) 목록",
"ok": true,
"detail": {
"loggedIn": 302,
"anonymous": 200,
"sessions": 1
}
}
],
"evidence": {
"verifiedAt": "2026-10-26T14:31:15.078Z",
"group": "personal",
"role": "owner"
}
},
{
"no": 2,
"title": "개인 사용자 그룹 생성과 다른 사용자 초대",
"verdict": "verified_real",
"note": "",
"steps": [
{
"name": "팀 그룹 만들기 → 현재 그룹 전환",
"ok": true,
"detail": "g_01a1789f67b12a216acd1955fa"
},
{
"name": "이메일 초대 → 초대 메일(포획)에서 링크",
"ok": true,
"detail": "upaCVcL43bFzzZaGTtGZi_tU2J64oJEA"
},
{
"name": "초대 수락(1회용) → member · 재사용 거부",
"ok": true,
"detail": {
"reuse": "invite_invalid"
}
},
{
"name": "권한 없는 구성원의 변경 API → 403",
"ok": true,
"detail": {
"requiredRole": [
"owner",
"admin"
],
"yourRole": "member"
}
}
],
"evidence": null
},
{
"no": 3,
"title": "상품 주문, 결제 확인, 권리 활성화",
"verdict": "verified_real",
"note": "",
"steps": [
{
"name": "상품 목록(공개 버전·가격·한도)",
"ok": true,
"detail": {
"count": 2,
"id": "pv_01a178834fac072b5600ce1e60",
"name": "팀",
"price": 49000,
"sites": 3
}
},
{
"name": "주문 제출(수동 결제, 독립 메일 옵션 포함) → 결제 대기",
"ok": true,
"detail": {
"id": "o_01a1789f68c3298aec8ad337e8",
"group_id": "g_01a1789f67b12a216acd1955fa",
"order_no": "AW-20261026-0003",
"kind": "new",
"product_version_id": "pv_01a178834fac072b5600ce1e60",
"items_json": "[{\"type\":\"product\",\"id\":\"team\",\"name\":\"팀\",\"qty\":1,\"unit_price\":49000,\"amount\":49000,\"tax\":4900,\"target_type\":\"group\",\"target_id\":null,\"grants\":{\"sites\":3,\"web_disk\":21474836480,\"web_out\":214748364800,\"mail_storage\":21474836480,\"mail_msgs\":10000,\"mailboxes\":20}},{\"type\":\"option\",\"id\":\"standalone_mail\",\"name\":\"독립 메일 서비스\",\"qty\":1,\"unit_price\":9000,\"amount\":9000,\"tax\":900,\"target_type\":\"group\",\"target_id\":null,\"grants\":{\"mail_services\":1,\"mail_storage\":5368709120,\"mail_msgs\":3000,\"mailboxes\":5},\"policy\":null}]",
"target_type": "group",
"target_id": "g_01a1789f67b12a216acd1955fa",
"amount": 58000,
"tax": 5800,
"total": 63800,
"currency": "KRW",
"status": "awaiting_payment",
"payment_method": "manual_transfer",
"payment_instructions_json": "{\"method\":\"manual_transfer\",\"bank\":\"검증용 은행(예시)\",\"account\":\"000-0000-0000-00 (검증 환경 예시 계좌)\",\"holder\":\"Ariweb 검증 환경\",\"note\":\"입금자명에 주문 번호를 적어 주세요. 운영자가 입금을 확인한 뒤 승인하면 권리가 활성화됩니다.\",\"deadline_days\":7}",
"due_at": "2026-11-02T14:31:15.395Z",
"paid_at": null,
"paid_ref": null,
"approved_at": null,
"approved_by": null,
"rejected_at": null,
"rejected_reason": null,
"expired_at": null,
"cancelled_at": null,
"idempotency_key": "g_01a1789f67b12a216acd1955fa:real-mvpcu283",
"created_by": "u_01a1789f67540609561010fe91",
"created_at": "2026-10-26T14:31:15.395Z",
"updated_at": "2026-10-26T14:31:15.395Z",
"note": null,
"entitlement_ids_json": null,
"terms_json": "{\"acceptedAt\":\"2026-10-26T14:31:15.395Z\",\"productVersion\":\"pv_01a178834fac072b5600ce1e60\",\"terms\":\"v0.1.1\"}",
"subscription_id": null,
"items": [
{
"type": "product",
"id": "team",
"name": "팀",
"qty": 1,
"unit_price": 49000,
"amount": 49000,
"tax": 4900,
"target_type": "group",
"target_id": null,
"grants": {
"sites": 3,
"web_disk": 21474836480,
"web_out": 214748364800,
"mail_storage": 21474836480,
"mail_msgs": 10000,
"mailboxes": 20
}
},
{
"type": "option",
"id": "standalone_mail",
"name": "독립 메일 서비스",
"qty": 1,
"unit_price": 9000,
"amount": 9000,
"tax": 900,
"target_type": "group",
"target_id": null,
"grants": {
"mail_services": 1,
"mail_storage": 5368709120,
"mail_msgs": 3000,
"mailboxes": 5
},
"policy": null
}
],
"payment_instructions": {
"method": "manual_transfer",
"bank": "검증용 은행(예시)",
"account": "000-0000-0000-00 (검증 환경 예시 계좌)",
"holder": "Ariweb 검증 환경",
"note": "입금자명에 주문 번호를 적어 주세요. 운영자가 입금을 확인한 뒤 승인하면 권리가 활성화됩니다.",
"deadline_days": 7
},
"entitlement_ids": [],
"terms": {
"acceptedAt": "2026-10-26T14:31:15.395Z",
"productVersion": "pv_01a178834fac072b5600ce1e60",
"terms": "v0.1.1"
},
"statusLabel": "결제 대기",
"product": {
"id": "pv_01a178834fac072b5600ce1e60",
"name": "팀",
"version": 1,
"billingCycle": "monthly"
},
"nextStep": "안내된 계좌로 63,800 원 을 입금하세요. 운영자가 입금을 확인한 뒤 승인하면 권리가 활성화됩니다.",
"canCancel": true,
"lastCancellableStep": "운영자 승인 전까지",
"remaining": null,
"policyNotes": {
"paymentDeadlineDays": 7,
"restrictionAfterUnpaidDays": 14,
"restrictionEffect": "신규 배포·설정 변경·새 메일함 생성 제한(기존 서비스·조회·삭제·내보내기 유지)"
}
}
},
{
"name": "입금 확인 전 승인 거부(409)",
"ok": true,
"detail": "payment_not_confirmed"
},
{
"name": "운영자 입금 확인 → 승인 → 권리 활성화",
"ok": true,
"detail": {
"paid": "awaiting_approval",
"approved": "approved",
"granted": 10
}
},
{
"name": "고객 결제 화면: 활성 상품·권리·다음 청구일",
"ok": true,
"detail": {
"subs": 1,
"nextBilling": "2026-11-26T14:31:15.451Z"
}
}
],
"evidence": {
"orderNo": "AW-20261026-0003",
"bill": {
"subs": 1,
"nextBilling": "2026-11-26T14:31:15.451Z"
}
}
},
{
"no": 4,
"title": "초안 사이트 생성",
"verdict": "verified_real",
"note": "실제 Webmaker 에 프로젝트 생성(내부 API 서명 호출)",
"steps": [
{
"name": "사이트 생성(새 Webmaker 프로젝트 · 관리형) → 초안",
"ok": true,
"detail": {
"id": "s_01a1789f690cb9115f0330d2e8",
"group_id": "g_01a1789f67b12a216acd1955fa",
"name": "검증 사이트 mvpcu283",
"purpose": "실제 환경 검증",
"webmaker_project_id": "85e1859a8638022beb761f1ec4ccfc93",
"template": null,
"lang": "ko",
"timezone": "Asia/Seoul",
"lifecycle": "draft",
"deploy_mode": "managed",
"primary_domain": null,
"site_count_state": "none",
"site_count_reservation_id": null,
"server_id": null,
"external_agent_id": null,
"current_version": null,
"current_deployment_id": null,
"deploy_verify": null,
"health": "unknown",
"health_checked_at": null,
"maintenance": 0,
"search_visible": 1,
"description": null,
"settings_json": null,
"paused_at": null,
"cancel_at": null,
"retention_until": null,
"delete_after": null,
"deleted_at": null,
"created_by": "u_01a1789f67540609561010fe91",
"created_at": "2026-10-26T14:31:15.468Z",
"updated_at": "2026-10-26T14:31:15.519Z",
"runtime": "static",
"consent_version": null,
"pending_cleanup_json": null,
"return_due_at": null,
"last_deploy_at": null,
"last_external_check_json": null,
"next_job_json": null,
"mail_choice": null,
"next_notice_at": null,
"delete_hold_reason": null,
"public_stopped_at": null,
"prev_lifecycle": null,
"settings": {},
"pendingCleanup": null,
"lastExternalCheck": null,
"nextJob": null
}
},
{
"name": "초안 목록·사용량(사이트 수 미소비)",
"ok": true,
"detail": {
"drafts": 1,
"lifecycle": "draft",
"projectId": null
}
}
],
"evidence": null
},
{
"no": 5,
"title": "Webmaker에서 페이지 제작",
"verdict": "partial",
"note": "제작 화면 진입(SSO)은 실제 Webmaker 로 확인 · 페이지 제작(AI 생성·저장)은 사람이 Webmaker 화면에서 수행해야 하므로 미수행",
"steps": [
{
"name": "제작 화면 열기: 포털 SSO 티켓 → 실제 Webmaker /api/auth/sso 302(1회용)",
"ok": true,
"detail": {
"portal": 302,
"webmaker": 302,
"webmakerLocation": "/?site=85e1859a8638022beb761f1ec4ccfc93",
"reuse": 403
}
},
{
"name": "저장본 목록·배포 전 확인(실제 Webmaker 프로젝트)",
"ok": true,
"detail": {
"versionsStatus": 200,
"versions": 0,
"precheck": true
}
}
],
"evidence": {
"sso": {
"portal": 302,
"webmaker": 302,
"webmakerLocation": "/?site=85e1859a8638022beb761f1ec4ccfc93",
"reuse": 403
},
"ver": {
"versionsStatus": 200,
"versions": 0,
"precheck": true
}
}
},
{
"no": 6,
"title": "관리형 배포",
"verdict": "partial",
"note": "배포 요청이 거부됨: precheck_failed — 배포 전 확인에서 차단된 항목이 있습니다 (저장본이 없어 배포할 내용이 없음; 사람이 Webmaker 에서 페이지를 저장한 뒤 수행)",
"steps": [
{
"name": "배포 요청(관리형) → HAL 작업·사이트 수 예약",
"ok": true,
"detail": {
"status": 409,
"error": "precheck_failed",
"message": "배포 전 확인에서 차단된 항목이 있습니다"
}
}
],
"evidence": null
},
{
"no": 7,
"title": "도메인 연결과 HTTPS 발급",
"verdict": "not_verified",
"note": "실제 소유 도메인과 공개 DNS(TXT·A) 변경이 필요 — 이번 작업은 공개 DNS 를 바꾸지 않음",
"steps": [],
"evidence": null
},
{
"no": 8,
"title": "외부 주소에서 사이트 확인",
"verdict": "not_verified",
"note": "공개 DNS(my/hal/사이트 도메인) 생성 전 — 외부 주소 접속은 레코드 생성 뒤 확인",
"steps": [],
"evidence": null
},
{
"no": 9,
"title": "사이트 정보와 접속·사용량 통계 확인",
"verdict": "partial",
"note": "화면 데이터 제공 확인 · 실제 접속 통계(awstats 로그 집계)는 공개 DNS 로 외부 방문이 생긴 뒤 확인 가능",
"steps": [
{
"name": "사이트 정보·배포 이력·사용량 화면",
"ok": true,
"detail": {
"overviewKeys": [
"ok",
"overview",
"refreshJob"
],
"usageKeys": [
"ok",
"overview",
"allocations",
"samples"
],
"deployments": 0
}
}
],
"evidence": {
"overviewKeys": [
"ok",
"overview",
"refreshJob"
],
"usageKeys": [
"ok",
"overview",
"allocations",
"samples"
],
"deployments": 0
}
},
{
"no": 10,
"title": "사이트 대표 메일과 메일함 생성",
"verdict": "partial",
"note": "실제 AriMail 테넌트·메일함 생성 확인 · 활성화는 도메인 DNS(MX/SPF/DKIM) 반영이 필요해 외부 대기",
"steps": [
{
"name": "사이트 연결 도메인 등록(검증 전용 이름, 소유 확인은 외부 대기)",
"ok": true,
"detail": {
"id": "d_01a1789f6a07e57873e2f0c05f"
}
},
{
"name": "사이트 대표 메일 생성 → 실제 AriMail 테넌트 준비",
"ok": true,
"detail": {
"id": "msv_01a1789f6a0d5f702a1581f2fd",
"status": "needs_setup",
"kind": "site_bound"
}
},
{
"name": "메일함 생성(초기 비밀번호 1회 표시) → 재조회에 비밀번호 없음 · 실제 AriMail 계정",
"ok": true,
"detail": {
"id": "mb_01a1789f6e723ade68602baaf9",
"address": "kim@check-mvpcu283.ariweb.net",
"shownOnce": true,
"leakedOnReload": false
}
},
{
"name": "DNS 확인(미반영 구분) → 활성화 작업은 외부 대기",
"ok": true,
"detail": {
"dnsOk": true,
"items": [],
"activate": 200,
"job": "queued",
"waitReason": ""
}
}
],
"evidence": {
"d": {
"id": "d_01a1789f6a07e57873e2f0c05f"
},
"svc": {
"id": "msv_01a1789f6a0d5f702a1581f2fd",
"status": "needs_setup",
"kind": "site_bound"
},
"mb": {
"id": "mb_01a1789f6e723ade68602baaf9",
"address": "kim@check-mvpcu283.ariweb.net",
"shownOnce": true,
"leakedOnReload": false
},
"dns": {
"dnsOk": true,
"items": [],
"activate": 200,
"job": "queued",
"waitReason": ""
}
}
},
{
"no": 11,
"title": "외부 송신, 수신, 회신 확인",
"verdict": "not_verified",
"note": "검증용 수신 주소(자동 응답 메일함)와 고객 도메인 MX 반영 필요",
"steps": [],
"evidence": null
},
{
"no": 12,
"title": "독립 메일 서비스 생성",
"verdict": "verified_real",
"note": "",
"steps": [
{
"name": "메일 전용 도메인 등록(purpose mail)",
"ok": true,
"detail": "d_01a1789f6e94cf197bdcb0cb81"
},
{
"name": "독립 메일 서비스 생성(독립 옵션 소비·사이트 수 미소비)",
"ok": true,
"detail": {
"id": "msv_01a1789f6e9604bd5f49bb08e1",
"kind": "standalone",
"status": "needs_setup",
"usage": {}
}
}
],
"evidence": {
"id": "msv_01a1789f6e9604bd5f49bb08e1",
"kind": "standalone",
"status": "needs_setup",
"usage": {}
}
},
{
"no": 13,
"title": "백업 옵션 구매와 첫 백업 확인",
"verdict": "partial",
"note": "백업 옵션 주문·승인·활성화는 실제 확인. 수동 백업 실행은 사이트가 초안(미배포)이라 정기 실행기가 옵션을 site_not_deployed 로 중지해 Agent 백업까지 가지 않음(설계대로) — Webmaker 에서 페이지를 저장·배포한 뒤 다시 수행. 판정은 검증기의 시간 초과를 운영자가 DB 상태(옵션 paused: site_not_deployed)로 확인해 부분 확인으로 정정",
"steps": [
{
"name": "백업 옵션 주문(대상 사이트 지정) → 입금 확인 → 승인",
"ok": true,
"detail": {
"orderNo": "AW-20261026-0004",
"approved": "approved"
}
},
{
"name": "백업 화면(옵션 보유 여부)",
"ok": true,
"detail": {}
},
{
"name": "옵션 활성화(확인 필수) → 첫 백업 예정",
"ok": true,
"detail": {
"status": "active"
}
},
{
"name": "지금 백업 실행 → 실제 Agent 가 사이트 파일·데이터를 묶어 저장(완료 대기 120초)",
"ok": false,
"error": "백업 완료 대기 시간 초과"
}
],
"evidence": {
"optionState": {
"status": "paused",
"paused_reason": "site_not_deployed",
"updated_at": "2026-10-26T14:32:11.943Z"
},
"siteLifecycle": "draft",
"lastJob": {
"status": "failed",
"error": "대상 서버 또는 Agent 가 필요합니다"
}
}
},
{
"no": 14,
"title": "백업 복원과 외부 사이트 확인",
"verdict": "not_verified",
"note": "복원 승인(3단계)·외부 사이트 확인은 공개 DNS 와 복원 대상 배포본 필요(흐름 6 선행)",
"steps": [],
"evidence": null
},
{
"no": 15,
"title": "관리형 사이트 서버 이전과 외부 확인",
"verdict": "not_verified",
"note": "관리 서버가 1대뿐이라 서버 간 이전 미수행",
"steps": [],
"evidence": null
},
{
"no": 16,
"title": "외부 배포 사이트 생성과 배포",
"verdict": "not_verified",
"note": "외부 Linux 서버 없음",
"steps": [],
"evidence": null
},
{
"no": 17,
"title": "사용량 경고와 한도 동작 확인",
"verdict": "not_verified",
"note": "실제 사용량이 한도에 이르려면 운영 트래픽·시간 경과 필요",
"steps": [],
"evidence": null
},
{
"no": 18,
"title": "상품 축소 보류와 정리 후 적용",
"verdict": "not_verified",
"note": "축소 보류는 실제 사용 중 리소스가 필요(로컬 E2E 확인)",
"steps": [],
"evidence": null
},
{
"no": 19,
"title": "사이트 수 반환과 대표 메일의 독립 전환",
"verdict": "not_verified",
"note": "사이트 수 반환·독립 전환은 흐름 10 활성화(외부 DNS) 뒤 가능",
"steps": [],
"evidence": null
},
{
"no": 20,
"title": "사이트 소유권 이전",
"verdict": "not_verified",
"note": "두 번째 소유자 그룹의 심사 절차를 포함해 로컬 E2E 로 확인, 실환경 미수행",
"steps": [],
"evidence": null
},
{
"no": 21,
"title": "중지, 해지, 보존 예정일 표시",
"verdict": "not_verified",
"note": "보존 예정일 표시는 시간 경과 필요(로컬 E2E 확인)",
"steps": [],
"evidence": null
},
{
"no": 22,
"title": "HAL 우선 배포 후 HAL을 통한 전체 모듈 배포",
"verdict": "verified_real",
"note": "HAL 부트스트랩 → 첫 Agent → HAL 작업으로 portal·webmaker·arimail·agent 배포, 실제 버전 0.1.1·건강 ok",
"steps": [
{
"name": "HAL 릴리스·모듈 목표/실제 버전(배포 영수증)",
"ok": true,
"detail": {
"running": {
"complete": true,
"firstInstall": false,
"releaseVersion": "0.1.1",
"mainCommit": "3951be5836a753e60f11d6b363025059fcf6d448",
"artifactSha256": "e7741899cd7387b0155c9d3bf8ff14cc4026880db999c9d59347744390415e84",
"halRunningVersion": "0.1.1",
"firstAgent": "ag_01a178829f1c3d88381d2c0c75",
"manualInstallLocked": true
},
"targets": [
{
"module": "agent",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
},
{
"module": "arimail",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
},
{
"module": "backup",
"target": null,
"actual": "0.1.1",
"health": "ok"
},
{
"module": "hal",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
},
{
"module": "observability",
"target": null,
"actual": "0.1.1",
"health": "ok"
},
{
"module": "portal",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
},
{
"module": "webmaker",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
}
]
}
},
{
"name": "HAL 을 통한 모듈 배포 작업(module.deploy) 결과",
"ok": true,
"detail": [
{
"label": "portal 0.1.1 배포",
"status": "done"
},
{
"label": "hal 0.1.1 배포",
"status": "done"
},
{
"label": "portal 0.1.1 배포",
"status": "done"
},
{
"label": "portal 0.1.1 배포",
"status": "done"
},
{
"label": "agent 0.1.1 배포",
"status": "done"
},
{
"label": "arimail 0.1.1 배포",
"status": "done"
},
{
"label": "hal 0.1.1 배포",
"status": "done"
},
{
"label": "agent 0.1.1 배포",
"status": "done"
},
{
"label": "arimail 0.1.1 배포",
"status": "failed"
},
{
"label": "webmaker 0.1.1 배포",
"status": "done"
},
{
"label": "portal 0.1.1 배포",
"status": "done"
}
]
}
],
"evidence": {
"rel": {
"running": {
"complete": true,
"firstInstall": false,
"releaseVersion": "0.1.1",
"mainCommit": "3951be5836a753e60f11d6b363025059fcf6d448",
"artifactSha256": "e7741899cd7387b0155c9d3bf8ff14cc4026880db999c9d59347744390415e84",
"halRunningVersion": "0.1.1",
"firstAgent": "ag_01a178829f1c3d88381d2c0c75",
"manualInstallLocked": true
},
"targets": [
{
"module": "agent",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
},
{
"module": "arimail",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
},
{
"module": "backup",
"target": null,
"actual": "0.1.1",
"health": "ok"
},
{
"module": "hal",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
},
{
"module": "observability",
"target": null,
"actual": "0.1.1",
"health": "ok"
},
{
"module": "portal",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
},
{
"module": "webmaker",
"target": "0.1.1",
"actual": "0.1.1",
"health": "ok"
}
]
},
"jobs": [
{
"label": "portal 0.1.1 배포",
"status": "done"
},
{
"label": "hal 0.1.1 배포",
"status": "done"
},
{
"label": "portal 0.1.1 배포",
"status": "done"
},
{
"label": "portal 0.1.1 배포",
"status": "done"
},
{
"label": "agent 0.1.1 배포",
"status": "done"
},
{
"label": "arimail 0.1.1 배포",
"status": "done"
},
{
"label": "hal 0.1.1 배포",
"status": "done"
},
{
"label": "agent 0.1.1 배포",
"status": "done"
},
{
"label": "arimail 0.1.1 배포",
"status": "failed"
},
{
"label": "webmaker 0.1.1 배포",
"status": "done"
},
{
"label": "portal 0.1.1 배포",
"status": "done"
}
]
}
},
{
"no": 23,
"title": "실패 작업의 재시도와 되돌리기",
"verdict": "not_verified",
"note": "실패 작업 재시도·되돌리기는 배포 중 실제로 2회 발생(백업 실패→재시도 성공, 마이그레이션 실패→되돌리기) — 기록은 VERSION_HISTORY·이 문서의 배포 경과 참고",
"steps": [],
"evidence": null
},
{
"no": 24,
"title": "운영자 승인, 감사 기록, 고객 알림의 일치",
"verdict": "partial",
"note": "",
"steps": [
{
"name": "고객 감사 기록(order.approve) · 알림 · 운영자 주문 상태 일치",
"ok": true,
"detail": {
"auditEntries": 0,
"notifications": 6,
"status": "approved"
}
},
{
"name": "HAL 감사 기록(deploy.module)",
"ok": true,
"detail": 10
}
],
"evidence": {
"a": {
"auditEntries": 0,
"notifications": 6,
"status": "approved"
},
"halDeployAudit": 10
}
},
{
"no": 25,
"title": "HAL, 로그인, 비밀정보 관리, 인증서 기반의 재해복구 훈련",
"verdict": "not_verified",
"note": "재해복구 훈련은 다른 호스트 복원이 필요(로컬 E2E 부분 확인)",
"steps": [],
"evidence": null
},
{
"no": 26,
"title": "새로 고침, 재로그인, HAL 재시작 후 진행 작업 상태 유지",
"verdict": "verified_real",
"note": "",
"steps": [
{
"name": "HAL 재시작 전: 운영자 세션·작업 수·서버 등록",
"ok": true,
"detail": {
"jobs": 23,
"servers": 1
}
},
{
"name": "systemctl restart ariweb-hal → 건강 회복 → 같은 세션으로 작업 수·서버 유지",
"ok": true,
"detail": {
"uptimeSec": 1,
"sessionKept": true,
"jobs": 23,
"servers": 1,
"agentOnline": true
}
},
{
"name": "Agent 가 재접속(heartbeat) 해 서버 ready 유지",
"ok": true,
"detail": [
{
"name": "srv1953374 (ariweb.net)",
"status": "ready",
"lastSeen": "2026-10-26T14:33:13.381Z"
}
]
}
],
"evidence": {
"before": {
"jobs": 23,
"servers": 1
},
"after": {
"uptimeSec": 1,
"sessionKept": true,
"jobs": 23,
"servers": 1,
"agentOnline": true
},
"ag": [
{
"name": "srv1953374 (ariweb.net)",
"status": "ready",
"lastSeen": "2026-10-26T14:33:13.381Z"
}
]
}
},
{
"no": 27,
"title": "마지막 사이트 수·용량·메일함 동시 요청 시 하나만 성공",
"verdict": "not_verified",
"note": "동시 요청 경합은 로컬 E2E 로 확인, 실환경 미수행",
"steps": [],
"evidence": null
},
{
"no": 28,
"title": "외부 Linux 서버 Agent 연결·배포·재배포·제거·실패 정리",
"verdict": "not_verified",
"note": "외부 Linux 서버 없음",
"steps": [],
"evidence": null
},
{
"no": 29,
"title": "HAL 장애 중 기존 서비스 유지와 신규 변경 제한 표시",
"verdict": "not_verified",
"note": "HAL 장애 상태 표시는 로컬 E2E 로 확인(흐름 26 에서 재시작 중 복구만 실환경 확인)",
"steps": [],
"evidence": null
},
{
"no": 30,
"title": "모듈 업데이트, 일부 서버 실패, 대상별 되돌리기와 상태 조정",
"verdict": "partial",
"note": "모듈 갱신(수정 artifact 재등록 → HAL 작업으로 agent·hal 갱신) 4건 완료 확인 · 일부 서버 실패·대상별 되돌리기는 서버 1대뿐이라 미수행",
"steps": [],
"evidence": [
{
"label": "hal 0.1.1 배포",
"status": "done"
},
{
"label": "agent 0.1.1 배포",
"status": "done"
},
{
"label": "hal 0.1.1 배포",
"status": "done"
},
{
"label": "agent 0.1.1 배포",
"status": "done"
}
]
},
{
"no": 31,
"title": "긴급 복구의 승인 부족·만료 자격·허용 범위 밖 작업 거부와 정상 복구",
"verdict": "not_verified",
"note": "긴급 복구 절차는 로컬 E2E 로 확인",
"steps": [],
"evidence": null
},
{
"no": 32,
"title": "Source 옵션 만료 후 30일 read-only, clone·export와 삭제 완료",
"verdict": "not_verified",
"note": "Source 옵션 30일 만료는 시간 경과 필요",
"steps": [],
"evidence": null
},
{
"no": 33,
"title": "메일 서비스의 사이트 대표→독립 전환 후 항목 유지",
"verdict": "not_verified",
"note": "흐름 19 와 같은 외부 DNS 선행 조건",
"steps": [],
"evidence": null
},
{
"no": 34,
"title": "일시 중지·해지 예약·보존·삭제 단계의 표시 일치",
"verdict": "not_verified",
"note": "시간 경과 필요(로컬 E2E 확인)",
"steps": [],
"evidence": null
}
],
"bugs": [],
"test": {
"alice": "alice-mvpcu283@check.ariweb.net",
"site": "s_01a1789f690cb9115f0330d2e8",
"mailDomain": "check-mvpcu283.ariweb.net",
"order": "o_01a1789f68c3298aec8ad337e8"
}
}