# Changelog — Techgon Octopus

## v1.95 — 2026-06-17
**Vệ sinh git: chốt an toàn toàn bộ công việc (41 file → commit).**
- Commit 2ddddfc trên spider2/cgp-audit: lưu UI/perf v1.86-1.94 + route_engine + assess_effort + resilience + nền CGP (request_gate, tool_runner, oqs, docs, tests). Trước đó nhiều file lõi (system-model.md, context-index-map.json, operating-doctrine.json) còn untracked → đã track hết.
- `.gitignore` thêm `.codex-snapshots/` + `.last-deploy`. KHÔNG secret/env nào bị commit (kiểm tra trước). 0 file chưa lưu còn lại.
- Ghi vào audit (v1.95) + System Model. Không đổi flow lõi · dev-check 82/0.


## v1.94 — 2026-06-17
**Rà soát toàn hệ thống + cập nhật audit/system.**
- Audit (docs/audit.html): thêm mốc v1.92 (tối ưu hiệu năng web) + v1.93 (2 mode Spider, engine auto-routing, Deepseek).
- System Model live: Model Router flag mô tả thêm assess_effort (phán đoán mức/lượt) + route_engine (Spider 2 tự chọn engine); thêm 2 flag `engine_auto_routing`, `per_turn_effort` (hiện trạng thái codex/deepseek ready trung thực).
- Rà soát: services active (web/bridge/loop), dev-check 82/0, API 200, JSON/JS hợp lệ, daemon self-improve cycle 100 lành, KHÔNG lỗi runtime. Ghi nhận: 41 file chưa commit trên nhánh spider2/cgp-audit (vệ sinh git, không phải bug).


## v1.93 — 2026-06-17
**Chỉ 2 mode Spider 1/2 + Spider 2 TỰ điều hướng engine (Codex/Claude/Deepseek).**
- UI: selector chỉ còn **Spider 1** và **Spider 2** (tên gọn, bỏ "beat"). Engine thêm **"Tự động · Spider chọn"** (mặc định) + **Deepseek** (disable khi chưa có API key).
- Server `route_engine()`: engine='auto' → Spider PHÂN TÍCH việc rồi chọn engine TRƯỚC khi đưa cho AI — việc CODE/PATCH (sửa/viết/refactor/debug…) → **Codex**; câu hỏi/suy luận/giải thích/kiến trúc → **Claude**; (Deepseek cho code dễ/vừa khi đã kết nối). Spider 1 → Claude gọn. Fallback an toàn nếu engine chưa kết nối.
- Deepseek: thêm vào engines_map + `deepseek_ready()` (cần DEEPSEEK_API_KEY) — trạng thái TRUNG THỰC (not_connected khi chưa key), không fake.
- Parity cloud: `octopus-bridge.py` + `norm_engine` (PHP) chấp nhận 'auto' → cloud cũng tự điều hướng engine. dev-check 82/0, JS OK.


## v1.92 — 2026-06-17
**Tối ưu hiệu năng + dọn code web (KHÔNG đổi bố cục/chức năng).**
- `content-visibility:auto` + `contain-intrinsic-size` cho `.msg` → trình duyệt BỎ render tin ngoài màn hình → cuộn mượt + mở chat dài nhanh.
- Bỏ `will-change` blanket trên `.bubble/.sess/.card/.btn/.msg` (giữ layer GPU vĩnh viễn cho hàng trăm phần tử → tốn bộ nhớ, dễ giật) — chỉ giữ trên container thật sự trượt.
- Bỏ `scroll-behavior:smooth` ở `#log` → cuộn-xuống-đáy TỨC THÌ (đổi tab snappy, không animate chậm). Tin batch (loadConv) thêm `.nofx` → hiện ngay, không repaint storm.
- `defer` Bootstrap JS (không chặn render lần đầu) + ảnh `loading=lazy decoding=async`. dev-check 82/0, JS OK. Bố cục & chức năng giữ nguyên.


## v1.91 — 2026-06-17
**Phán đoán MỨC xử lý mỗi lượt chat (effort theo độ khó thật).**
- `assess_chat_difficulty` (tất định) → low/medium/high/max theo câu hỏi: chào/định nghĩa→low (trả lời gọn, không lan man); sửa lỗi/viết code/phân tích→high (đủ sâu); kiến trúc/bảo mật/đa luồng/migration→max; "tiếp/làm đi"→medium.
- `assess_effort` KẸP theo Spider×engine×model: Spider 1 tối đa medium; Spider 2 tới high/xhigh/max (opus), tới high (sonnet/codex). Khi effort=auto, chat dùng mức này thay vì cố định.
- Tiêm hướng dẫn độ-sâu/độ-dài vào prompt (dễ→gọn, khó→đầy đủ) → không nói lung tung & không under-think. Hiện mức ở route tag (·eff=…). dev-check 82/0.


## v1.90 — 2026-06-17
**Diệt độ trễ chuyển tab: prefetch khi hover/chạm (như trang lớn).**
- `prefetchConv`: rê chuột (hover-intent 70ms) hoặc pointerdown (bắt đầu chạm/nhấn) → nạp SẴN cuộc vào cache TRƯỚC khi click → mở TỨC THÌ, không chờ mạng.
- Cache cap ~24 cuộc gần nhất; invalidate khi gửi tin mới (revisit không thiếu lượt). dev-check 82/0, JS OK.


## v1.89 — 2026-06-17
**Chuyển tab chat MƯỢT (hết giật) — render off-DOM + fade + cache như trang lớn.**
- renderConv: dựng toàn bộ tin vào DocumentFragment rồi `replaceChildren` 1 LẦN → 1 reflow/paint thay vì N (hết giật do append+đọc-layout từng tin).
- Fade-in .15s khi swap (mượt, không nháy nội dung trống) + fallback setTimeout đảm bảo luôn hiện.
- Cache stale-while-revalidate: mở lại cuộc đã xem TỨC THÌ từ cache, refresh ngầm; data không đổi thì không vẽ lại (không nháy). dev-check 82/0, JS OK.


## v1.88 — 2026-06-17
**Tăng tốc chuyển tab chat (loadConv).**
- Fetch SONG SONG session + live-status (trước tuần tự) → bớt 1 vòng chờ mạng.
- Render BATCH: thêm `bubble(...,batch=true)` bỏ scroll/hideWelcome mỗi tin → tránh layout-thrash (đọc layout đồng bộ N lần); hideWelcome + scrollToBottom chỉ 1 LẦN sau khi render hết.
- Chat hiện nhanh hơn rõ khi đổi tab, nhất là cuộc dài. dev-check 82/0, JS OK.


## v1.87 — 2026-06-17
**Sửa lỗi click tab chat KHÔNG mở chat (loadConv nuốt lỗi im lặng).**
- loadConv trước đây `try{...}catch(_){}` → bất kỳ throw nội bộ (render tin / call phụ trợ mode/history) làm chat KHÔNG mở mà KHÔNG báo lỗi.
- Fix: render từng tin có try/catch (1 tin lỗi không chặn cả chat); tách phần phụ trợ (mode/history/live) ra try riêng để CHAT VẪN MỞ dù phụ trợ lỗi; catch ngoài nay `console.error` (lộ lỗi để debug, không nuốt). dev-check 82/0, JS OK.


## v1.86 — 2026-06-17
**Sửa mô tả Chức năng/Định tuyến theo ĐÚNG từng Spider.**
- spider_profile functions nay PER-SPIDER (card lọc theo `f.spiders`): Spider 1.0 = `Model Router trần Thấp/Trung bình` + `Chỉ 1 phiên · 1 lượt (KHÔNG Team/Loop)`; Spider 2.0 = `Model Router Thấp→Cao (xhigh/max cần gate, ghi evidence)` + `Team Mode` + `Loop Mode`.
- Nhãn "· luôn bật" chỉ hiện khi locked AND on (Team/Loop là tuỳ chọn, không hiện luôn-bật sai).
- Đồng bộ với logic chat đã có (Spider 1 ép tắt Team/Loop/Gate). dev-check 82/0, JS OK (handler new-chat/loadConv test không throw).


## v1.85 — 2026-06-17
**Trạng thái động THÔNG MINH + spinner nhanh + caret chờ nháy nhanh.**
- Pill live hiện rõ ĐANG làm gì VỚI gì: `✏️ Sửa tệp · <file>` · `📄 Đọc tệp · <file>` · `⚡ Chạy lệnh · <cmd>` · `🔎 Tìm trong mã · <mẫu>` · `🌐 Đọc trang web` · `💭 Đang suy nghĩ` · `✍️ Đang trả lời` · `➕ Đang bổ sung` (icon + tên mục tiêu ngắn).
- Spinner pill quay NHANH (.6s→.38s) cho cảm giác đang chạy. Caret `|` nháy NHANH (1s→.6s) và hiện CẢ lúc đang chờ (suy nghĩ/chờ đọc-sửa xong) để biết AI đang làm/chờ.
- Kèm typewriter (v1.84): chữ chạy mượt từng ký tự. dev-check 82/0, JS OK.


## v1.84 — 2026-06-17
**Hiệu ứng gõ chữ MƯỢT (typewriter) + tab gốc tự bám lại live (không còn "Đã dừng" giả).**
- streamView: lộ dần TỪNG KÝ TỰ (`shown` bắt kịp `acc` mượt, nhanh hơn khi tụt nhiều) + caret nháy — thay vì hiện cả khối giật. Replay/poll/reattach hiện ngay (không gõ lại). Throttle markdown 16fps cho câu >4000 ký tự.
- Kết hợp v1.83: kết nối/proxy cắt → tab gốc TỰ nối lại + tiếp tục livestream (hiện "Đang suy nghĩ/Đọc/Sửa tệp · …s · ↓ tokens") thay vì "Đã dừng"; chỉ "Đã dừng" khi user bấm Dừng.
- dev-check 82/0, JS OK.


## v1.83 — 2026-06-17
**Hết "■ Đã dừng" GIẢ — chỉ dừng khi USER thật sự bấm Dừng.**
- Lỗi: kết nối/proxy cắt SSE giữa chừng → AbortError → bị coi là "Đã dừng" dù backend còn chạy (vẫn phản hồi nhưng badge báo dừng → mất trải nghiệm livestream).
- Fix: thêm mốc `_userStopTs` (chỉ set khi bấm Dừng). AbortError trong realSend/resumeInPlace/attachLive: chỉ "Đã dừng" nếu user bấm Dừng ≤4s trước; ngược lại coi là đứt kết nối → NỐI TIẾP (resumeInPlace), không bỏ cuộc. Reset mốc mỗi lượt gửi mới.
- Kết hợp v1.81/82: mất kết nối/restart/proxy-cut đều tự nối lại + làm tiếp. dev-check 82/0, JS OK.


## v1.82 — 2026-06-17
**No-quit phủ NỐT đường cloud poll (hoàn chỉnh cả 2 transport).**
- Rà soát v1.81: phát hiện auto-reconnect mới phủ đường SSE (admin); đường cloud `pollSend` vẫn bỏ cuộc khi 1 lần fetch lỗi.
- Vá `pollSend`: POST tạo job thử lại tới khi gửi được; vòng poll bọc try/catch từng lần — lỗi tạm thời KHÔNG giết lượt, kiên trì chờ (job >180s host re-claim + bridge chạy lại tới khi xong). Hết vòng → GIỮ phần đã làm, không báo cụt giả. dev-check 82/0, JS OK.


## v1.81 — 2026-06-17
**KHÔNG BỎ CUỘC GIỮA CHỪNG — chat tự nối lại + làm tiếp tới cùng (resilience).**
- **Luật cứng (core_rules):** gián đoạn/mất kết nối/server restart KHÔNG phải trạng thái kết thúc; cấm báo "đã dừng/gián đoạn" rồi thôi. Phải tự nối lại và LÀM TIẾP tới khi xong (Done/Partial/Blocked/Rolled-back có evidence).
- **Runtime (chat-ui.html):** `waitServerBack` (spinner "⟳ đang kết nối lại…" poll /api/status tới khi "✓ đã kết nối lại", tới 180s) + `autoResumeAfterRestart` (hub mất do restart → tự gửi lại yêu cầu dở, làm tiếp, không hỏi lại). Wire vào `resumeInPlace` + `attachLive`; bỏ giới hạn "8 lần rồi thôi" → kiên trì có cap an toàn 40.
- **System Model:** `resilience.no_quit_midway/chat_auto_reconnect/chat_continue_to_completion = enforced`; roadmap "Self-healing Runtime · No-quit". dev-check **82/0**. JS syntax OK.


## v1.80 — 2026-06-17
**Rà soát: chat mặc định kèm System Model + Spider + lịch sử trên CẢ 2 đường.**
- Xác minh đường admin /api/chat: mỗi lượt mặc định = Core Kernel (System Model anchor) + persona + Spider identity + Active Summary + recent_window; Full System Model KHÔNG mặc định. Summary loop test thật trên chat 106-msg → tự rút active_goal+decisions.
- **Vá đường cloud-bridge:** `octopus-bridge.py` thêm `SYSTEM_PREAMBLE` (Core Kernel + Spider 2.0, ~157 tok) cho Codex (luôn) + Claude (mỗi lượt) → "system model + spider đi kèm chat" giờ đúng trên cả cloud, không còn chỉ history trơ.
- **Trung thực:** cloud-bridge active_summary VẪN partial (cần host cấp summary kèm job) — đã ghi rõ trong `context_runtime.enforcement_scope`. dev-check **80/0**.

