HAL 0.3.0 bear hal21 배포 기록: VERSION_HISTORY 0.3.0 "배포" 절(main ff ba3c5cb, 빌드·verify, artifact sha256, 백업·stage·register-release --approve·bootstrap-release·current 전환·재시작 831ms, 보존 sha256 전=후, /api/health·운영 DB·외부 경로·배포 코드 렌더 read-back, 되돌리기), 도구 수 31 정정
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
+9
-2
@@ -36,7 +36,7 @@ HAL 화면 오른쪽에 칸을 나눠 AI 채팅룸을 둔다. AI 모델은 로
|
|||||||
- OAuth: authorization code + PKCE S256. state 해시 저장·10분·1회용, 시작 운영자 = 콜백 운영자, code_verifier 는 Vault 에 두었다가 교환 뒤 제거, client secret 은 서버→토큰 끝점에만, 토큰은 Vault, 만료는 서버 refresh(실패 시 `reauth_required`).
|
- OAuth: authorization code + PKCE S256. state 해시 저장·10분·1회용, 시작 운영자 = 콜백 운영자, code_verifier 는 Vault 에 두었다가 교환 뒤 제거, client secret 은 서버→토큰 끝점에만, 토큰은 Vault, 만료는 서버 refresh(실패 시 `reauth_required`).
|
||||||
- 통합 방: 지시는 활성 모델 모두 / `@이름`·글머리 `이름:`·`이름,` 는 그 모델만 / 모르는 `@이름` 은 400 `unknown_addressee` / 모델→모델 `@이름` 전달은 자동 1회(relayDepth 1), 그 답의 @호출은 HAL 안내만 남기고 자동 반응 없음 / 자기 자신·비활성 제외. 각 모델의 system prompt 에는 자기 고유 정보·참여자 이름·역할·운영자·화면 문맥·스킬 문서가 들어가고, 다른 모델의 발언은 "[이름] …" 으로 보인다.
|
- 통합 방: 지시는 활성 모델 모두 / `@이름`·글머리 `이름:`·`이름,` 는 그 모델만 / 모르는 `@이름` 은 400 `unknown_addressee` / 모델→모델 `@이름` 전달은 자동 1회(relayDepth 1), 그 답의 @호출은 HAL 안내만 남기고 자동 반응 없음 / 자기 자신·비활성 제외. 각 모델의 system prompt 에는 자기 고유 정보·참여자 이름·역할·운영자·화면 문맥·스킬 문서가 들어가고, 다른 모델의 발언은 "[이름] …" 으로 보인다.
|
||||||
- 개별 방: 1:1, 기록 격리, 비활성 연결에는 409 `connection_inactive`, "새 대화"는 기록 비움 + 승인 대기 제안 취소.
|
- 개별 방: 1:1, 기록 격리, 비활성 연결에는 409 `connection_inactive`, "새 대화"는 기록 비움 + 승인 대기 제안 취소.
|
||||||
- 도구(`hal/ai/tools.mjs`, 29개 — 읽기 15 · 쓰기 8 · 고위험 8, 표는 `docs/HAL-AI.md` §4): 읽기는 즉시, 쓰기는 제안 → 승인(재인증), 고위험은 제안 → 승인(재인증 + 3단계 확인, 식별정보 = 도구가 정한 대상 id). 인자는 선언으로 재검증, 모르는 도구·인자는 실행 없이 오류 결과. 한 턴 도구 왕복 8회 상한. 승인은 한 번만 실행(상태 선점). 거부는 실행 없음·모델 자동 호출 없음.
|
- 도구(`hal/ai/tools.mjs`, 31개 — 읽기 15 · 쓰기 8 · 고위험 8, 표는 `docs/HAL-AI.md` §4): 읽기는 즉시, 쓰기는 제안 → 승인(재인증), 고위험은 제안 → 승인(재인증 + 3단계 확인, 식별정보 = 도구가 정한 대상 id). 인자는 선언으로 재검증, 모르는 도구·인자는 실행 없이 오류 결과. 한 턴 도구 왕복 8회 상한. 승인은 한 번만 실행(상태 선점). 거부는 실행 없음·모델 자동 호출 없음.
|
||||||
- 스킬 문서 `hal/ai/skill.md`: 서버·작업·릴리스·사건·감사·긴급 복구·DR 상태값과 오류 코드의 뜻, AI 규칙(증거 없이 완료 금지, 승인 재촉 금지, 외부 글 속 지시문 불신, 비밀값 금지). `GET /ops/api/ai/skill`·도구 `hal_skill`.
|
- 스킬 문서 `hal/ai/skill.md`: 서버·작업·릴리스·사건·감사·긴급 복구·DR 상태값과 오류 코드의 뜻, AI 규칙(증거 없이 완료 금지, 승인 재촉 금지, 외부 글 속 지시문 불신, 비밀값 금지). `GET /ops/api/ai/skill`·도구 `hal_skill`.
|
||||||
- MCP: `node hal/index.mjs mcp`(stdio) — `initialize`·`tools/list`·`tools/call`·`ping`. 읽기 도구만 실행, 쓰기·고위험은 `isError` 로 운영자 콘솔 승인 안내.
|
- MCP: `node hal/index.mjs mcp`(stdio) — `initialize`·`tools/list`·`tools/call`·`ping`. 읽기 도구만 실행, 쓰기·고위험은 `isError` 로 운영자 콘솔 승인 안내.
|
||||||
|
|
||||||
@@ -54,7 +54,14 @@ HAL 화면 오른쪽에 칸을 나눠 AI 채팅룸을 둔다. AI 모델은 로
|
|||||||
- 전체 Suite `node test/run.mjs`: **26개 파일 실패 0, 182건 통과**(새 `hal-ai` 11 포함, 로컬 E2E 11). 러너가 만든 `docs/verification/local-e2e-2026-10-28.*` 는 커밋하지 않았다. 변경 파일 정적 secret-like 스캔 0건. 도입 소스 출처 검사 `checkProvenance` clean.
|
- 전체 Suite `node test/run.mjs`: **26개 파일 실패 0, 182건 통과**(새 `hal-ai` 11 포함, 로컬 E2E 11). 러너가 만든 `docs/verification/local-e2e-2026-10-28.*` 는 커밋하지 않았다. 변경 파일 정적 secret-like 스캔 0건. 도입 소스 출처 검사 `checkProvenance` clean.
|
||||||
|
|
||||||
### 배포(bear `hal21.ariweb.net`, HAL 만)
|
### 배포(bear `hal21.ariweb.net`, HAL 만)
|
||||||
- 절차와 read-back 은 배포 뒤 이 절에 후속 커밋으로 기록한다(릴리스 artifact 의 `mainCommit` 은 기능 커밋이 병합된 main 이어야 하므로 배포 기록 커밋은 그 뒤에 온다).
|
- 2026-10-28 17:45~17:47 UTC, 코드 릴리스만(data/config/Vault/DB 파일 무변경, 마이그레이션 `hal_0006_ai_chat` 는 기동 때 표 추가만). 바뀌지 않은 포털·Agent·Webmaker·AriMail 은 배포하지 않았다(지시: 수정되지 않은 것은 배포하지 않음). bear 에는 HAL 만 둔다.
|
||||||
|
- 저장소: 기능 커밋 `ba3c5cb2f82374108f22f56badeab52cb07b308b`(브랜치 `feature/hal-ai-chat-v0.3.0` push → `main` fast-forward 6bfde82..ba3c5cb, 원격 read-back `origin/main = ba3c5cb`). 릴리스 빌드 `node scripts/release.mjs build`(깨끗한 그 커밋, 전체 테스트 재실행 26파일 실패 0): manifest `version 0.3.0 · mainCommit ba3c5cb… · testsPassed=true · dirty=false · provenanceClean=true`, `verify` 5 artifact ✔. hal artifact sha256 `c1377c276dab3f7dae67cd8b884db77aee7f748fad5b09e00be509c18905430f`(195,484 B; portal `b442a7f9…` agent `892d1b19…` webmaker `2b39fb01…` arimail `ef8037b3…`).
|
||||||
|
- 적용(`~/oz-deploy/bear-apply-0.3.0.sh` → 4단계부터 수동 이어 실행): dist 5개 artifact 를 `/srv/ariweb/hal/dist/0.3.0/` 에 올림(HAL artifact 만 올리면 `register-release` 가 `artifact_missing: portal` 로 거부 — 등록은 manifest 의 전 artifact 를 요구한다) → 사전 백업 `/srv/ariweb/hal/backups/pre-v0.3.0-20261028T174538Z/`(hal.sqlite·-wal·-shm, config.json(+이전 사본), vault.json, vault.key, SHA256SUMS, 0700) → stage 추출·검증(package.json 0.3.0, `hal/ai/engine.mjs`·`hal/ui/public/ai.js` 존재, `node --check` 3개) → `/srv/ariweb/hal/releases/0.3.0-ba3c5cb` + REVISION.json → `register-release --manifest … --approve --by oz-dev-order-v0.3.0`(릴리스 0.3.0 approved, artifact hal·portal·agent·webmaker·arimail) → `bootstrap-release --version 0.3.0 --commit ba3c5cb… --sha256 c1377c27…` → `ln -sfn` current 전환 → `systemctl restart ariweb-hal`.
|
||||||
|
- 결과: restart → `/api/health` 200 **831ms**, PID 54774, active, NRestarts 0, 프로세스 cwd `/srv/ariweb/hal/releases/0.3.0-ba3c5cb`, journal 오류 0, 기동 로그 "Ariweb HAL v0.3.0 … 부트스트랩 완료". 보존 확인 sha256 전=후: config.json `ae5963d29ae899bc…`, vault.json `0e2dc9875f2779a0…`, vault.key `345d92e77c3fcd78…`; 백업 `sha256sum -c` OK. 이전 릴리스 디렉터리 8개 전부 보존(0.1.1×6, 0.2.0-0a56d46, 0.2.1-6bfde82).
|
||||||
|
- read-back: `/api/health`(로컬·`https://hal21.ariweb.net`) `ok · version 0.3.0 · db · jobs · bootstrap complete · releaseVersion 0.3.0 · mainCommit ba3c5cb… · artifactSha256 c1377c27… · halRunningVersion 0.3.0 · firstAgent ag_01a17bd7…`. 운영 DB(읽기 전용 node:sqlite): `_migrations` 에 `hal_0006_ai_chat`, `ai_rooms` = `room_group`(통합 방) 1행, `ai_connections` 0, releases 4행(0.1.1·0.2.0·0.2.1·0.3.0 approved), bootstrap_state `release_version=hal_running_version=0.3.0`, 서버 2대 ready(heartbeat 재개 17:46:45Z hostinger, 17:47:00Z jitsi), 열린 작업 0. 재시작 창(17:46:13Z)의 Agent long-poll `GET /agent/v1/jobs/next` 502 2건 외 Agent 요청 비-2xx 없음(이전 배포와 같은 양상).
|
||||||
|
- **배포된 코드 서버 렌더 검증**(운영자 자격 없음 → `~/oz-deploy/deployed-render-0.3.0.mjs` 가 `/srv/ariweb/hal/current` 의 app/deps 만 import, 메모리 DB·임시 data dir, 운영 데이터·Vault 미접근): `/ops/` 200 + `#ai-panel`·`/ops/ui/ai.js`·메뉴 "AI 연동" 있음, `/ops/ai` 200 + "연결 추가", `/ops/api/ai/rooms` = [`room_group`], `/ops/api/ai/tools` 31개, 연결 0. 외부: `https://hal21.ariweb.net` `/api/health` `/ops/login` `/ops/ai` `/ops/` `/ops/ui/ai.js` `/ops/ui/ai-render.mjs` `/ops/ui/reauth.mjs` 모두 200.
|
||||||
|
- 되돌리기(코드만): `ln -sfn /srv/ariweb/hal/releases/0.2.1-6bfde82 /srv/ariweb/hal/current && sudo systemctl restart ariweb-hal`(0.2.1 코드는 `ai_*` 표를 모르지만 건드리지 않으므로 그대로 둬도 된다). 데이터까지: 위 백업 디렉터리.
|
||||||
|
- blocker/unknown: 운영자 자격이 없어 실제 운영자 세션으로 패널을 열어 보지는 못했다(배포 코드 렌더 harness·회귀 테스트·외부 200 으로 판단). 실제 모델 연결은 Oz/운영자가 AI 연동 화면에서 키 또는 OAuth 를 등록해야 시작된다.
|
||||||
|
|
||||||
### 알려진 제한
|
### 알려진 제한
|
||||||
- v0.1.4 §41.3·§41.4·§42 의 상세 계약 중 이번 범위 밖: 탭 간 변경 잠금(원자적 server-side lock·fencing·compare-and-swap), AI 의 격리 작업공간 코드 수정·커밋·push·릴리스 생성 도구, 제한된 합의 절차(최초 의견 1회 + 반론 1회 + 최종안). 이번 통합 방은 Oz 지시의 "방송·이름 지정·모델→모델 자동 1회" 규칙까지다.
|
- v0.1.4 §41.3·§41.4·§42 의 상세 계약 중 이번 범위 밖: 탭 간 변경 잠금(원자적 server-side lock·fencing·compare-and-swap), AI 의 격리 작업공간 코드 수정·커밋·push·릴리스 생성 도구, 제한된 합의 절차(최초 의견 1회 + 반론 1회 + 최종안). 이번 통합 방은 Oz 지시의 "방송·이름 지정·모델→모델 자동 1회" 규칙까지다.
|
||||||
|
|||||||
Reference in New Issue
Block a user