## v1.79 — 2026-06-17
**Rà soát + rút gọn + đồng bộ System Model (bỏ trùng, sửa mâu thuẫn trạng thái, trung thực).**
- **Model Router gộp gọn:** 5 cờ (model_router + claude_reasoning + codex_patch + router_evidence + router_cost) → **1 mục "Model Router · luôn bật"** (feature flags + Spider profile). Chi tiết nằm trong 1 mô tả, không tách tên thừa.
- **Sửa mâu thuẫn roadmap:** Cost/Token Optimizer `OFF/spider-3` → **PARTIAL/spider-2** (đã có policy+index-map, chưa đo token runtime). Dialogue-driven Coding → **Chat Context Index · PARTIAL/spider-2/P0**.
- **Tách Learning:** `chat_autolearning=off` (chống rác) **≠** `spider_evolution_learning=partial_governed` (Lesson Candidate+evidence→Human Review→Benchmark→Stable, KHÔNG xoá hệ học Spider). Roadmap tách 2 cap riêng.
- **Runtime Enforcement Status (mới):** `context_runtime.enforcement` liệt kê trung thực enforced/partial/enforced_disabled cho System Model Anchor · Context Index Map · Context Resolver · Prompt Builder · Conversation Anchor · Chat Context Index (partial) · Active Summary · Evidence Metadata · full_system_model_default_load · raw_chat_full_load_default. + System Model Anchor status (version/hash/full_default=false/last_validated_at).
- **Runtime trung thực:** thêm `runtime_truth` — self_heal=policy on NHƯNG worker/scheduler **stopped**, autonomous_loop **not_running** (không đánh đồng policy với đang chạy). UI hiện rõ.
- **Core Rules gọn:** operating-doctrine 12 Core Rules bất biến + **6 Operating Policies** (Context Index Map · Token Usage · Learning Gate · Model Router · Chat Context · System Model Anchor) tách riêng.
- Sơ đồ vận hành cập nhật (Conversation Resolver → Context Index Map → System Model Anchor/Core Kernel → Spider/Router → …). dev-check **80/0 PASS**.

## v1.78 — 2026-06-17
**System Model Anchor — neo MẶC ĐỊNH ở runtime (không đọc lại full model mỗi phản hồi).**
- **System Model = neo mặc định, KHÔNG phải payload mặc định.** `build_system_model_anchor()` cache lúc khởi động (version/hash + Core Kernel + cờ chính sách). Prompt chat MẶC ĐỊNH chỉ chèn **Core Kernel** ngắn (~130 tok) thay vì đọc lại `system-model.md` mỗi lượt.
- **Request Resolver hợp nhất:** `resolve_request()` mỗi request → `{system_model_anchor(full_loaded) · context_index_map(selected_layers) · conversation_anchor(intent,confidence) · reasoning_policy(full_required,reason) · risk_tier · human_gate}`. **Full System Model chỉ nạp khi** core/release/spider/security/governance/system-model hoặc escalation (mặc định `full_loaded=false`).
- **Prompt Builder theo tầng:** Core Kernel + persona + spider_note + active_summary + recent_window — KHÔNG full model. Wire vào /api/chat (Claude + Codex).
- **Evidence runtime THẬT:** lưu quyết định resolver gần nhất per-chat; API `/api/system-model-anchor`, `/api/request-resolve`, `/api/context-status` → trả lời được "bạn đang neo theo System Model nào / đã qua Index Map chưa". `/api/status` + `/api/system-model.context_runtime` có anchor + trạng thái **enforced/partial trung thực** (không khoe docs).
- **Test:** smoke +2 (task nhỏ `full_loaded=false`; sửa-lõi `=true`). dev-check **80/0 PASS**.
- Docs: system-model.md §15 + câu chốt · context-index-map.json `system_model_anchor` · operating-doctrine +1 rule.

## v1.77 — 2026-06-17
**Active Summary — chat NHỚ ý chính cả cuộc, hiểu đúng ý thay vì "hỏi gì đáp nấy".**
- Mỗi lượt: `summarize_chat()` (model RẺ haiku, chạy NỀN sau khi trả lời → 0 thêm độ trễ) chắt **ý chính** cuộc hội thoại thành JSON `{active_goal, decisions, constraints, pending, key_terms}`, lưu vào chat file (gộp dần theo delta, chỉ chạy khi có ≥2 lượt mới → tiết kiệm). Redact secret/token/key trước khi lưu.
- Mỗi lượt sau: chèn `chat_summary_block()` (compact ~150 tok) vào prompt (Codex luôn; Claude khi không resume) → engine NEO theo mục tiêu/đã-chốt/ràng-buộc/đang-chờ → hiểu cả mạch, không hỏi lại cái đã chốt.
- Decision Ledger + Pending Stack + Constraints nay là dữ liệu THẬT trong summary (không còn chỉ schema). Evidence: nhãn `intent·ctx·sum·confidence` trên bảng 🛰.
- Lean: input tóm tắt bounded (summary cũ + 8 lượt gần), haiku, async; best-effort tuyệt đối (lỗi → giữ summary cũ, không phá chat). dev-check **78/0 PASS**.

## v1.76 — 2026-06-17
**Sửa REGRESSION amnesia chat + Gated Auto-Deploy (phiên tương tác).**
- **Sửa lỗi gốc (do v1.75 gây ra):** gating "index đúng chỗ" QUÁ tay — câu hỏi tham chiếu ("nãy giờ cập nhật gì", "vẫn chưa hiểu deploy cái gì") bị phân loại `new_task` → **BỎ lịch sử** → chat amnesiac. Nay **LUÔN** đưa cửa sổ hội thoại gần đây (bounded) vào prompt (server.py /api/chat + octopus-bridge.py); "đỡ token" nằm ở chỗ KHÔNG nạp full log/system-map/L3-L4 (vốn đã không nạp), KHÔNG phải cắt cửa sổ gần đây. `conversation_resolver` chỉ còn dùng cho nhãn evidence.
- **Gated Auto-Deploy:** `scripts/octopus-deploy.sh` — deploy CÓ CỔNG: no-regression (dev-check) → [secret-scan nếu có] → build → publish (không --delete, giữ rollback) → stamp; FAIL gate = KHÔNG publish; bỏ qua nếu working tree không đổi; **CHẶN nhánh `auto/self-improve`** (daemon giữ human-gate). Nối vào closed-loop `octopus-auto.sh`: chạy khi `OCTOPUS_AUTO_DEPLOY=1` + task không failed (phiên tương tác); daemon tự-cải-tiến KHÔNG bật cờ → không tự publish.
- An toàn nguyên vẹn (Release Governance §12 vẫn human-gate cho daemon; rollback FTP giữ). dev-check **78/0 PASS**.

## v1.75 — 2026-06-17
**Index đúng chỗ — Conversation Resolver LÁI vòng chat (đi thẳng vấn đề, đỡ token vô lý).**
- `conversation_resolver()` nay QUYẾT ĐỊNH có neo lịch sử hay không cho MỖI lượt (trước đó luôn neo): câu tiếp-mạch ("làm đi/tiếp/cái này/ý trên", sửa/duyệt/phủ định) → NEO; task MỚI dài tự-đứng-vững → KHÔNG neo → đi thẳng, không kéo ngữ cảnh cũ sai chỗ (~tiết kiệm 1.5K tok/lượt ở những lượt mở task mới giữa cuộc chat). Áp cho cả `server.py /api/chat` và `octopus-bridge.py` (`should_anchor`).
- `spider_note` rút gọn 219→98 tok/lượt (khung routing verbose để dành cho evidence, không lặp mỗi turn).
- Evidence nhẹ: ghi `intent·neo|mới·confidence` lên bảng quan sát 🛰 (debug "vì sao hiểu vậy"), 0 I/O thêm.
- An toàn: câu ngắn/mơ hồ vẫn neo (không bỏ ngữ cảnh nhầm); closed-loop + safeguard nguyên vẹn. dev-check **77/0**. Chỉ chỉnh NUC daemon/bridge — không cần publish.

## v1.74 — 2026-06-17
**Chat liền mạch theo ngữ cảnh — Chat Context Index + Conversation Anchor (sửa lỗi "làm đi" mất mạch).**
- **Lỗi gốc:** chat Codex (cloud + admin) xử lý mỗi tin rời rạc — "làm đi"/"tiếp" mất ngữ cảnh tin trước; thêm nữa khung `[ROUTER] level/role/lý do` nội bộ bị in ra cho người dùng.
- **Sửa runtime (recent-window anchoring):** `server.py /api/chat` + `octopus-bridge.py` nay NEO lịch sử hội thoại bounded — Codex LUÔN neo (không có resume), Claude neo khi không resume được; `site/chat/callback.php` (action=next) cấp `history` bounded (LIMIT 10) cho job. `spider_note` chuyển thành NỘI BỘ + cấm in khung [ROUTER]; "làm đi/tiếp" → tiếp tục yêu cầu gần nhất, không hỏi lại từ đầu.
- **Chuẩn mới:** `docs/chat-context-index.json` (máy đọc) + System Model §14: Conversation Resolver (15 intent) · Conversation Anchor · Conversation Context Policy (recent_window + active_summary + decision_ledger + pending_stack + constraint_stack, KHÔNG full raw) · Reference Resolution · Context Compression · Memory Boundary (Conversation≠Project≠Spider≠Doctrine) · evidence metadata · 8 test case. `conversation_resolver()` + API `GET /api/chat-context`, `GET /api/conversation-resolve`.
- **Partial (bước sau):** active_summary tự tóm tắt theo delta · decision_ledger/pending_stack lưu bền · context_compression khi hội thoại dài.
- An toàn giữ nguyên (không full raw mặc định · không lưu secret thô · không tự thành Spider lesson · closed-loop nguyên vẹn). JSON valid (chat-context-index + context-index-map + doctrine). dev-check **77/0 PASS**. Published (gồm callback.php host).

## v1.73 — 2026-06-17
**Context Resolver chạy SONG HÀNH xuyên suốt + định vị System Model đúng chỗ trong luồng.**
- Wire Index Map vào **runtime thật**: thêm khối "Định tuyến ngữ cảnh" vào `discipline-prompt.md` (worker AI đọc MỖI bước) → Spider *.0 [Claude|Codex] nhảy vào ĐÚNG tầng L0–L4 thay vì đọc lại full System Model. L0 Core Kernel luôn song hành (ngắn); L1–L4 nạp đúng tầng khi cần; token = ngưỡng an toàn (không hard-limit). Đồng bộ sang worker đang chạy `config/octopus-discipline.md`.
- `architecture_flow` (System Model) sắp xếp lại đúng vị trí: `User → Octopus Core → Context Resolver·Index Map → Spider [Claude|Codex] (mặc định *.0) → System Model (L0 song hành, L1–L4 đúng tầng) → Model Router 3 lớp → Plan→…→Spider Stable`.
- Mục tiêu đạt: tối ưu tốc độ xử lý + tiêu thụ token + tự động hóa khép kín chính xác — chuẩn/luật LUÔN mặc định nhưng KHÔNG đọc lại hết mỗi lần.
- Giữ nguyên mọi safeguard + vòng khép kín. dev-check **77/0 PASS**. Published.

## v1.72 — 2026-06-17
**Context Index Map + Context Resolver — làm việc theo TẦNG context, không nạp full System Model cho mọi task.**
- Thêm `docs/context-index-map.json` (máy-đọc): tầng **L0 Core Kernel** (luôn nạp) → **L1 Project Map** → **L2 Task Context** (15 task_type) → **L3 Historical Lessons** (chỉ khi cần) → **L4 Full System Model** (chỉ task hệ thống/rủi ro cao). Kèm **Context Resolver**, **Risk Tier Routing 0–4**, **Token Usage Policy** (ngưỡng an toàn, KHÔNG hard-limit — được vượt khi có lý do), **Learning Gate** (chống memory rác), **Model Routing Optimization**, **routing evidence schema**.
- `server.py`: `load_context_index_map()` + `resolve_context()` + API `GET /api/context-map`, `GET /api/context-resolve?task_type=…[&risk_tier=…]`; `/api/system-model` thêm `context_routing`. Đổi câu "AI đọc System Model TRƯỚC mọi task" → "đọc **Context Index Map** trước; Context Resolver quyết định nạp tầng nào; Full System Model chỉ khi task lõi/Spider/release/benchmark/security/policy/governance/system-model" (cả `system-model.md` §header + §13 mới + `operating-doctrine.json` +4 core_rules).
- **Tư duy: không giới hạn xử lý, chỉ đặt ngưỡng an toàn để định tuyến.** Task nặng vẫn được tiêu nhiều token/model mạnh khi có lý do (rủi ro/lỗi lặp/reasoning sâu/release/security/Spider). Task nhẹ không kéo cả quy trình nặng.
- Giữ NGUYÊN vòng tự động hóa khép kín + mọi safeguard (AI không shell · snapshot/rollback · test/evidence/no-regression · human gate). 0 quyền mới · 0 chặn bị gỡ. JSON valid (context-index-map + doctrine + workflow). dev-check **77/0 PASS**.

## v1.71 — 2026-06-17
**Model Router 3 lớp (provider-neutral) + Codex GPT-5.3 Codex Spark.**
- Bỏ hẳn router chung `simple→haiku · normal→sonnet · hard→opus`. Định tuyến theo **vai trò + rủi ro**, không theo tên model: ① **Spider Capability Cap** (1.0 trần medium · 2.0 trần high) → ② **Claude Reasoning Router** (suy luận/kiến trúc/review/policy/risk) → ③ **Codex Patch Router** (số file/scope/regression/test). Claude & Codex KHÔNG dùng chung tiêu chí.
- `xhigh`/`max` **không bao giờ tự bật** — chỉ ĐỀ XUẤT khi đủ gate (Task Contract · Evidence Gate · Tool Permission · No-regression · Rollback · Human review nếu đụng core/security). Trần effort theo model: Opus→max (có gate) · Sonnet/Haiku & Codex/GPT→high. Cost-guard + escalation theo tín hiệu. Quyết định router ghi vào evidence (`router_decision`).
- `server.py`: `spider_policy()` viết lại thành router 3 lớp; thêm `router_decision()`; 5 cờ định tuyến không trùng (Cap / Claude Router / Codex Router / Cost Guard / Evidence Logging) thay 3 cờ cũ; `auto_router` provider-neutral. `chat-ui.html`: System Model · Model Router hiển thị 3 lớp. `docs/system-model.md §11` viết lại đầy đủ (+ Router Decision Schema + Escalation). `model-route.sh` thành Claude Reasoning Router + thực thi Spider cap (1.0 không bao giờ tự lên opus); `octopus-auto.sh` truyền `SPIDER_VERSION`. `workflow.json` + seed provider-neutral.
- Thêm **GPT-5.3 Codex Spark** (`gpt-5.3-codex-spark`) vào lựa chọn Codex — đã test `codex exec -m` rc=0 (các biến thể -codex thường vẫn 400, không đưa vào).
- 0 quyền mới cho AI · 0 chặn · 0 safeguard bị yếu. Smoke +2 test (Spider cap). dev-check **77/0 PASS**.

## v1.70 — 2026-06-17
**Evidence Recorder — tự chấm OQS cuối mỗi chu kỳ (chế độ GHI, KHÔNG chặn).**
- Thêm `runtime/loops/oqs-evidence.sh`: gom tín hiệu loop ĐÃ có (status/test/fix/rollback/files) → `POST /api/oqs/score`. **Best-effort tuyệt đối**: thiếu jq/curl/server đều nuốt lỗi, LUÔN exit 0 — không bao giờ làm fail task.
- Wire 1 lời gọi guarded ở cuối `record_lesson()` trong `octopus-auto.sh` (không động lõi loop). Map FINAL_STATUS→OQS; test không có→not_applicable (không phạt nhầm); no-regression mặc định not_applicable (loop verify bằng project test).
- Biến OQS/OIB từ `count:0` → có **dữ liệu THẬT** mỗi chu kỳ task. Guard test `tests/oqs-test.sh` (dev-check **74/0**).
- **0 quyền mới cho AI · 0 chặn · 0 safeguard bị yếu · điểm vẫn tất định (không LLM)**. Daemon self-improve nhận khi worktree đồng bộ; loop chạy từ repo chính ghi điểm ngay.

## v1.69 — 2026-06-17
**OQS — Octopus Quality Score (chấm điểm chất lượng mỗi task, lean v1).**
- Thêm `runtime/web/oqs.py` (scorer thuần, tất định, 0 dependency): chấm 0–100 từ **evidence khách quan** (final_status · test · no-regression · evidence fields · fix/repair count · scope-policy · rollback) — **KHÔNG để AI tự chấm**. 6 tiêu chí + hard caps + penalties + grade A–F + normalized (loại tiêu chí không áp dụng khỏi mẫu số).
- 4 chống-chấm-sai (đã test): **blocked-đúng-policy = 25** (không phải thất bại) · tiêu chí N/A loại khỏi mẫu số · **điểm thấp chỉ tạo Process Improvement (Draft)**, không tự sửa Stable · **điểm cao cần tái dùng ≥3 lần** mới best-practice.
- API: `POST /api/oqs/score` · `POST /api/oqs/correct` (append-only, cần người duyệt) · `GET /api/oqs`. Rollup hiện ở **System Model 8b** (nguồn dữ liệu cho OIB). Lưu append-only `oqs/task-scores.jsonl`.
- Regression guard `tests/oqs-test.sh` nối vào smoke (dev-check **73/0**). Hiến pháp thêm mục 9b OQS + roadmap thêm `oqs_quality_score=ON`.
- Lean: chưa LLM-judge, chưa dùng OQS auto-promote Stable cho tới khi chạy ổn + được review.

## v1.68 — 2026-06-16
**Hiến pháp vận hành CIOS — `docs/system-model.md`.**
- Tạo `docs/system-model.md`: biến System Model thành **hiến pháp Continuous Intelligence Operating System** (API-first · tool-safe · evidence-gated · benchmark-driven · memory-reviewed · self-healing · no-regression · Spider-evolution).
- **Giữ nguyên mọi safeguard** (Spider 1.0 stable_locked, 2.0 draft, self-heal, auto-resume, snapshot/rollback, scope lock, test mỗi vòng, AI no-shell, memory draft, người duyệt, no-regression, secret scan, model router) — **không làm yếu lớp nào**.
- **Nâng planned/partial thành P0 (hợp đồng đích, có schema máy-đọc + acceptance):** Task Contract, Tool Permission Layer, Evidence Gate (chặn cứng), Command Whitelist, Failure Memory, Project Memory tách Global, Learning Pipeline, OIB Benchmark, Tracing, Release Governance. Ghi TRUNG THỰC: đây là đích đã hiến-pháp-hoá, status thực thi vẫn đọc thật ở `/api/system-model`.
- Thêm **Memory Hygiene** (rà soát/thanh lọc memory-lesson định kỳ: giữ best-practice, loại memory rác/lỗi thời/thiếu bằng chứng).
- `operating-doctrine.json` + trang System Model thêm: `identity` (CIOS), `valid_end_states` (4), `forbidden` (6), con trỏ `constitution`.

## v1.67 — 2026-06-16
**Operating Doctrine — lõi đầu não chắt lọc, nối vào vòng lặp AI.**
- Chắt lọc lịch sử (decision-log D-001..080 + nguyên tắc sản phẩm + bài học đã kiểm chứng) thành `config/operating-doctrine.json`: **12 luật cứng + 13 playbook đã kiểm chứng + quy trình phát hành (12 bước) + quy trình huấn luyện Spider (9 bước)** + luật tối thượng. Bỏ cái lỗi thời/đã bị thay thế, giữ cái còn hiệu lực, tái dùng được.
- System Model thêm mục **"0 · Operating Doctrine"** (đọc `/api/system-model` → `operating_doctrine`), xuất kèm Markdown.
- **Nối vào vòng lặp:** persona (chat + worker/loop) trỏ AI ĐỌC doctrine TRƯỚC khi sửa hệ thống / bắt đầu vòng làm việc-huấn luyện, tuân core_rules tuyệt đối → biến System Model từ "trang xem" thành "ngữ cảnh sống" của Claude/Codex.

## v1.66 — 2026-06-16
**Admin System Model — bản đồ vận hành sống + Global AI Capability Roadmap.**
- Trang Admin **System Model** (badge 🗺, hash `#system-model`, API `/api/system-model` + `/admin/api/system-model.json`): hiển thị mô hình vận hành, Spider registry, feature flags, model router, memory/learning, safety, test/benchmark, server runtime — **đọc trạng thái THẬT, không bịa** (chưa kiểm được → unknown/not_connected/planned). Xuất JSON + Markdown; ghi Audit khi đổi trạng thái.
- Thêm **Global AI Capability Roadmap** (19 năng lực agent mạnh thế giới đang hướng tới: Task Contract, Tool Permission, Command Whitelist, Evidence/No-regression Gate, Tracing, Benchmark, Self-heal, Memory dài hạn, Model Router, Multimodal, Multi-agent, MCP, Observability, Release Governance…) với trạng thái Octopus + target Spider-2/3 + ưu tiên P0/P1/P2 — máy đọc được để AI tự rà soát & nâng cấp an toàn.

## v1.65 — 2026-06-16
**Spider 2.0 mặc định + hội thoại xen kẽ + URL theo từng cuộc.**
- Mặc định dùng **Spider 2.0** ở mọi mặt (web chat, admin, terminal/worker) để phục vụ làm việc & huấn luyện; badge đổi thành "🕷 Model Octopus".
- **Hội thoại xen kẽ (Spider 2.0):** đang trả lời vẫn gửi thêm được — yêu cầu được ghi chờ rồi **gộp xử lý ở lượt sau** (tiết kiệm token, giải quyết liên tục).
- **Vào cuộc mới tắt load/stop:** trạng thái đang-chạy chỉ hiện ở đúng cuộc đang chat; đổi/mở cuộc mới không còn kẹt nút dừng (không giết tiến trình nền).
- **URL theo từng cuộc** dạng `/c/<id>` (như ChatGPT): mở thẳng, back/forward, F5 giữ đúng cuộc.
- Stream mượt hơn cho câu dài (giới hạn parse markdown ~12fps) + sửa F5 ở trang Huấn luyện `#train/...` bị rớt về trang chủ.

## v1.64 — 2026-06-16
**Sửa lỗi web đứng hình khoảng 4 phút.**
- Watchdog không còn bỏ qua trường hợp web chỉ chậm một lần rồi treo trải nghiệm người dùng.
- Mục tiêu là tự phục hồi tốt hơn khi service phản hồi chậm bất thường.

## v1.63 — 2026-06-16
**Chat cloud tự nối lại và chạy tiếp việc đang dở.**
- Khi kết nối bị đứt, luồng cloud ưu tiên nối lại và tiếp tục job thay vì để người dùng mất việc đang chạy.

## v1.62 — 2026-06-16
**Sửa gốc lỗi "làm một lúc rồi dừng" của bridge cloud.**
- Bridge cloud chuyển từ cách chạy qua tmux sang systemd để ổn định hơn và dễ được systemd phục hồi.

## v1.61 — 2026-06-16
**`/v2` hỗ trợ hai transport: SSE cho admin và polling cho cloud.**
- Khung chat hợp nhất `/v2` dùng SSE khi chạy trên web admin nội bộ, đồng thời có đường polling cho cloud PHP để hoạt động ổn định sau Eyrok.
- `site/chat/v2.php` đóng vai trò wrapper cloud cho giao diện hợp nhất, giữ vai trò đăng nhập/gating của host.

## v1.60 — 2026-06-16
**`/v2` nối lịch sử thật vào khung chat hợp nhất.**
- Khung `/v2` đọc session thật qua `sessions` và `loadConv`, thay cho dữ liệu giả lập.
- Mục tiêu là đưa admin/user về cùng một trải nghiệm hội thoại nhưng vẫn giữ dữ liệu lịch sử hiện có.

## v1.59 — 2026-06-16
**Hợp nhất web B3: giao diện Eyrok live tại `/v2`.**
- Thêm bề mặt `/v2` để kiểm chứng giao diện cloud thống nhất trong luồng đăng nhập Eyrok thật.
- Đây là bước tiếp theo sau khi hợp nhất renderer và asset `octo-chat.{js,css}` dùng chung.

## v1.58 — 2026-06-16
**Gom public "Tài liệu" và "Changelog" thành một Audit hoàn chỉnh.**
- Thêm `docs/AUDIT.md` làm báo cáo public duy nhất: hiện trạng, phạm vi kiểm tra, mốc nâng cấp theo version, thời gian và hướng sử dụng.
- Trang chủ đổi footer từ hai link `Tài liệu · Changelog` sang một link `Audit` để người dùng xem một nguồn tổng hợp thay vì phải mở rời rạc.
- `make-release.sh` xuất `docs/audit.md` vào `dist/docs/` để publish cùng website; các file cũ vẫn giữ để tương thích link trực tiếp.
- Audit ghi rõ mốc nền v1.0 ngày 2026-06-15, chuỗi nâng cấp ngày 2026-06-16 và mốc hiện tại v1.58.

## v1.57 — 2026-06-16
**Hợp nhất web B2/3: user/cloud dùng chung `octo-chat.js`.**
- Web người dùng nạp chung `octo-chat.js` và `octo-chat.css`, giảm lệch hành vi render Markdown giữa admin, user và widget.
- `make-release.sh` và `publish-release.sh` đóng gói, upload module dùng chung lên web root để host phục vụ `/octo-chat.{js,css}`.
- Giữ fallback cũ trong PHP/JS để giao diện vẫn hoạt động nếu asset chung chưa được publish.

## v1.56 — 2026-06-16
**Tự kết nối lại và tiếp tục công việc khi mất mạng hoặc mất phiên engine.**
- `self-improve-loop.sh` bổ sung `wait_online()` ở đầu mỗi chu kỳ. Khi mất mạng hoặc engine chưa sẵn sàng, daemon sẽ chờ và tự kết nối lại với backoff 10-60 giây, thay vì bỏ qua chu kỳ hoặc tiêu tốn token khi offline.
- Mỗi chu kỳ nạp lại `OAUTH_ENV`, nên token mới sau `/connect` được sử dụng ngay mà không cần khởi động lại thủ công.
- Cơ chế này bổ sung cho các lớp phục hồi đã có: systemd `Restart=always`, watchdog khi tiến trình treo và `octopus checkpoint` để tiếp tục nhiệm vụ sau khi mất điện.
- Đã áp dụng cho daemon đang chạy trong worktree `auto/self-improve` và nhánh master. Kiểm tra cú pháp Bash đạt yêu cầu; daemon đã khởi động lại ổn định.

## v1.55 — 2026-06-16
**Hợp nhất bộ render Markdown cho admin, người dùng và widget nhúng.**
- Thêm `runtime/web/octo-chat.js` với `window.octoMD()` và `octoEscapeHtml()`, dùng chung cho các bề mặt chat thay vì duy trì nhiều renderer riêng.
- Renderer hỗ trợ code fence, nút copy cho code block, heading h1-h3, danh sách, inline code, in đậm, in nghiêng, liên kết và escape HTML để giảm rủi ro XSS.
- `server.py` phục vụ `/octo-chat.js` và `/octo-chat.css`; giao diện admin nạp module mới nhưng vẫn giữ tên hàm `renderMarkdown` để không phải đổi call-site.
- Bổ sung `tests/octo-md-test.sh` với 8 trường hợp kiểm thử. Test đã phát hiện và giúp sửa lỗi thứ tự escape khiến heading bị hiển thị sai.
- Đã kiểm tra trực tiếp sau khi khởi động lại `octopus-web`: `/octo-chat.js`, `/` và `/api/status` đều phản hồi đúng.

## v1.54 — 2026-06-16
**Web admin hỗ trợ chọn engine cho Single mode và gộp thao tác dừng vào nút Gửi.**
- Single mode có thêm lựa chọn engine Claude hoặc Codex qua `<select id="aiEngine">`; Multi mode ẩn lựa chọn này vì đã dùng cơ chế kết hợp.
- Tùy chọn Codex chỉ bật khi trạng thái đăng nhập hợp lệ, dựa trên `syncEngineUI` và `/api/status`.
- `server.py` stream trực tiếp `codex exec` khi chọn `engine=codex`, giúp token hiện dần và cho phép nút Dừng kết thúc tiến trình để tránh tiêu tốn token không cần thiết.
- Giao diện được tinh gọn: bỏ nút Dừng riêng và các pill Chat/Kế hoạch; nút Gửi chuyển thành nút Dừng khi đang chạy.
- Đã rà soát nhánh Codex trước khi publish: biến trong scope đầy đủ, SSE được đóng trong `finally`/`finish()`, không còn tham chiếu treo đến `chatMode`, `stopBtn` hoặc `data-cmode`.

## v1.53 — 2026-06-16
**Octopus Forge hỗ trợ `--apply` trong worktree cô lập, có cổng kiểm tra trước khi merge.**
- `octopus forge --apply "<việc>"` là tùy chọn opt-in. Sau các bước thiết kế đội, sinh skills và điều phối, Forge tạo một git worktree riêng trên nhánh `forge/<slug>-<stamp>-<pid>`.
- Implementer chạy trong worktree bằng `claude --permission-mode acceptEdits`; `dev-check.sh` được chạy ngay trong worktree để kiểm tra đúng phần vừa thay đổi.
- Nếu kiểm tra đạt, Forge commit và giữ nhánh để con người review và merge thủ công. Nếu kiểm tra lỗi, không có thay đổi hoặc gặp exception, Forge xóa worktree và nhánh để rollback sạch.
- Đã vá hai rủi ro rò rỉ nhánh: timeout/exception giữa chừng và lỗi `worktree add` khi trùng thư mục. Mỗi run lưu `apply.diff` và mục Apply trong `result.md`.
- `tests/forge-apply-test.sh` kiểm tra ba nhánh quyết định: đạt thì giữ nhánh, không đổi thì rollback, lỗi thì rollback.

## v1.52 — 2026-06-16
**Khắc phục lỗi `reflect(): c: unbound variable` làm daemon self-improve khởi động lại sau mỗi chu kỳ.**
- Nguyên nhân: với `set -u`, dòng `local c="$1" out="$LOGDIR/reflect-${c}.txt"` khiến Bash expand `${c}` trước khi biến `c` được gán.
- Cách sửa: tách khai báo, gán `c="${1:-0}"` trước rồi mới tạo `out="$LOGDIR/reflect-${c}.txt"`.
- Đã kiểm chứng bằng `bash -uc`: cách viết cũ lỗi, cách viết mới chạy đúng. Daemon trong worktree `auto/self-improve` không còn crash-restart sau khi reflect.

## v1.51 — 2026-06-16
**Khắc phục crash-loop khi nhánh `auto/self-improve` đang được giữ bởi worktree khác.**
- Trước đây loop checkout `auto/self-improve` trong repo chính. Nếu nhánh đã được worktree `/data/techgon-worker-platform-auto` giữ, Git trả lỗi `fatal: already used by worktree` và loop bị guard khởi động lại liên tục.
- Preflight mới đọc `git worktree list`; nếu nhánh đang nằm trong worktree, toàn bộ chu kỳ được chạy ngay tại worktree đó thay vì checkout lại ở repo chính.
- Trường hợp không có worktree vẫn giữ hành vi cũ. Cú pháp Bash và logic phát hiện worktree đã được kiểm tra.

## v1.50 — 2026-06-16
**Forge lưu bài học sau mỗi vòng và cập nhật Knowledge để tái sử dụng.**
- `octopus eval bench` cho thấy bộ benchmark 12 câu có độ nhiễu cao: cùng một codebase cho kết quả 91% rồi 83%. Kết luận: chưa có bằng chứng regression, nhưng cần bộ eval lớn hơn, tối thiểu khoảng 40 câu hoặc best-of-N.
- Sau một run thành công, Forge lưu cấu hình đội tốt qua `save_crew` tại `forge/crews/<slug>.json` và ghi bài học vào Knowledge Engine.
- Với nhiệm vụ tương tự, `find_crew` có thể tái sử dụng đội đã chứng minh hiệu quả, giảm số lượt gọi engine và giảm thời gian thiết kế lại.
- Đã lưu các bài học về eval nhiễu, sentinel Markdown, fallback streaming, OAuth Claude, `require_once` và triết lý Forge lean.

## v1.49 — 2026-06-16
**Octopus Forge dựng đội AI agent từ một câu lệnh.**
- `octopus forge "<việc>"` hoặc `/forge` chạy theo ba giai đoạn: thiết kế đội, sinh skills và điều phối theo mẫu đã chọn kèm kiểm thử.
- Engine có thể chọn các mẫu như pipeline, fanout-fanin, expert-pool, producer-reviewer, supervisor hoặc hierarchical. Artifacts được lưu tại `WORKER_HOME/forge/<run>/`.
- Có giới hạn chi phí bằng `--budget` và `--max-agents`; `--plan` chỉ tạo bản thiết kế để xem trước với chi phí thấp.
- Tài liệu thiết kế nằm ở `docs/FORGE.md`. Tính năng là opt-in và không thay đổi hành vi mặc định.

## v1.48 — 2026-06-16
**Sửa cách tính token cho Codex để hạn mức Free được áp dụng nhất quán.**
- Trước đây Single mode với Codex trả `tokens=0`, khiến người dùng Free không bị trừ quota. Nay hệ thống ước lượng token bằng `(len(hỏi)+len(đáp))//4`; Multi mode cộng thêm phần Codex tương ứng.

## v1.47 — 2026-06-16
**Thêm nút Copy cho code block trên web người dùng và widget nhúng.**
- Sau khi render Markdown, mỗi `<pre>` có nút Copy ở góc phải. Khi copy thành công, nút hiển thị dấu xác nhận trong 1,2 giây.
- Cơ chế idempotent, không nhân đôi nút khi render partial nhiều lần. JavaScript của `/new` và `embed.html` đã qua `node --check`.

## v1.46 — 2026-06-16
**Web người dùng hỗ trợ streaming, hiển thị câu trả lời dần trong quá trình sinh.**
- Bridge thêm `run_claude_stream` dùng `claude --output-format stream-json --include-partial-messages`, gom text và gửi partial qua `post_partial(jid,text)` khoảng mỗi giây.
- `callback.php?action=partial` cập nhật answer nhưng vẫn giữ trạng thái `working`, chưa cộng token cho đến khi hoàn tất.
- Frontend `/new` render dần bằng `mdToHtml`; khi job `done`, giao diện thay bằng bản trả lời cuối.
- Có fallback hai lớp: lỗi parse hoặc stream rỗng đều quay về `run_claude`. Luồng BYOK, Codex và non-stream không đổi.

## v1.45 — 2026-06-16
**Thêm nút Dừng cho web người dùng khi đang chờ câu trả lời.**
- Trên `/new`, nút Gửi chuyển thành **■ Dừng** khi hệ thống đang trả lời. Khi bấm, frontend đặt `cancelGen`, dừng vòng poll và khôi phục trạng thái nhập.
- Worker nền có thể hoàn tất job sau đó, nhưng giao diện người dùng không còn bị giữ ở trạng thái chờ. JavaScript đã qua `node --check`.

## v1.44 — 2026-06-16
**Cho phép xóa hội thoại trong sidebar của web người dùng.**
- `api.php` thêm route `delconv` với `POST {cid}`. Hội thoại được ràng buộc theo người dùng qua `$mkcid` để tránh xóa nhầm dữ liệu tài khoản khác.
- Sidebar `/new` hiển thị nút xóa cho từng mục lịch sử, có xác nhận trước khi xóa. Nếu đang mở hội thoại bị xóa, giao diện chuyển về chat mới và làm mới danh sách.

## v1.43 — 2026-06-16
**Đưa test Markdown vào cổng kiểm tra để giảm regression.**
- `tests/markdown-test.sh` trích `mdToHtml` từ `site/chat/index.php` và kiểm tra 7 fixture: số trong prose, code block, in đậm, in nghiêng, inline code, escape XSS, heading, list và link.
- `dev-check` ghi nhận 69 kiểm tra đạt, không có lỗi.

## v1.42 — 2026-06-16
**Widget nhúng `embed.html` hỗ trợ Markdown.**
- `runtime/web/embed.html` thêm `mdToHtml` với sentinel U+E000 và escape XSS. Markdown được render sau khi stream hoàn tất và typer đã xả hết nội dung.
- CSS được bổ sung cho `pre`, `code`, `h1-h3`, `ul` và `a`. JavaScript đã qua `node --check`; node test đạt 3/3.
- Markdown hiện đồng bộ trên terminal, web người dùng `/new`, web admin `:8787` và widget nhúng.

## v1.41 — 2026-06-16
**Thêm test tự động cho parser `stream-json` của terminal.**
- `tests/stream-parse-test.sh` trích chương trình `jq` trong `_stream_jq` của `octopus.sh`, sau đó chạy fixture `stream-json` để kiểm tra text, thinking, block boundary, usage và result.
- Test cũng kiểm tra decode UTF-8 tiếng Việt và xử lý event lạ. Kết quả đạt 7/7; `dev-check` đạt 68 kiểm tra.

## v1.40 — 2026-06-16
**Web người dùng hỗ trợ Markdown đồng bộ với web admin.**
- `/new` thêm `mdToHtml` an toàn: escape HTML trước khi render để giảm rủi ro XSS từ output model.
- Hỗ trợ code block, inline code, in đậm, in nghiêng, heading, list và link cho cả câu trả lời mới lẫn lịch sử mở lại.
- CSS Markdown được bổ sung cho bubble chat. Node test đạt 7/7 và PHP lint không báo lỗi.


## v1.36 — 2026-06-16
**BYOK (dùng API key Claude/OpenAI riêng — không giới hạn) + đồng bộ Agent 🦀/🐙 cho web admin.**
- **BYOK — kết nối gói riêng (2 cách: 🔑 API key hoặc 🔗 OAuth):** người dùng nhập API key **Claude (sk-ant-…) / OpenAI (sk-…)** *hoặc* dán **OAuth token** (Claude: `sk-ant-oat…` từ `claude setup-token`/Anthropic) để chạy bằng gói của họ, **bỏ giới hạn 10k token/ngày**. Bridge dùng đúng env theo method: API key→`ANTHROPIC_API_KEY`, OAuth→`CLAUDE_CODE_OAUTH_TOKEN`. Key **mã hoá AES-256-GCM** khi lưu (`byok_key_enc` trong users, khoá dẫn xuất từ enc_secret/jwt_secret), không lưu thô, không log. Modal "🔑 Dùng API key riêng" trong sidebar; status hiện "Key riêng …tail · không giới hạn".
- Bridge định tuyến BYOK: OpenAI→gọi thẳng `api.openai.com/v1/chat/completions` (model `gpt-4o`, đổi qua `OCTO_OPENAI_MODEL`); Claude→`claude` với `ANTHROPIC_API_KEY` riêng (bỏ token gói Octopus). callback `next` giao key (đã giải mã, qua HTTPS + token) cho worker; `answer` không cộng quota khi người dùng dùng BYOK.
- **Web admin (`:8787`) đồng bộ Agent:** đổi 3 mode (🟢Single·🔵Hybrid·🟣Multi) → **2 Agent 🦀 Single · 🐙 Multi** khớp web người dùng; giữ streaming/tool/Codex/sidebar/history. Admin = không giới hạn, lưu lịch sử **local** (`web-chats/<id>.json`) phục vụ dự án; người dùng lưu **DB** (`sql_octopus`).

## v1.35 — 2026-06-16
**Web chat giống Claude/ChatGPT: URL sạch `/new` + sidebar lịch sử · hạn mức gói Free 10k token/ngày · chọn Agent Single/Multi.**
- **URL sạch:** bỏ `/chat/?project_id=…` lộ liễu → `/new` (cuộc trò chuyện mới), project_id NGẦM ĐỊNH server-side (`default_project()`). Login/callback redirect về `/new`.
- **Sidebar trái (kiểu Claude):** nút **＋ Cuộc trò chuyện mới** + **lịch sử** hội thoại của người dùng (tiêu đề = câu hỏi đầu). API thêm `path=list` (hội thoại theo người dùng) + `path=history&cid=` (mở lại); hội thoại cô lập theo người dùng (`u-<uid>-<conv>`), validate convId chống injection. Mobile có nút ☰.
- **Hạn mức gói:** **Free = 10.000 token/ngày** (`FREE_DAILY_TOKENS`). Bảng `usage_daily(uid,day,tokens)`; bridge báo token (input+output+cache) → callback cộng dồn theo người dùng; `api.php` POST chặn 429 khi Free hết hạn; sidebar hiện "còn X/10k token hôm nay". Admin/Pro = vô hạn (limit 0).
- **Agent Single/Multi:** selector 🦀 **Single** (1 engine: Claude *hoặc* Codex) · 🐙 **Multi** (kết hợp Claude + góc nhìn Codex; sau mở rộng Gemini). Lưu `agent`/`engine` vào messages (migration cột an toàn); bridge định tuyến: Single+codex→`codex exec`, Single+claude/Multi→claude (Multi nối thêm "🔵 Góc nhìn Codex").
- **Tăng tốc:** bridge poll thích ứng 0.4s khi bận / 2s khi rảnh; front-end poll 300ms lúc đầu.
- **Fix regression (D-044):** `require`→`require_once` toàn bộ (db.php nạp 2 đường gây `Cannot redeclare octo_secrets()`); jwt_secret cấu hình trên host; bảng users auto-tạo khi mở /login.php.

## v1.34 — 2026-06-16
**Đăng nhập Eyrok cho Octopus web (bản thương mại) + DB người dùng để quản gói.**
- **Cổng đăng nhập Eyrok SSO** trên `octopus.techgon.com` (trước đây `/chat/?project_id=…` mở public — sai): `site/login.php` (nút Eyrok SDK, `data-project-id=565e4fa…`, `data-redirect-uri=https://octopus.techgon.com/callback.php`) → `site/callback.php` xác minh token với `eyrok.com/session` → upsert `users` → cookie JWT (HttpOnly) → vào `/chat`.
- **`site/auth.php`** (mới): verify Eyrok `/session`, JWT HS256 tự ký (b64url + `hash_hmac`), `upsert_user()`, `current_user()`, `is_admin()`, `ensure_users_table()`. Tái dùng kết nối MySQL chung (`chat/db.php`), không đụng bảng `messages`.
- **Bảng `users`** (id=Eyrok profileid · name · email · avatar · **plan** free/pro… · **role** user/admin · last_login) — nền quản gói thương mại tương lai.
- **Gate bắt buộc đăng nhập**: `chat/index.php` chưa login → `/login.php`; `chat/api.php` chặn POST/poll khi chưa có phiên (401) + gắn `chat_id` theo người dùng id (cô lập phiên theo tài khoản). Header chat hiện avatar/tên + badge gói/ADMIN + nút Thoát (`logout.php`).
- **Phân quyền**: CLIENT bắt buộc đăng nhập, mặc định luôn Octopus; ADMIN (`techgonsystem@gmail.com`, cấu hình qua `admin_emails`/`OCTO_ADMIN_EMAILS`) nhận `role=admin` → full, không hạn gói. Secret (`jwt_secret`, eyrok project_id) đặt trong `site/chat/secrets.php` (đã .gitignore) — hướng dẫn ở `docs/EYROK-LOGIN.md`.
- **Test có bằng chứng**: `tests/auth-eyrok-test.sh` (php hệ thống hoặc docker php:8.2) — **8/8 pass**: JWT roundtrip giữ UTF-8, chống sửa chữ ký, hết hạn, định dạng 3 phần, role admin/user, b64url roundtrip. PHP lint sạch 6 file (qua docker, NUC không có php).
- ROADMAP: thêm **Phase 1.5 — Chat Experience Parity** (checklist terminal+web ≥ Claude, trạng thái trung thực) + chốt policy engine theo vai trò.

**Gửi nội dung dài ở mọi chat (qua STDIN) + paste nhiều dòng ở terminal:**
- Trước đây prompt truyền qua tham số dòng lệnh (`claude -p "$msg"`) nên paste code/log lớn vượt **ARG_MAX** sẽ vỡ. Nay cả 3 đường đều bơm prompt qua **stdin** như Claude thật: terminal `_run_stream` (process substitution, vẫn giữ type-ahead chèn xen kẽ) · web admin `server.py` (ghi stdin ở luồng riêng, tránh deadlock payload lớn) · bridge người dùng `octopus-bridge.py` (`input=`). Test thật: web nhận **200KB**, terminal **50K** — không vỡ, trả lời đúng.
- **Terminal paste nhiều dòng = 1 tin**: sau dòng đầu, gom các dòng đã nằm sẵn trong buffer (gõ tay không có dòng kế trong ~50ms) → dán code/log/markdown nhiều dòng thành một tin nhắn; lọc dấu bracketed-paste + CR.

**Đồng bộ phiên bản + tách admin/người dùng:**
- Chat người dùng (`site/chat/index.php`) hiện `v__VERSION__` ở header (make-release stamp từ `VERSION` — như trang chủ) → trang chủ · web admin (`/api/status`) · terminal (banner) · chat người dùng đều khớp một nguồn `VERSION`.
- Admin (`runtime/web`, streaming + công cụ CORE) và người dùng (`site/chat`, hàng đợi DB + login Eyrok, gọn) vẫn là 2 codebase tách riêng đúng vai trò.

**Web admin gọn hơn:** dải bot (🐙 Claude · model / 🔵 Codex) chuyển xuống dưới hộp chat, canh giữa, chip nhỏ — như tab AI của các app khác.

## v1.33 — 2026-06-16
**Chat terminal mượt như Claude Code — loader không đứng, đồng hồ .1s + token sống, Ctrl-C ngắt, chèn xen kẽ.**
- Viết lại lõi streaming (`_run_stream`): vòng lặp đọc **có timeout** → loader luôn động, hết treo khi Claude dừng/nghĩ lâu giữa chừng (lỗi cũ: spinner chỉ chạy tới token đầu rồi `tail -f` đứng im).
- Đồng hồ **deciseconds** (.1s) từ `EPOCHREALTIME` + **token suy luận sống** đọc từ `message_delta.usage` → mỗi nhịp hiện `Ns · N tok`.
- **Dừng thật giữa câu (>1.2s)** → xuống dòng + dấu chấm `·` + loader "tiếp tục…" (bỏ qua micro-gap cuối câu để không hiện nhầm).
- **Ctrl-C** ngắt riêng câu trả lời (in "⛔ đã ngắt · ⏱…"), không thoát REPL.
- **Chèn xen kẽ**: claude nền chạy `</dev/null` → phím gõ lúc đang stream ở lại bộ đệm TTY, tự về prompt lượt sau (type-ahead kiểu terminal).
- Giao thức stream 1 dòng an toàn newline/UTF-8 (base64) → prose markdown nhiều dòng giữ nguyên, không vỡ.

**Web chat khớp trải nghiệm terminal — loader không đứng, nhanh hơn:**
- Header mỗi đoạn hiện đồng hồ `.1s` + token sống ngay từ giây đầu (trước chỉ hiện khi đoạn KẾT THÚC → trông như đứng hình giữa chừng); dải đáy `· …` vẫn đếm liên tục khi Claude nghĩ/chạy tool im lặng.
- Typer nhả chữ gần như tức thời (≈85% backlog mỗi frame, sàn 64) → hết cảm giác "nhỏ giọt", vẫn mượt nhờ gộp ghi DOM theo `requestAnimationFrame`.
- **Giảm độ trễ khởi động**: thêm `--strict-mcp-config` (không kèm `--mcp-config`) ⇒ `claude -p` không nạp MCP server nào mỗi lượt chat (chat web chỉ dùng công cụ builtin) — cắt phần lớn cold-start, không mất tính năng.
- Bản nhúng (`embed.html`) cũng có loader sống (đồng hồ + token + pha suy luận/tool) thay cho `…` tĩnh.

**Phân đoạn phản hồi + hiện cách suy nghĩ (web + terminal) — đọc hiểu như Claude chat:**
- Mỗi phản hồi tách thành ĐOẠN có nhãn + giờ + token riêng: 💭 **suy nghĩ** (mờ, nghiêng, viền trái) · 🐙 **trả lời** · ⚙️ **hành động kỹ thuật** (Read/Grep/Bash… kèm truy vấn/lệnh 1 dòng). Chuyển đoạn tự chốt giờ+token đoạn trước.
- Server **stream cả nội dung suy nghĩ** (`thinking_delta.thinking`) thay vì vứt đi → web/terminal hiện đoạn 💭 khi luồng có reasoning (tự kích hoạt; `claude -p` gói subscription hiện chưa phát thinking nên đoạn này chỉ hiện khi engine bật).
- Terminal: `_stream_jq` thêm record `T` (suy nghĩ) + `B` (ranh giới đoạn); `_run_stream` vẽ đoạn 💭 mờ tách khỏi đoạn trả lời, tự reset màu an toàn.
- **không tự ngắt kết nối**: watchdog web nới 120s→**600s** và chỉ là lưới an toàn khi treo thật (reset mỗi sự kiện, kể cả `think`) → việc nặng/chạy tool lâu vẫn liền mạch.

**Chính sách engine theo vai trò (Octopus là cổng mặc định):**
- `octopus tui` / `/tui` (engine thô) **chỉ còn cho CORE** — máy chủ lõi giữ làm dự phòng để LÀM VIỆC tới khi chat Octopus terminal bằng/hơn engine gốc. CLIENT chạy `/tui` → ở lại Octopus; `octopus tui` → vào thẳng Octopus. Help/`-h` không quảng cáo engine thô cho client (giữ Octopus là cổng duy nhất + bảo mật mô hình).
- **Lệnh `/claude` mới (chỉ CORE)** — chat thẳng engine gốc *inline* trong Octopus (không persona, phiên riêng `RAWSID`, không trộn ngữ cảnh chat Octopus) để admin làm việc nhanh: `/claude <tin>` hỏi một lượt · `/claude` (không tham số) → mode Claude trực tiếp (gõ `/chat` để về Octopus). CLIENT gõ `/claude` → "lệnh không rõ" (ẩn hoàn toàn).
- Terminal chat thêm `--strict-mcp-config` (như web) → bỏ nạp MCP mỗi lượt, giảm cold-start; chat terminal vốn thuần builtin nên không mất gì.

**Dán/đính kèm ảnh để Octopus phân tích ngữ cảnh (web + embed):**
- Web chat: nút 📎, **dán (Ctrl+V)**, **kéo-thả** ảnh vào trang → xem trước thumbnail (có nút ×), gửi kèm. Tin chỉ-ảnh (không text) cũng được. Ảnh hiện lại trong bong bóng người dùng.
- Server: route `POST /api/upload` lưu ảnh vào `web-chats/uploads/` (nhận diện ảnh thật qua **magic bytes**, ≤12MB, giữ ≤200 ảnh gần nhất). `/api/chat` nhận `images:[path]`, **chỉ chấp nhận path trong uploads** (chống path-traversal), tự `--add-dir` thư mục ảnh + buộc bật agent, chèn hướng dẫn để Claude **dùng Read xem từng ảnh** (Read render được ảnh) rồi phân tích.
- Bản nhúng `embed.html` cũng dán/đính kèm ảnh được (đồng bộ). Test thật: ảnh đỏ → "Ảnh màu đỏ"; ảnh-không-text → tự phân tích màu+bố cục. Bảo mật: traversal & file không-phải-ảnh bị từ chối.

## v1.32 — 2026-06-16
**Khắc phục lỗi client báo "v1.0" và thêm lệnh update cho người dùng.**
- Gói phát hành nay KÈM file `VERSION` (+LICENSE) → client hiện đúng phiên bản (trước thiếu → octopus đọc default 1.0).
- Thêm **`octopus update`** (= `octopus /update`) → người dùng cập nhật 1 lệnh từ octopus.techgon.com.

## v1.31 — 2026-06-16
**Trang chủ chuyên nghiệp hơn + web biết CORE/CLIENT.**
- Icon trong thẻ: badge bo tròn gradient, đồng kích thước 46px, hover xoay-phóng nhẹ; thẻ gradient + bóng đổ sâu hơn — gọn, đều, đẹp.
- `/api/status` thêm `role` (core/client) → web phân biệt máy chủ lõi vs bản người dùng (nền để ẩn đồ lõi trên client).

## v1.30 — 2026-06-16 (bảo mật mô hình)
**Trang chủ public chung — không lộ cơ chế/kiến trúc (chống sao chép mô hình).**
- Thay thẻ tính năng chi tiết (closed-loop/knowledge flow/hybrid/systemd…) bằng giá trị mức cảm nhận
  ("làm việc thật", "tự học & ghi nhớ", "tiến hóa có bằng chứng", "của riêng bạn"). Bỏ lộ lệnh nội bộ.
- Chi tiết kỹ thuật/cơ chế chỉ thấy ở web chat CORE server (máy chủ lõi). Public chỉ thấy "nó mạnh", không thấy "làm sao".

## v1.29 — 2026-06-16
**Đúng vai trò: OCTOPUS là lõi điều phối, Claude/Codex chỉ là engine hỗ trợ ẩn.**
- Sửa copy người dùng-facing (trang chủ + banner/help terminal): bớt nhấn "Claude/Codex", đề cao "Octopus điều phối toàn bộ" —
  tránh hiểu nhầm Octopus chỉ "nhặt từ Claude/Codex". Trang chủ: "Octopus là cửa vào DUY NHẤT", thẻ "Đa engine điều phối".

## v1.28 — 2026-06-16 (Cổng Release chấm điểm)
**`octopus release-check` — bộ test 130đ chặn release nếu chưa đạt (không Done bằng cảm giác).**
- 10 nhóm (Chat/Provider/Project/Memory/Knowledge/Tools/Coding/Snapshot/Security/Report) tận dụng smoke-test + benchmark + kiểm cấu trúc.
  Ngưỡng: ≥115 PASS · 100-114 CONDITIONAL · 80-99 NOT READY · <80 BLOCK. **Regression critical** (Security/Project/Snapshot/Memory giảm) → BLOCK dù tổng cao.
- Ghi `reports/release-scores.tsv` (so version trước). Hiện tại: **118/130 = PASS**. (Nội bộ — loại khỏi gói phát hành.)

## v1.27 — 2026-06-16 (tách CORE ↔ CLIENT)
**Phân tách rõ LÕI máy chủ (não) vs bản người dùng.**
- `octopus` auto-detect **ROLE**: 🧠 **CORE** (máy có self-improve = toàn quyền + giao việc SỬA LÕI) vs 👤 **CLIENT**
  (bản xuất bản đã loại lõi = chỉ dùng mô hình + tự xây tri thức riêng, thừa hưởng quy chuẩn thông minh). Banner hiện vai trò.
- `docs/ARCHITECTURE-CORE-CLIENT.md` (nội bộ): chỉ máy chủ này + web chat của nó mới dùng hết + sửa lõi; IP/máy khác = client.

## v1.26 — 2026-06-16
**Chat terminal: pha suy nghĩ rõ + báo "✓ xong" — không tưởng đứng im.**
- Khi đang xử lý: hiện pha tiến triển "đang suy nghĩ → đang phân tích yêu cầu → đang soạn câu trả lời → vẫn đang xử lý (đừng tắt)" + đồng hồ giây.
- Khi xong: dòng **"✓ xong · ⏱s · tokens · tok/s"** rõ ràng → biết được phép gõ tiếp, không nhầm là đã trả lời xong giữa chừng.

## v1.25 — 2026-06-16 (Phase 1 #4: Session Resume)
**`octopus checkpoint` — mất điện/crash → khởi động lại → TIẾP TỤC từ bước dở, không bắt đầu lại.**
- `runtime/loops/checkpoint.sh`: lưu tiến độ task N/M + trạng thái (flat JSON tại loops/<task>/checkpoint.json);
  `save/show/next/done`. `checkpoint next` báo "tiếp tục từ bước X". Local-first, additive, không đụng octopus-work hiện có.

## v1.24 — 2026-06-16 (BẢO VỆ IP)
**Loại LÕI khỏi gói phát hành — người dùng chỉ nhận phần chạy được (vỏ), không lấy được bộ não.**
- Gói publish (linux/offline/source) nay LOẠI: `scripts/self-improve-*` (cơ chế tự cải tiến), `docs/IMPROVEMENT-REVIEW/ROADMAP`
  (chiến lược), `reports/decision-log` + `auto-loop` + `eval-history` (tư duy nội bộ). Xác minh: gói linux 0 file lõi, vẫn chạy được.
- **Bỏ đẩy gói source đầy đủ lên `public/`** (chỉ giữ ở `private/source-bundles`); xoá các source.tar.gz cũ đã lộ.
- Thêm **LICENSE độc quyền** (cấm sao chép/dịch ngược/tái tạo). Mọi quy tắc do Techgon nắm.

## v1.23 — 2026-06-16 (Phase 2.5 — bước leanest)
**Periodic Archiver + Knowledge Cleaner: biến lịch sử → tri thức sạch, định kỳ, kỷ luật.**
- **`octopus archive`** — gom dữ liệu thô (loop/health/BACKLOG, knowledge, lessons, project memory, eval, session metadata)
  đóng gói theo NGÀY (`WORKER_HOME/archive/<date>/`), không xoá gốc → nền cho Knowledge Builder. `archive list`.
- **`octopus archive clean`** — Knowledge Cleaner: loại bỏ tri thức TRÙNG (cùng title→giữ mới nhất) → memory sạch, không nhiễu → thông minh hơn.
- Anchor roadmap Phase 2.5 (Knowledge Pipeline) vào docs/ROADMAP.md. Phần nặng (Vector/Graph/Retrieval) = tương lai.

## v1.22 — 2026-06-16
**Benchmark trí tuệ theo CHUẨN LỚN (GSM8K · HumanEval · MMLU · ARC · Logic · Commonsense).**
- `runtime/eval/benchmark.sh` đổi sang bộ test lấy MẪU đại diện từ các benchmark nổi tiếng (toán suy luận, sinh code,
  kiến thức, suy luận khoa học, commonsense, sửa lỗi, làm-theo-lệnh) — chấm theo từng bộ + tổng. Như cách các hãng đo trí tuệ.
- Kết quả v1.21: **12/12 = 100%**. Trang chủ hiển thị điểm + xu hướng theo phiên bản (từ eval-history.tsv).

## v1.21 — 2026-06-16
**Trang chủ mới đẹp + benchmark độ thông minh công khai; install dẫn thẳng vào WEB setup.**
- **Trang chủ** `site/index.html` thiết kế lại: hero gradient + hiệu ứng (logo bob, blob float, reveal-on-scroll),
  chữ tinh gọn, mục **"Độ thông minh — đo lường công khai"** hiển thị điểm benchmark theo phiên bản (make-release inject từ `eval-history.tsv`).
- **Install dễ hơn:** thông điệp cuối DẪN bằng **link web chat** (`http://<ip>:8787`) → ⚙️ kết nối Claude/Codex (device-auth, mở điện thoại được) ngay, thay vì bắt nhớ lệnh.

## v1.20 — 2026-06-16 (top-5 #2: Project Memory)
**`octopus project-memory` (pm) — mỗi dự án một bộ nhớ bền để AI hiểu nhau hơn, không đọc lại từ đầu.**
- `runtime/memory/project-memory.sh`: quản lý `project.memory.json` per-project (architecture / known_issues / coding_style /
  business_rules / lessons) tại `WORKER_HOME/memory/projects/<slug>.memory.json`. Lệnh `show|init|set <field> <v>|add <field> <v>|path`.
  Local-first, JSON phẳng, neo vào memory/rules sẵn có — additive. `octopus pm show` / `octopus project-memory ...`.

## v1.18 — 2026-06-16
**Khung chat web chuyên nghiệp hơn.**
- Tin người dùng: ô **trắng chữ đen**, BỎ avatar (gọn, đúng vai).
- Nhãn trả lời rõ engine: **🐙 Octopus › Claude** / **🐙 Octopus › Codex** (Octopus điều phối, engine sau).
- **📋 Sao chép** nội dung (mọi tin) + **✎ Sửa & gửi lại** (tin của bạn → đưa lại vào ô nhập để sửa & yêu cầu lại) — hiện khi hover.

## v1.17 — 2026-06-16 (v2.0: ĐÀI QUAN SÁT web realtime)
**Web "Đài quan sát" — xem AI đang làm gì REALTIME (SSE, chỉ đọc, redact secret).**
- **`GET /api/observe/stream`:** SSE chỉ đọc tail realtime `loop.log` mới nhất (`reports/auto-loop`) — ≤80 dòng đuôi
  làm bối cảnh rồi theo dõi dòng mới. Mỗi dòng qua `redact()` ẩn secret (`sk-/ghp_/github_pat_/xox*/JWT/AKIA/AIza`,
  `*_TOKEN/SECRET/PASSWORD/API_KEY=…`, `Bearer …`). không đọc `.env`, không ghi gì; tự bám file mới (xoay phiên),
  heartbeat 15s. 0 dep mới. Test `test_web_observe.py` (non-leak + chọn file mới nhất) trong smoke-test.

## v1.16 — 2026-06-16 (v2.0: Eval/Benchmark seed)
**`octopus eval` — scorecard đo lường (OpenAI: model mạnh vì ĐO LƯỜNG).**
- `runtime/eval/scorecard.sh` tổng hợp từ dữ liệu SẴN CÓ (runtime/loops/*/meta + done/report): số phiên closed-loop,
  tỉ lệ hoàn tất, có báo cáo, thời lượng TB, tri thức tích lũy. `octopus eval` / `eval list [N]` / `/eval`. Local-first, 0 dep, không thêm engine.

## v1.15.1 — 2026-06-16
**Fix web LAN bị mất khi chạy lại installer.** setup_services GIỮ NGUYÊN `OCTOPUS_HOST` đã chọn (vd 0.0.0.0 LAN) thay vì ghi đè về 127.0.0.1 → `http://<ip-lan>:8787` không bị "lỗi" sau update.

## v1.15 — 2026-06-16 (hợp nhất việc daemon — web parity + Knowledge từ closed-loop)
**Web ngang terminal thêm: xem Bằng chứng + Tri thức (chỉ đọc); closed-loop tự ghi tri thức từ thất bại.**
- **Web xem bằng chứng (`GET /api/evidence`):** ≤20 phiên `auto-*` gần nhất, chỉ metadata an toàn `id/ts/goal/test`
  + cờ `done/reported` (suy từ sự tồn tại file) — không đọc log/report/work → không lộ secret. Soi gương `/evidence`+`/loops`.
- **Web xem Tri thức (`GET /api/knowledge` + modal 🧠):** ≤20 record gần nhất (chỉ `id/ts/type/title`), render `textContent` (an toàn XSS).
- **Closed-loop tự học từ thất bại:** `octopus-auto` ghi 1 knowledge record (type=error, cause/fix/lesson) khi `FINAL_STATUS=failed`,
  log test đã **che secret** (redaction). Pass không ghi (tránh bloat). Lỗi ghi tri thức không làm fail job. Ledger trung thực.
- `knowledge.sh`: thêm `--outcome`. Test hồi quy `test_web_evidence.py` + `test_octopus_auto_knowledge.sh` nối vào smoke-test.

## v1.14.3 — 2026-06-16
**Chat terminal tiến hoá ngang Claude Code: spinner + đồng hồ + token REALTIME.**
- Đang nghĩ: spinner `⠋ đang nghĩ… Ns` đếm giây sống (như `✢ Ebbing…` của Claude Code), tự tắt khi có token đầu.
- Trả lời stream realtime (tail theo tiến trình claude). Cuối câu: `⏱ <giây>s · <N> tokens · <tok/s>`.
- Phân vai rõ: khung 🧑 Bạn / 🐙 Octopus tách hẳn.
- Fix installer: `curl|grep -m1` gây SIGPIPE (exit 23) dưới `set -e` → tải vào biến trước rồi grep (`update` dry-run sạch).

## v1.14.2 — 2026-06-16
**Chat terminal phân VAI rõ ràng (Bạn / Octopus) + khung nhập gọn.**
- Lượt người dùng: khung `╭─ 🧑 Bạn ─ <mode·chat · project>` + dòng nhập `╰▸`; lượt Octopus: khung `╭─ 🐙 Octopus`.
  Hết dính 2 vai vào một dòng — đọc rõ ai nói gì, Enter để gửi.

## v1.14.1 — 2026-06-16
**Sửa "update không thấy đổi": cài lại CLI + banner đồng bộ version trên mọi server.**
- `fetch_platform`: chỉ bỏ qua tải khi local >= remote; remote MỚI HƠN thì tải đè → `update` thật sự lên bản mới (trước đây bỏ qua nếu đã có runtime/ nên không bao giờ cập nhật code trên máy đã cài).
- `setup_motd`: banner SSH đồng bộ v hiện tại + nhắc dùng `octopus` (không bắt gõ claude/codex).
- `setup_runtime` luôn cài lại toàn bộ CLI (octopus/knowledge/…) vào /usr/local/bin → gõ `octopus` luôn là bản mới nhất.

## v1.14 — 2026-06-16 (Knowledge Layer + neo roadmap v2.0)
**Bổ sung năng lực theo OCTOPUS IMPROVEMENT REVIEW — không đập đi xây lại, chỉ cộng thêm.**

### Added
- **Knowledge Layer** (`runtime/knowledge/knowledge.sh`, lệnh `octopus knowledge` / `/knowledge`): flat-file local-first,
  biến mọi lỗi/quyết định/bài học/AAR thành tri thức TÁI SỬ DỤNG (`add/search/list/show/stats`), neo vào memory/lessons +
  decision-log. Vòng tự cải tiến nay tự ghi 1 tri thức mỗi chu kỳ thành công (AAR→lesson).
- **Octopus Terminal Chat đủ lệnh theo spec:** thêm `/provider claude|codex|gpt|local`, `/mode chat|code|review|audit`,
  `/run <việc>`, `/status`, `/history`, `/clear` (alias additive vào lệnh sẵn có) — `octopus` là CỬA VÀO chính, Claude/Codex là engine sau.
- **Kim chỉ nam** `docs/IMPROVEMENT-REVIEW.md`: học từ thế giới (Claude/Codex/ChatGPT/DeepSeek/OpenAI/Cursor/Windsurf/Devin/Git/Linux),
  mô hình ĐỘI NHIỀU VAI (architect/coder/reviewer/tester song song) + ĐÀI QUAN SÁT trung tâm + ưu tiên v2.0
  (Knowledge/Project Memory/Decision History/Training Data/Eval-Benchmark/Capability Router). Tất cả additive.
- **Kỷ luật "học từ Claude Code":** prompt daemon BẮT BUỘC lập kế hoạch + nêu nguyên nhân gốc + phạm vi ảnh hưởng trước khi sửa
  (cấm: thấy lỗi → sửa ngay → vỡ chỗ khác).

## v1.13 — 2026-06-16 (hợp nhất, hướng v2.0)
**Web chat render Markdown + nhãn trung thực — hợp nhất việc tốt từ vòng tự cải tiến.**
- **Markdown an toàn trong bong bóng chat:** code block ```...```, inline `code`, **đậm**, [link] (chặn javascript:),
  bullet list — escape HTML trước, 0 dependency. Stream xong tự render; lịch sử cũng render. Thu hẹp web↔terminal.
- **Trung thực hoá chế độ:** "Việc (kế hoạch→làm)" → **"Lập kế hoạch"** (web chỉ chat/kế hoạch, không sửa file thật;
  muốn làm khép kín thật thì dùng terminal `octopus /do`). Khớp đúng năng lực `/api/chat`.

## v1.12.1 — 2026-06-16
**Vá DỨT ĐIỂM lỗi auto-update (no write permission to npm prefix).**
- Chuyển Claude sang **native install** (`~/.local/bin`, người dùng-space) → auto-update ghi được trong home, hết lỗi quyền;
  gỡ bản npm global cũ ở `/usr` (nguồn lỗi); symlink `/usr/local/bin/claude` → native (mọi nơi dùng đúng bản).
- **Watchdog tự giữ native** + gỡ npm-leftover nếu tái xuất; **installer** tự `claude install` + ưu tiên PATH native
  → server cài mới không bao giờ dính lỗi này.

## v1.12 — 2026-06-16
**Bất tử + tự vá lỗi + kích hoạt Codex ngay trên web.**

### Added (tự-hồi-phục — quy tắc: không dừng trừ khi người dùng yêu cầu)
- **systemd `Restart=always`** cho web + daemon (thay tmux): tự bị ngắt/crash → chạy lại ngay; tự bật khi boot.
- **Watchdog 5 phút/lần** (`runtime/ops/octopus-watchdog.sh` + timer): phát hiện service dừng/TREO (loop.log đứng >45')
  → ghi chẩn đoán (journalctl) vào `health.log` → tự restart. Có **SELF-HEAL** tự vá lỗi đã biết
  (npm auto-update no-write-permission → tắt auto-update + chown node_modules; quyền creds…), idempotent.
- **Kích hoạt Codex TỪ WEB:** ⚙️ Cài đặt → "Kết nối / Kích hoạt Codex" → hiện link + mã (device-auth, hợp điện thoại)
  → đăng nhập ChatGPT → tự kết nối (poll). Endpoint `/api/codex/connect` + `/api/codex/state`.
- **Dải BOT + modal cài đặt:** hiện ai đang làm gì (🐙 Claude / 🔵 Codex) realtime; chọn model + persona.
- **Bake vào installer:** mọi server cài mới tự có web always-on + watchdog tự vá + tắt auto-update.

### Fixed
- Lỗi `✘ Auto-update failed: no write permission to npm prefix` — tắt auto-update (worker ổn định, cập nhật chủ động
  qua `octopus update`) + watchdog tự giữ trạng thái này.

## v1.11 — 2026-06-16
**Tự động hóa tuyệt đối (hết yes/no) + Codex↔Claude tự phân công, rà tới khi OK mới qua vòng.**

### Fixed (quan trọng — báo từ server khác)
- **HẾT bị ép hỏi yes/no.** Mọi lệnh gọi engine trong sản phẩm nay chạy NON-INTERACTIVE:
  `codex exec --dangerously-bypass-approvals-and-sandbox` (Octopus đã tự kỷ luật phạm vi) và
  `claude -p --permission-mode acceptEdits` ở mọi đường (kể cả `run-task.sh`). Cài ở server nào cũng tự chạy.

### Added (vòng lặp tự cải tiến — kỷ luật mạnh hơn)
- **QUY TẮC TỐI THƯỢNG bake vào prompt + rà soát:** mỗi thay đổi PHẢI làm hệ thống TỐT LÊN, tuyệt đối
  không làm tệ đi (regression) → reviewer bắt NEEDS-WORK nếu vi phạm.
- **Điều phối 2 chiều:** 🔵 Codex (kiến trúc sư) GIAO việc cụ thể → 🐙 Claude THỰC THI → 🔵 Codex DUYỆT.
- **Hội tụ tới khi OK:** vòng rà-soát↔sửa/thêm lặp tới khi reviewer duyệt OK (trần an toàn 4 lượt) MỚI commit;
  chưa đạt thì ghi BACKLOG + rollback để vòng sau làm tiếp.
- **Nghỉ không để trống (≤10-15'):** giữa hai vòng, một engine `reflect()` rà lại việc vừa làm + BACKLOG,
  ghi [BUG]/[IDEA] cho vòng sau. Codex/Claude tự nạp ngữ cảnh để bắt nhịp dự án.

## v1.10 — 2026-06-16
**HYBRID thật: Codex làm giám sát + phân công — trên web VÀ trong vòng lặp tự cải tiến.**

### Added
- **Web Hybrid hoạt động:** chọn 🔵 Hybrid/🟣 Multi → sau khi Claude trả lời, **Codex vào giám sát & bổ sung**
  (bong bóng 🔵 riêng). Banner web hiện trạng thái **Claude ✓ · Codex ✓/✗**. Codex chưa đăng nhập thì hiện
  ghi chú hướng dẫn bật (`/connect codex`) và vẫn trả lời bằng Claude — nút mode giờ có tác dụng thật.
- **Vòng lặp tự cải tiến có RÀ SOÁT kỷ luật:** mỗi vòng *implement → gate (dev-check) → **engine thứ 2 rà soát***
  (Codex nếu đã login, không thì Claude-critic) → **chỉ commit khi VERDICT: OK**. NEEDS-WORK thì sửa 1 lần
  theo góp ý rồi rà lại; vẫn chưa OK thì **ghi `reports/auto-loop/BACKLOG.md`** + rollback để vòng sau làm tiếp.
  "Không giấu dốt — bí thì kéo thằng khác vào đánh giá." Daemon đọc BACKLOG để ưu tiên việc còn thiếu.

## v1.9.3 — 2026-06-16
**Mượt + chạy tốt trên điện thoại.** Web chat responsive + render tối ưu.

### Fixed
- **Điện thoại:** giao diện responsive — sidebar lịch sử thành menu trượt (nút ☰ + nền mờ, tự đóng khi
  chọn cuộc), thanh AI/chế độ cuộn ngang, dùng `100dvh` (hết lỗi thanh địa chỉ Safari che ô nhập),
  textarea 16px (chặn iOS tự zoom), tôn trọng safe-area.
- **Mượt hơn:** typewriter nhả ký tự vào **text-node (appendData)** thay vì vẽ lại cả khối mỗi frame →
  không giật khi câu dài; chỉ auto-cuộn khi đang ở đáy (không giật khi bạn cuộn lên đọc).


## v1.9.2 — 2026-06-16
**Web tiến tới ngang terminal: chọn AI mode + chế độ Việc (kế hoạch→làm) ngay trên web.**

### Added
- **Thanh điều khiển web:** chọn **AI mode** (🟢 Single / 🔵 Hybrid / 🟣 Multi) + **chế độ**
  (💬 Chat / ⚙️ Việc). Chế độ Việc bơm khung kỷ luật (mục tiêu→kế hoạch→thực thi→tự kiểm chứng,
  AN TOÀN không sửa file thật trừ khi duyệt) → giao việc cho AI ngay trên trình duyệt.
- **North star cho vòng lặp tự cải tiến:** prompt daemon nay hướng về *web ↔ terminal ngang nhau, kỷ luật
  khép kín, tự học, chắt lọc SOTA tinh gọn* — để mỗi đêm Octopus mạnh dần đúng hướng.

## v1.9.1 — 2026-06-16
**Octopus Web realtime UX — như các app chat AI: timer sống, đếm token, chữ chảy mượt.**

### Added / Changed
- **Trạng thái realtime khi chờ:** ngay khi gửi, hiện **spinner + "đang suy nghĩ…" + đồng hồ giây sống**
  (⏱ cập nhật 100ms) → không còn ngồi nhìn màn hình trống mà sốt ruột.
- **Render mượt kiểu terminal:** delta gom vào hàng đợi, **nhả đều từng ký tự ~60fps** (typewriter),
  không nhảy cục; con trỏ nhấp nháy theo.
- **Số liệu cuối câu:** `⏱ <giây>s · <N> tokens · <tok/s>` (server đọc `usage`/`duration_ms` thật từ engine).

## v1.9 — 2026-06-16
**Octopus Web: lịch sử phiên chat + tốc độ nhanh như terminal.**

### Added
- **Lịch sử phiên chat:** sidebar liệt kê **5 cuộc gần nhất** + nút **＋ Cuộc trò chuyện mới**.
  Mỗi cuộc lưu trên server (`WORKER_HOME/web-chats/<id>.json`): bấm để mở lại, xoá (×), giữ ngữ cảnh
  (`session_id` của Claude) để chat tiếp. API mới: `/api/sessions`, `/api/session`, `/api/session/delete`.

### Fixed (tốc độ)
- **Chat web giờ nhanh ngang/hơn terminal.** Sửa 2 nút thắt: (1) đọc stdout bằng read-ahead khiến token
  bị dồn cục → đổi sang **line-buffered `readline`** (token hiện ngay); (2) bỏ việc spawn `claude auth status`
  mỗi lượt → **cache 30s**. Đo thực tế: TTFT web ~2.4s (terminal ~3.7s), token chảy đều mỗi ~0.5s.

## v1.8 — 2026-06-16
**Octopus Web — chat trên TRÌNH DUYỆT (giao diện như Claude, avatar 🐙) + /connect phát LINK OAuth.**

### Added
- **Giao diện web chat (`octopus web` / `/web`):** mở `http://localhost:8787` — khung chat đẹp như
  Claude (bong bóng người/Octopus, avatar 🐙, **streaming** từng chữ, con trỏ nhấp nháy), banner trạng
  thái kết nối + phiên bản. `octopus web --lan` để mở cho máy khác trong LAN (truy cập bằng IP NUC).
  Server thuần thư viện chuẩn Python (LEAN), stream qua SSE từ engine ẩn, giữ ngữ cảnh bằng `session_id`.
  UI tách riêng `runtime/web/index.html` để dễ chỉnh.
- **`/connect` phát LINK OAuth (như Claude/Codex):** mặc định chạy `claude auth login` → hiện đường link
  để mở trên trình duyệt/điện thoại đăng nhập. Vẫn giữ **`/connect token`** (dán `CLAUDE_CODE_OAUTH_TOKEN`)
  và **`/connect codex`** cho ai cần.

### Notes
- Web chat bind `127.0.0.1` mặc định (an toàn); `--lan` mới mở ra mạng. Không lưu mật khẩu;
  auth dùng phiên Claude sẵn có hoặc `CLAUDE_CODE_OAUTH_TOKEN`.

## v1.7 — 2026-06-16
**Chat thật như Claude (streaming, hết "vô thức") + /connect OAuth nổi bật + máy chạy xuyên suốt.**
Sửa đúng 3 thứ người dùng phản ánh: chat trả lời cứng/chậm, không thấy luồng kết nối, và lo máy ngủ.

### Fixed
- **Hết "trả lời vô thức":** mặc định khung chat giờ là **trò chuyện thật với Claude**, không còn
  tự đẩy mọi câu vào vòng lặp việc. Muốn Octopus tự làm khép kín thì gõ **`/do <việc>`** (hoặc `/auto`).
- **Chat nhanh & sống động:** `ask_claude` chuyển sang **streaming** (`stream-json`) — chữ hiện dần
  từng token như Claude Chat, không còn đứng im chờ rồi đổ một cục.

### Added
- **`/connect` (OAuth Claude Code) thành lệnh hạng nhất:** hiện rõ link đăng nhập trên máy mới,
  báo `✓ ĐÃ kết nối <email> · gói <plan>` khi đã đăng nhập, thêm **`/connect relogin`** đổi tài khoản.
- **`/chat` / `/do`:** tách rõ *trò chuyện* (mặc định) và *giao việc khép kín*.
- **Keep-awake (`runtime/power/keep-awake.sh`):** máy chủ AI **chạy xuyên suốt kể cả khi MÀN HÌNH TẮT**
  hoặc ngắt SSH — mask suspend/hibernate + `logind IdleAction=ignore`. Tự áp dụng trong `install.sh`
  (`apply`/`status`/`undo`, có rollback).
- **Self-improve daemon (`scripts/self-improve-loop.sh`):** vòng lặp tự cải tiến chạy nền trong tmux
  (sống sót khi đóng SSH); mỗi chu kỳ Claude chỉ sửa file → bash gate (dev-check) → commit nhánh
  `auto/self-improve`, **không bao giờ tự publish**. Logs ở `reports/auto-loop/` (đã gitignore).

## v1.6 — 2026-06-16
**Octopus Chat kết nối & chat được như Claude — ngay trong Octopus.** Sửa các lỗi thật tìm khi rà soát/test.

### Added
- **`/connect` (và `/login`) trong Octopus Chat:** đăng nhập **Claude** (`claude auth login`) +
  **Codex** (`codex login`) OAuth ngay trong khung chat — không cần mở Claude Chat riêng.
- **Chat thật trong Octopus:** gõ tự nhiên → Claude trả lời ngay trong Octopus (qua engine ẩn);
  banner hiện trạng thái **Kết nối: Claude ✓/✗ · Codex ✓/✗**; chưa kết nối thì nhắc `/connect` rõ ràng.
- **Nút cập nhật phiên bản:** `techgon-worker update` (và `/update` trong chat) — kiểm tra & cập nhật
  lên bản mới nhất trên octopus.techgon.com bằng 1 lệnh.

### Fixed (tìm khi rà soát + test sản phẩm)
- `codex_ready`: hybrid/multi tự **fallback sang Claude** khi Codex chưa đăng nhập (trước đây chạy rỗng).
- `octopus-work list` exit non-zero (SIGPIPE) làm hỏng pipe — nay luôn exit 0.
- `conn_codex` báo sai trạng thái Codex.
- Mở rộng `tests/smoke-test.sh` phủ lõi mới (route/intent/snapshot/auto/contract/ledger/queue) → **49/0 PASS**.

## v1.5 — 2026-06-16
**Octopus Chat + Task Contract + Evidence Panel.** Bước đầu biến `octopus` thành TRUNG TÂM ĐIỀU KHIỂN
(không phải Claude Chat). Bám North Star `docs/ULTIMATE-WORKFLOW.md` + `docs/OCTOPUS-CHAT.md`.

### Added
- **Octopus Chat** (REPL nâng cấp): gắn **project context** (`/project <dir>`), bộ chọn **AI mode**
  (`/single /hybrid /multi`) + **chat mode** (`/ask /plan /auto /debug /review /teach /safe`),
  palette lệnh: `/test /repair /resume /stop /report /evidence /snapshot /rollback /loops /queue
  /work /approve /reject /skill /memory`. Prompt hiện `[ai·chat] project ▸`.
- **Task Contract (Stage 1):** mỗi phiên auto ghi `task-contract.txt` (goal/scope/forbidden files+actions/
  done) + bơm ràng buộc cấm (.env/secret/key/vendor/prod…) vào hợp đồng kỷ luật của engine.
- **Evidence Ledger (Stage 15):** `ledger.jsonl` ghi mọi sự kiện (session/step/final) — xem qua `/evidence`.
- **Teach → memory:** `/teach <rule>` lưu rule theo project (`memory/rules/<project>.md`); `/memory` `/skill` xem lại.

### Roadmap (chốt với người dùng)
V1.5 Octopus Chat + Task Contract UI + Evidence Panel (bản này) · V1.6 Worktree Isolation + Merge/Discard Gate ·
V1.7 Session Lifecycle + Resume/Recover chuẩn · V1.8 Skill Pack Plugin System · V1.9 Eval Harness ·
V2.0 Gateway đa kênh + mobile/web nodes. (Tiến tới đủ 20 Stage + 12 lớp trong docs/ULTIMATE-WORKFLOW.md)

## v1.4 — 2026-06-16
**Đa-engine + tự phản biện + chế độ Single/Hybrid/Multi-AI.** So sánh SOTA (Fable 5/Opus 4.8/Codex/OpenCode)
và tự kiểm điểm → bổ sung các khâu còn thiếu so với scaffold hàng đầu.

### Added
- **Chế độ AI:** `--single` (chỉ Claude, nhanh/rẻ) · `--hybrid` (Claude + Codex song song, tự phân công,
  cứu nhau) · `--multi` (nền tảng Multi-AI, mở rộng thêm engine). Đổi trong REPL: `/single /hybrid /multi`.
  Mặc định theo `config/workflow.json.ai_mode`.
- **Đa-engine, tự phân công:** planner gán `engine` (claude/codex) theo thế mạnh; bước song song chạy
  Claude & Codex đồng thời rồi tổng hợp (`run_codex`, `pick_engine`).
- **Codex cứu viện:** khi Claude sửa tổng vẫn fail, Codex vào 1 lượt dưới test-gate của Octopus.
- **Tự phản biện (critic/"kiểm điểm"):** trước kiểm chứng cuối, AI (chỉ đọc) rà diff so baseline
  (đúng/sai, lạc phạm vi, bảo mật, thiếu sót) → có vấn đề thì sửa 1 lượt rồi mới verify.
- **Sổ backlog ý tưởng/lỗi** (`memory/ideas/backlog.md`): tự ghi việc chưa ổn/ý tưởng để vòng sau rà lại
  → vòng lặp cải tiến tuần hoàn.
- **Báo cáo so sánh SOTA + tự kiểm điểm** (`reports/benchmark-and-review-v1.4.md`), cập nhật mỗi vòng.
- Sửa `install.sh` REL_LINUX để cài mới từ web lấy đúng phiên bản.

### Roadmap (Multi-AI)
- Thêm engine: Gemini, GPT/Codex-API, DeepSeek, Ollama/local → N model phân công nhau trong cùng vòng lặp.
- Khung chat Octopus-Techgon đầy đủ (thoát hẳn giao diện Claude) với bộ chọn Single/Hybrid/Multi.

## v1.3 — 2026-06-16
**Thông minh hơn + tự học.** Octopus học từ phiên trước và phát hiện dự án rộng hơn.

### Added
- **Học hỏi (flat-file memory)**: sau mỗi việc ghi bài học vào `memory/lessons/`
  (mục tiêu, kết quả, model, **thời gian giờ**); trước khi lập kế hoạch, `recall_lessons`
  nạp bài học liên quan (theo từ khoá mục tiêu) vào hợp đồng kỷ luật → lần sau làm tốt hơn.
- **Tự phát hiện test/dự án đa ngôn ngữ**: Node (npm/jest/vitest), Python (pytest/unittest),
  Rust (cargo), Go, Ruby (rspec), PHP (phpunit), Java (maven/gradle), Make.
- **Dấu thời gian**: mỗi phiên in "⏱ Hoàn thành lúc: <ngày giờ>" + ghi vào báo cáo/bài học.

## v1.2 — 2026-06-16
**Workflow-driven, skill/tool-extensible, "hoàn thành tuyệt đối".** Octopus luôn chạy đúng
quy trình do người dùng thiết kế, tự quyết phương án tốt nhất, không hỏi yes/no.

### Added
- **Governor đọc & tuân `config/workflow.json`**: `loop.max_fix_attempts`,
  `loop.global_repair_rounds`, `loop.stop_on_blocked`, `model_routing.auto`,
  `discipline.snapshot_every_step`. Workflow bạn thiết kế thế nào, chạy đúng vậy.
- **Kiểm chứng cuối + tự sửa tổng** (`verify_and_repair`): sau khi xong các bước, chạy lại
  toàn bộ test; còn fail thì nạp toàn bộ lỗi cho Claude sửa tổng (model mạnh dần, mặc định opus)
  tối đa `global_repair_rounds` vòng → chốt `FINAL_STATUS` passed/failed/unverified.
- **Custom skill pack**: thư mục `<WORKER_HOME>/skills` (hoặc `workflow.json.skills_dir`)
  được add cho Claude (`--add-dir`) + nhắc trong hợp đồng kỷ luật.
- **Tool ngoài qua MCP**: `workflow.json.mcp_config` → `claude --mcp-config --strict-mcp-config`.
- **Tự nhận diện ý định** (`classify-intent.sh`): trong REPL `octopus`, gõ thẳng input →
  Octopus tự phân loại VIỆC (→ vòng lặp khép kín) hay CÂU HỎI (→ trả lời nhanh), không cần `/ask`.
- **`stop_on_blocked`**: dừng các bước còn lại khi 1 bước blocked/failed (nếu workflow bật).

### Changed
- `techgon-worker version` & banner đọc từ file VERSION (trước đây hard-code v1.0).

## v1.1 — 2026-06-15
**Disciplined closed-loop governor — Octopus điều phối, Claude là động cơ chấp hành.**
Octopus không chỉ cài đặt: nó đính kèm "mô hình tự động hoá có kỷ luật" ép Claude chạy
đúng quy trình, không đi sai hướng, không làm việc tự do — tự quyết & báo cáo, không hỏi.

### Added
- **`techgon-worker auto "<việc>"`** — vòng lặp khép kín 1 lệnh:
  plan → sửa → snapshot → test → (fail thì nạp lỗi vào lượt sau) → lặp →
  tách nhỏ chạy song song → tổng hợp → báo cáo. (`runtime/loops/octopus-auto.sh`)
- **Kỷ luật (governor):** Claude bị khoá quyền — chỉ `Read/Edit/Write/Grep/Glob`,
  không chạy shell; Octopus mới là bên chạy test, chụp snapshot, quyết vòng lặp.
  Khoá phạm vi theo từng bước; chế độ headless `--permission-mode acceptEdits` +
  prompt kỷ luật (`runtime/loops/discipline-prompt.md` → `config/octopus-discipline.md`):
  tự quyết an toàn, không hỏi, kết mỗi bước bằng `STEP_RESULT: ok|blocked`.
- **Snapshot/rollback** (`runtime/loops/snapshot.sh`): shadow-git ngoài dự án →
  mỗi bước 1 commit bất biến, không đụng `.git` thật; `techgon-worker rollback <id> [ref]`.
- **Resume:** tắt giữa chừng mở lại chạy tiếp — `auto --resume [--id <task>]`
  (state ở `runtime/loops/<task>/`: meta/plan/done/steps/reasoning).
- **Tự chọn model theo độ khó** (`runtime/loops/model-route.sh`): dễ→haiku, vừa→sonnet,
  khó→opus (override `--model`/`OCTOPUS_MODEL`). Stream suy luận thời gian thực dưới nhãn Octopus.
- **Giao diện là của Octopus:** cổng `octopus` lấy vòng lặp khép kín làm xương sống —
  gõ thẳng một việc = vào quy trình; `/ask` để hỏi nhanh; `/resume`, `/loops`, `/rollback`.
- **Workflow do người dùng thiết kế** (`config/workflow.json`) + lệnh `loops`, `snapshot`.

### Changed
- `octopus` REPL: mặc định mọi yêu cầu việc chạy qua governor (không còn chat trơn mặc định);
  Claude TUI gốc chỉ còn ở `/tui`.

## v1.0 — 2026-06-15
First release of the Techgon Universal Worker Platform.

**Principle:** the OS is only the host; the Worker Runtime is the product.
Do not clone the OS — build a reproducible worker runtime.

### Added
- Universal Linux installer (`installers/linux/install.sh`) with modes:
  online, offline, hybrid, plus `--dry-run`, `--healthcheck`, `--uninstall-safe`.
  Idempotent, logs every action, writes rollback notes, never deletes data,
  never formats disk, never breaks network/SSH.
- Core packages: openssh-server, curl, wget, git, unzip, jq, htop, nano, ufw,
  ca-certificates, gnupg, lsb-release; Docker + Compose; Node.js LTS; Claude
  Code CLI; Codex CLI. No desktop bloat.
- Worker Runtime under `/data/techgon-worker` (config, logs, snapshots,
  backups, projects, reports) + non-sensitive worker identity.
- Healthcheck (`healthcheck`) → Markdown + JSON reports.
- SSH readiness (`ssh-readiness`) + safe hardening (`ssh-hardening`,
  anti-lockout: password auth never auto-disabled).
- Firewall (ufw) with SSH allowed before enable; deny-incoming/allow-outgoing.
- Backup / restore / migrate — secrets, keys, node_modules, caches excluded.
- Task runner + token/speed statistics (`runtime/runner`).
- **Smart Core:** 9 agents (planner/executor/coder/browser*/terminal/tester/reviewer/
  reporter/memory), model connectors (Claude+Codex active; OpenAI/Gemini/DeepSeek/
  Ollama/local placeholders), flat-file memory, human-in-the-loop approval
  (SAFE_AUTO/REVIEW/APPROVAL/BLOCKED), risk-classified terminal (`safe-exec`),
  task loop (manual by default), ChatOps templates, local-first privacy, and a
  disabled-by-default Techgon Agent Model hook.
- Offline USB kit builder (`offline-kit/build-offline-kit.sh`).
- Release + publish tooling for octopus.techgon.com (private distribution);
  SHA256 checksums for every package; no secrets stored in repo/releases.
- Documentation: người dùng-guide, admin-guide, security model, offline/usb/vps/ssh.

### Security
- No plaintext secrets in repo or releases. Operators log in Claude/Codex via
  their own CLI; credentials never stored by the platform.

### Supported
- apt: Ubuntu 24.04 LTS, Ubuntu 22.04 LTS, Debian 12.
- dnf: AlmaLinux 9, Rocky 9, RHEL 9 (Fedora experimental) — added in v1.0 (firewalld instead of ufw).

### Roadmap
- Phase 2: more Linux distributions (pacman/zypper, RHEL offline rpm kit).
- Phase 3: Windows 11 / Windows Server.
- Phase 4: macOS.
