Pipeline anh lệnh: /check-email + /adap-apply -> /fable-real invest (spec 9-task/24-checklist) -> hmw Opus-5-MAX 2 đợt + lead-solo T6-T8 -> checklist verify. Thư ① 9c909007 (model-default Opus 5 MAX): TRỌN — filing 2-tuyến + probe-sau-restart 2-nguồn claude-opus-5[1m] + thư hub d432f5eab5cd + caveat (e) đóng. Thư ② 0df10df4 (pause-tiep Ctx soft-memory, sàn 7-khoản): EXECUTED - máy mind-check: scripts/session_ctx.py +542 dòng (7 phép + 2 phụ, 4 mức, draft/closed/--root/--session PIN, exit 0/1/3) - template .claude/templates/session-mind-template.md + wire 4 lệnh (pause C-bis+2bis+§1-carve-out, tiep §2.6+§3-ter, session-start Phase 3.5, session-end §L.b(l)+6.3-bis) - memory-budget: mind_ctx_kb=32 + tiep_reload + ĐÓNG ghost-wire session_ctx_kb (H18 class-2 sống S146->S153) - fault-inject 18/18 + 2 fix hậu-T4 (FI 6/6): GAP-#9 closed-mode E-0-con-trỏ CỜ->TRƯỢT (chặn gradient thưởng xoá-con-trỏ-trung-thực, họ bẫy F-1 của chính thư hub) · secrets-sweep +--root parity - số ĐO THẬT pause +117ms thay ước lệch 2.2-5.4x OWNER 2 quyết trong-phiên: - (38) VETO: 1-vai -> hub-form 3-vai (ctx-curator @pause + carve-out pause §1 · ctx-verifier @tiep · ctx-audit @2-bookend) - RENAME theo chuẩn hub/sisters để audit chéo: ctx-pause-check->ctx-curator, ctx-reload->ctx-verifier (đo đĩa 3 nhà; hub≠sister => SE theo HUB-form, tiền lệ S149). Roster 20->23, VALID_ROLES 23. Gap còn lại: ring5-audit (V5 truth-floor) hub CÓ, SE+VIPIX chưa -> slot (41). Bookend 2 đầu (12 spawn) + trio auto 1 vòng: - @open: H1 7f · H2 4f · H24 5+3 FLAG · ring1 28Đ/4T · ring2 8/8Đ + M-1 MISS thật · trio eval-MIXED-14/refine-3A-7B-4N/audit-25Đ-3T (re-chạy 7 instrument, 24 số byte-exact) - @close: H1 6f · H2 8f (baseline S154 = 16/10, tự sửa bản ~23/11) · H24 4+2 FLAG · ring1 47Đ/5T/1KC/53 · ring2 6/6Đ + 21 phép phụ - lead xử 11 mục: 9 FLAG H24 + 3 RESIDUAL ring2 + F-r2 (plugin 3 hard-site) + M-1 cả 2 persona + M9 14 sổ diary + F-3/F-5/F-6 + nit Sàn-5 + BÁC F-4 (fan-out không vào _index) #53 x14-cận-dưới, 0 mất dữ liệu (WRITE-lane derive-from-body · Agent-resume · SendMessage-resume x6). Datum: trio return-only hết miễn nhiễm (3/3 CLEAN -> 1/3). 4-A suýt xảy ra thật (bản committed của 2 file H24 là bản cắt 24%/48%). completeness-gate: 5 vòng đủ · phép ĐẠT 4 / TRƯỢT 0 / vacuous 0. State: Mig 67 · 89 bảng · 532 test · gotcha 83 · Sub-agents 23 · counter 27 · bundle FROZEN · governance-only 0 prod-code. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
37 KiB
sub-fable-invest-S153 — /fable-real investigator-codebase deep-pass: adopt TRỌN thư 0df10df4 (ctx soft-memory)
ĐANG GHI TRONG LÚC LÀM (chống #53). Trạng thái: ĐANG ĐỌC (progress-log dưới). Spec chính = PHẦN A/B sẽ append từng phần. Phiên S153 (phiên-logic 6) · 2026-07-26 · engine /fable-real 1 lượt.
Progress-log (append-only)
- Đọc thư ② full 8 mục (
broadcasts/inbox/2026-07-25-Governance-pause-tiep-upgrade-vong-ctx.md148 dòng) — 4 nhịp / FORM hub §3 / F-1 3-trạng-thái §4 / bảng 13 hàng §5 / SÀN 7 + 3 phép §6 / nấc trung thực §7. - Đọc draft lead
docs/governance/ctx-soft-memory-se-draft.md— bảng đối chiếu 7-khoản (6+7 đạt sẵn), SE-form_mind-s-<N>.md+### MIND-<k>, 4 câu (35)(36)(37)(38) + đề xuất 32KB/(b)/(b)/(a). - Đọc adap-report
docs/governance/adap-reports/2026-07-25-…-vong-ctx.md— nấc agreed; nền SE đo tươi 596.316B ≈ 149-199K tok. - Đọc
pause.md(5 bước; §2.6 A-D marker⟂narrative + machine-block ~140ms + auto-snap ròng ~64ms; §1 NGỪNG-spawn; §3.5 tick; §4 commit đích-danh). - Đọc
tiep.md(§0 Sàn-3 5 tín-hiệu + ORPHAN-L dual-accept; §2.5 tick; §2.5b thư; §2.6 đọc_context+ ghi_tiep-<i>SAU §3). - Đọc
session-start.mdBƯỚC 0.5b (engine-đắt) / 0.8 (scaffold máysession-scaffold.ps1 -New/-Ensure; a-bis bảng 5 file; ghost-wiresession_ctx_kb0-reader) / §2.1.8 tick máy / §2.1.9 trio AUTO giữa 2 bookend (scribe lead ghi return ngay; PIN đích-danh fail-closed; TUẦN TỰ CẤM song song; post-wave git-status assertion). - Đọc
session-end.md§6.3-bis (_endFROZEN idempotent NO-OP;markers:= chụp cân-sổ; NO-OP im lặng nếu 0 thư-mục). - Đọc
snapshot.md(guard skip-êm;_snapshot-<k>essence ≤3 dòng + machine-block; secrets-sweep gate exit-1 chặn commit; K đọc LIVEsnapshot_trigger_kdefault-if-absent 6). - template +
_context-s-6.md— FLOW mới-nhất-ở-CUỐI (NGƯỢC chiều_mindmới-nhất-ở-TRÊN — bẫy adopt-verbatim phải khai to). Session-6 FLOW còn trống (0 PAUSE). session_ctx.py— secrets-sweep rglob TRỌN session-dir ⇒_mindTỰ vào tầm quét Category-5 @snapshot §3; SECRET_PATTERNS 4 mẫu +_SECRET_REScompiled sẵn (rào-3 tái dụng 1-nguồn); machine-block anchor {subject,ts} non-wal; module tự ràng "add subcommand ONLY when a ritual needs it" ⇒ thêmmind-checklà HỢP luật module.session-scaffold.ps1— 2-mode New/Ensure, exit {0,2,3,4,5}, REFUSE-OVERWRITE, -RepoRoot fault-seam, pure-ASCII, template render {{N}}/{{TS}}/{{HEAD}}. KHÔNG cần sửa cho _mind (lead Write block-0 @cuối bootstrap — content thật, scaffold-rỗng không đạt "nội dung thật").governance-detectors.ps1C10 :1594-1665 (soi session-folder ABSENCE not LATENESS; C10 tự khai cần ts-compare mà "no reliable source" ⇒ rào-2 SE = phòng-thủ cho reader tương-lai) + C11 :1760-1810 (filtersub-*.md+^sub-<role>[-.]⇒ đặt tên artifact vai mớisub-ctx-audit-*.mdđể LỌT LƯỚI C11(b) diary-delta — trioharness-*-return.mdlà kẽ đã biết).- Máy đọc ts của SE (truy theo rào-2): grep scripts/ = 0 reader nội-dung
^ts:(session_ctx.py đọc mtime FS + git-ts; C10 không parse ts; scaffold GHI ts). ⇒ SE hiện KHÔNG có bộ-đọc-mốc kiểu hub; rào-2 vẫn giữ (marker_pause/_tiep/_snapshotĐỀU cóts:đầu dòng by-design — reader tương-lai cho C10-LATENESS sẽ quét_*); canonical regex đặt 1 chỗ trong session_ctx.py (_TS_KEY_RE), mind-check DÙNG nó, reader tương-lai BẮT BUỘC import cùng hằng. memory-budget.json— khuôn khoá owner ("key": val+"_key_..._note"lineage; tiền lệ OWNER-DELEGATED→LEAD-DECIDED =hmw_width._ratified_by@S149);session_ctx_kb=64ghost-wire honest_caveat tự dặn "(a) đọc khoá (b) ×1024 (c) gỡ dòng khi có reader" ⇒ wire reader trong cùng máy = đóng ghost-wire $0.- session-end.md §L.b(j)(ii) hình-B + (g-bis) ring1 khuôn AUTO/fail-safe/tuần-tự + (k) trio + §L.c gate 3-nhãn {ĐẠT-kèm-chứng/TRƯỢT/vacuous}.
- hmw.js — VALID_ROLES đếm tay = 20; writeGuard :233 liệt danh read-only theo TÊN (thêm vai = sửa cả 2 chỗ); WIDTH_CAP 20 mirror-hardcode (canonical hmw_width.cap); STOP-HARD role ∉ whitelist; SÀN-1 ≥3 task đòi args.run; C1 lane-chết-phải-kêu; sửa hmw.js = re-invoke ăn ngay (script đọc per-invoke), KHÁC agent-file-mới cần RESTART CLI (SE đo S120/S121 — hub §7 quan sát ngược, tin số SE).
- wal-flush.ps1:13 — 4 path gồm
.claude/sessions/⇒_mind(nằm TRONG path 4 sẵn) tự vào hook + tín-hiệu ⑤ sẵn phủ ⇒ KHÔNG cần tín-hiệu Sàn-3 mới (không thêm path hook nào). - bookend-open-synthesis S153 — #53 8/9 garble lượt-1 (6 vai ghi-đĩa-trong-lúc-làm vớt được; 2 return-only resume; trio hết miễn nhiễm); M-1 persona stale-cadence (vai mới PHẢI hình-B từ lúc sinh); queue #8 @closeout ĐÃ nhận fix C11(b) filter
(sub|harness)-*— spec KHÔNG trùng việc, chỉ đặt tên artifact vai mới khớp cả filter cũ lẫn mới; owner-gated (35)-(38) nay được anh ủy quyền qua lệnh pipeline này. - h24-signal-write.ps1 header — khuôn máy nhà: exit {0,2,3}, enum đọc LIVE cấm hardcode, atomic temp+move, -RepoRoot fault-seam, pure-ASCII. (session-counter-tick.ps1 SKIP đọc — khuôn đã nắm từ 3 máy cùng họ; khai.)
- Truy vấn đề bài "máy đọc ts của SE là script nào": grep scripts/ = KHÔNG có reader nội-dung
^ts:nào đang sống (session_ctx.py dùng git-ts + FS-mtime_snapshot-*; C10 tự khai thiếu nguồn ts để đo LATENESS). Marker_pause/_tiep/_snapshotđều mangts:đầu dòng by-design ⇒ reader "mốc gần nhất" TƯƠNG LAI (C10-LATENESS gap) sẽ quét_*⇒ rào-2 giữ, canonical regex_TS_KEY_REđặt MỘT chỗ trong session_ctx.py, mind-check dùng nó, reader tương-lai bắt buộc dùng cùng hằng. - PHẦN A (spec 3-mục) — dưới
- PHẦN B (check-list 24 phép) — dưới
PHẦN A — PROPOSED-SPEC 3-mục (khuôn H21) — adopt TRỌN thư 0df10df4
Mục 1 — Mục-tiêu + 4 quyết định RESOLVED
Mục-tiêu: cứu 4 lớp trí-nhớ MỀM (gói-turn · hướng-tiếp · kế-hoạch-suy-nghĩ · đang-thảo-luận) qua mỗi /pause→/tiep bằng: tệp _mind-s-<N>.md trong .claude/sessions/session-<N>/ (block ## MIND-<k> 5 mục A-E, mới-nhất-ở-TRÊN, block cũ bất biến) + 4 nhịp ghi-ra-đĩa (block-0 @cuối bootstrap · refresh @pause · đối-chiếu+nạp-lại-rút-gọn @tiep · mục E gom dòng-sống MỌI spawn/engine-run) + máy-$0 mind-check (extend session_ctx.py) + 1 vai ctx-audit @2 bookend + trần trỏ-khoá mind_ctx_kb. Sàn 7-khoản: khoản 6+7 SE đạt sẵn (hook 4-path :13 + single-writer⟂monitor); khoản 1-5 = spec này. BINDING "điểm dừng phải RẺ" giữ nguyên: pause/tiep thêm ~0.3-0.6s máy + 0 spawn.
Nhãn ủy quyền chung (ghi vết bắt buộc — tiền lệ hmw_width._ratified_by): 4 quyết định dưới = OWNER-DELEGATED → ENGINE-PROPOSED → LEAD-DECIDED @S153 (lời anh: "Cho /fable-real đọc kỹ và invest sau đó ra spec… Sau đó cho hwm Opus 5 MAX xử lý" = ủy quyền pipeline; KHÔNG PHẢI "owner chốt từng số"). Anh veto 1 edit bất cứ lúc nào. CẤM về sau tự nâng thành "owner chốt" (bài C8b @S149).
- (35) RESOLVED:
mind_ctx_kb = 32(KB). Đo được: 1 block A-E ước 1-2KB; SE 1 phiên-logic p=1-3 pause (S147-S152) ⇒ file điển hình <10KB ⇒ 32KB = ≥3× headroom; khớp hub O-4 (so-fleet được; hub tự khai 32 không rút từ dữ liệu — SE cũng khai vậy, đổi sau khi có số đo dogfood)._contextgiữ cap RIÊNG 64. Khoá đặtmemory-budget.jsoncạnhsession_ctx_kb, kèm_mind_ctx_kb_setvết ủy quyền. Lệnh CHỈ trỏ khoá (B1). - (36) RESOLVED: (b) — máy-$0 chạy MỖI pause (draft + full), vai kiểm CHỈ spawn @2 bookend. Lý do đo được: 1 spawn = floor 100K tok (
harness_floor.rounded_up_tokens=100000) + phút-cấp, còn pause hiện = dò 5ms + machine-block 140ms + sweep 64ms — spawn-mỗi-pause làm điểm dừng đắt lên bậc-độ-lớn = vi phạm BINDINGgoi-chot §3(ràng hub đặt riêng SE); hub-owner chọn (a-nguyên) cho NHÀ HUB nhưng chính thư §7 dặn "chuẩn bị sẵn núm hạ tần suất phóng vai phụ, vì đó là chỗ tốn nhất". Hệ quả đẹp: KHÔNG cần carve-out O-1 —pause.md §1 "NGỪNG spawn"giữ NGUYÊN VẸN (hub phải carve-out (a) vì họ spawn mỗi pause; SE không spawn ở pause thì không có gì phải carve). O-2-ARM (đo per-layer $0) giữ làm phép-KIỂM trong dogfood đúng ghi chú hub. - (37) RESOLVED: (b) — nạp-lại NỀN RÚT-GỌN mặc định @tiep, danh sách trỏ khoá MỚI
tiep_reload. Số: nền-full SE đo tươi @S153 = 596.316B ≈ 149-199K tok (instrument-backfill.txt) — nặng hơn nền hub (439.328B ≈ ~110K) 1.36×; ràng mềm hub-owner = ~150K/cửa ⇒ full-reload nuốt trọn budget một cửa chỉ để nạp. Rút gọn = {STATUS đoạn CURRENT · HANDOFF segment mới nhất · WAL ≤40 dòng ·_mind-s-<N>.md·_context-s-<N>.md} ≈ 40-60K tok (input one-shot, cache-được). Khai lệch-hub-có-lý-do trong thư hồi đáp (hub §8 xin đúng số này). Phạm-vi từng mục khoanh trong_notecủa khoá (khuôn hub "đo theo phạm-vi từng mục đã khoanh trong cấu-hình"). - (38) RESOLVED: (a) — 1 vai
ctx-auditgộp 3 nhịp hub thành 2 lượt chạy (@open + @close, kiểm HỒI-TỐ mọi block/cửa của phiên). Sàn khoản 7 chỉ đòi GHI ≠ KIỂM: GHI = lead (single-writer_mind) ⟂ KIỂM = ctx-audit (+ máy $0 mỗi cửa). Sàn khoản 5 đạt: vòng soi độc lập 2 đầu phiên, quyền phán TRƯỢT (verdict trong return; KHÔNG tự bắn cờ hệ-thống — lead hợp nhất, mirror hub vai-3). 3-vai hub = FORM (thư §6 liệt "số vai" vào phần tự-quyết). Roster 20→21: hmw_width.cap=20 ⇒ full-roster sweep tương lai sẽ LOUD-skip 1 lane — NÊU OWNER như câu hỏi riêng, KHÔNG tự đổi số (O-7 là điểm ký của owner).
Khoá/số mới (đặt ở memory-budget.json):
"mind_ctx_kb": 32+"_mind_ctx_kb_set": vết OWNER-DELEGATED @S153 + nguồn số (hub O-4) + đơn vị KB reader ×1024 + "anh veto 1 dòng thì đổi"."tiep_reload": { "mode": "rut-gon", "sources": [ "docs/STATUS.md :: đoạn CURRENT STATE", "docs/HANDOFF.md :: segment mới nhất", ".claude/WAL.md", ".claude/sessions/session-<N>/_mind-s-<N>.md", ".claude/sessions/session-<N>/_context-s-<N>.md" ], "_note": <lý-do + số 596KB vs ~40-60K + reader = nghi-thức /tiep (AI) — khai thẳng chưa có script-consumer, khác class ghost-wire vì hành-vi tiêu thụ mỗi tiep + dogfood đo> }.- SỬA
"_session_ctx_kb_honest_caveat"→"_session_ctx_kb_reader": reader THẬT đầu tiên =mind-checkphép-phụ-8 (stat_contextvs 64×1024, cờ khi vượt) — làm đúng 3 điều note cũ tự dặn {(a) đọc khoá (b) ×1024 (c) gỡ dòng khi có reader}. Số 64 KHÔNG đổi (owner-set @S146).
Mục 2 — SPEC-LIST từng file (task chia cho hmw + lead)
Ranh cứng: T1-T5 = wave hmw (worker). T6-T7-T8 = LEAD-SOLO — command
.md+memory-budget.json+ docs canonical là governance-authoring single-writer (session-start.mdBƯỚC 0.5 H6.1; hub §7 "lời lệnh là quản-trị, chỉ một người ghi"). Wave vẫn 1 run-folder chung; lead làm T6-T8 song song lane. Restart chia 2 đợt: phiên này land FILE; nghi-thức mới + vai mới ĂN từ phiên sau restart CLI (command no-hot-reload + agent-file-mới cần restart — SE đo S120/S121; hmw.js thì re-invoke ăn ngay). T9 = phiên sau.
T1 — MÁY mind-check (extend scripts/session_ctx.py) — role: implementer-backend · effort M · depends: —
Vì sao extend python thay vì .ps1 mới (trả lời đề bài "tái dụng được không?": ĐƯỢC, và NÊN): (i) rào-3 tái dụng ĐÚNG _SECRET_RES compiled sẵn — máy .ps1 mới phải cài bản regex thứ 2 = 2-sự-thật, đúng thứ rào-2 cấm; (ii) hằng _TS_KEY_RE đặt cùng module với mọi parser session-file hiện có ⇒ reader-mốc tương-lai (C10-LATENESS) buộc dùng chung; (iii) session-dir resolution + khuôn CLI có sẵn; (iv) module header tự cho phép "add one ONLY when a ritual actually needs it" — 3 nghi-thức sắp gọi thật; (v) cùng runtime đã trả 140ms machine-block ⇒ ước wall-clock tin được. .ps1 #30 không áp (không sinh .ps1); python giữ ASCII-only-source (unicode qua \uXXXX escape cho nhãn "[đã che …]").
Nội dung: module-level _TS_KEY_RE = re.compile(r'^[ \t]*ts[ \t]*:', re.I | re.M) (+comment canonical-single-truth); subcommand mind-check --session N [--draft FILE] [--closed] [--root PATH]:
- 7 phép chuẩn: (1) rào-1
^[ \t]*>[ \t]*anh[ \t]*:trong vùng nội-dung ⇒ TRƯỢT (verbatim lời anh chỉ sống ở_contextFLOW) · (2) rào-2_TS_KEY_RE⇒ TRƯỢT · (3) rào-3_SECRET_RES⇒ TRƯỢT, ngoại lệ nhãn che[đã che <8-hex>]⇒ ĐẠT · (4) con-trỏ E block TRÊN CÙNG 3-trạng-thái {giải-được=đạt · đang-chờ (cha có)=CỜ khi mở / TRƯỢT khi đóng · hỏng (cha không)=TRƯỢT mọi chế-độ}; kẽ chép nguyên văn thư §4: TÊN-TỆP-SAI-trong-thư-mục-thật đọc thành đang-chờ, tới closed mới siết — KHAI, không tả thành tính năng · (5) số-hiệu: duy nhất + block top ≥ mọi số dưới (KHÔNG neo công-thức đếm — nhà đổi công-thức vẫn kiểm được, đúng hub §3) · (6) bất-biến |block| ∈ {p, p+1}, p = ĐẾM ĐĨA_pause-*.md+pause-*.md(dual-accept mirror ORPHAN-L); CẤM lấy p từmarkers:/mind-blocks:tự khai — dòng tự khai CHỈ để cross-check ⇒ lệch = cờ-INFO (hub đo khai-THIẾU thật; đĩa là nguồn duy nhất) · (7) trần/nén:size(_mind)vsmind_ctx_kb×1024 đọc LIVE từ memory-budget.json (thiếu khoá ⇒ exit 3 fail-loud, khuôn H24-2 cấm default); vượt ⇒ CỜ + in hướng dẫn "nén block CŨ NHẤT trừ block-0 + top; <3 block ⇒ TỪ-CHỐI nén, giương cờ vượt trần". - 2 phép phụ (khai riêng, không tính vào 7): (8)
size(_context-s-<N>.md)vssession_ctx_kb×1024 ⇒ cờ — reader THẬT đóng ghost-wire H18 · (9) cấu trúc block: 5 mục A-E hiện diện hoặc(trống — khai); mục D mỗi ý mang nhãn{mới-nêu|đang-cãi|gần-chốt|treo-chờ-anh}⇒ thiếu = trượt-cấu-trúc. - Enclosure use⟂mention: chỉ quét DƯỚI
<!-- MIND-RULES-END -->(khối luật đầu tệp CHỨA chuỗi cấm để giải thích — grep trần tự đỏ oan, thư §3 + feedback citation-trap). - 4 mức {đạt·trượt·cờ·bỏ-qua-có-khai} per-phép; exit 0 = 0 trượt · 1 = ≥1 trượt · 3 = config/state. Chế-độ: draft (kiểm nháp TRƯỚC chèn: rào 1-3 + số-hiệu-draft PHẢI == count-on-disk; bỏ phép 6/7) · closed AUTO khi
_endtồn tại (--closedchỉ để fault-inject) ·--sessionBẮT BUỘC KHÔNG default-latest (thư §3 "input chỉ đích danh — 2 cửa sổ song song sẽ đua") ·--root= seam fault-inject (mirror-RepoRoot). Tên-sai-phải-NÊU-tên:_mind-s-<N>.mdvắng ⇒ glob*mind*; có ứng viên ⇒ in đúng tên sai trong lý-do bỏ-qua; closed-mode ⇒ TRƯỢT. - Ước wall-clock ~140-300ms/lượt (cùng runtime machine-block 140ms đã đo; T4 đo thật).
T2 — TEMPLATE MỚI .claude/templates/session-mind-template.md — role: implementer-frontend · effort S · depends: —
Ruột: header sID + <!-- MIND-RULES-START --> khối luật {3 rào MỖI RÀO KÈM LÝ-DO ĐO ĐƯỢC (rào-1: lời anh = nguồn-duy-nhất ở _context FLOW, tệp mềm chỉ trỏ PAUSE-<k> · rào-2: marker SE _pause/_tiep/_snapshot mang ts: đầu dòng by-design, reader-mốc tương-lai quét _* không lọc tên — regex canonical = session_ctx.py:_TS_KEY_RE, cấm cài bản 2 · rào-3: block bất biến ⇒ secret lọt là vĩnh viễn; ngoại lệ duy nhất [đã che <8-hex>]; quét nháp TRƯỚC chèn) + luật mới-nhất-ở-TRÊN chèn dưới <!-- MIND-TOP --> (🔴 khai to: NGƯỢC chiều _context FLOW mới-nhất-ở-CUỐI — đừng chép khuôn bên kia) + số-hiệu = ĐẾM block hiện có TRƯỚC khi chèn, block-0 chiếm số 0 + block cũ BẤT BIẾN, ngoại lệ DUY NHẤT nén-vượt-trần (block giữa, verbatim còn trong git) + việc-ĐÃ-CHỐT chỉ con-trỏ WAL/HANDOFF CẤM chép + mục trống ghi (trống — khai)} + <!-- MIND-RULES-END --> + <!-- MIND-TOP --> + skeleton block-0 (## MIND-0 — {{TS}} @ {{HEAD}} (window 1) + 5 heading A-E). Schema block trong khối luật dùng placeholder <k> để parser ^## MIND-\d+ không false-match (mirror trick template _context :32). Header block CHỨA ts trong dòng heading (sau em-dash) — KHÔNG phải key ts: ⇒ không phạm rào-2.
T3 — PERSONA MỚI .claude/agents/ctx-audit.md — role: implementer-backend · effort M · depends: —
INFORM-only · propose-only · read-only đúng khuôn monitor nhà (KHÔNG Write/Edit — chặn-bằng-thiếu-tool); frontmatter model: opus + effort: max (worker-tier-pin S124). Hình-B từ lúc sinh (datum M-1 ring2 @S153: persona lead-*-auditor còn dạy cadence cũ — CẤM chép các khuôn retired: consent-gate / OVERDUE-per-phiên / "không chạy mỗi phiên"). Nhiệm-vụ: @open {block-0 tồn tại + content-thật (≥1 nội-dung máy-khuôn-không-tự-sinh: tên 1 ý D / 1 E-verdict — metadata ts/hash KHÔNG tính, thư §6) + carry: block D của _mind phiên trước có ý treo-chờ-anh/gần-chốt nào bị rơi? + đọc output mind-check (KHÔNG re-implement máy) + gieo MỒI-NGẦM: chọn 1 ý chưa-chốt, trả trong return để lead scribe ra đĩa TRƯỚC pause đầu (khai kẽ: single-lead ⇒ tính mù chỉ đạt xuyên-cửa-sổ)} / @close {kiểm HỒI-TỐ 5-khoản MỌI block (mục đủ/trống-có-khai · mục E phủ đủ mọi spawn/run của phiên — đối chiếu runs/ + WAL wf: · đã-chốt-chỉ-con-trỏ · 3 rào sạch · nhãn D đủ) + 4-khoản đối-chiếu (hướng-tiếp khớp WAL next:? lệch ⇒ TIN SỔ MÁY + cờ · kế-hoạch khớp bản-đồ việc? · ý D nào đã định-đoạt mà chưa đổi nhãn? · con-trỏ giải được?) + bất-biến chuỗi (tự đếm đĩa, so với output máy) + chấm mồi-ngầm}. Quyền phán TRƯỢT (VERDICT dòng-1 return: CTX-AUDIT: DAT|TRUOT|SKIP-CO-KHAI …; schema-nhỏ 3-field chống #53); KHÔNG tự bắn cờ hệ-thống — lead hợp nhất (hub vai-3). PIN đích danh fail-closed: nhận path _mind + run-folder; pin missing ⇒ TỪ-CHỐI (CẤM tự tìm "mới nhất"). Fail-safe NO-OP khi phiên không có _mind (in 1 dòng, cấm ĐẠT-ảo). Lead scribe return → sub-ctx-audit-open.md / sub-ctx-audit-close.md trong run-folder bookend NGAY khi trả (khuôn §2.1.9(c)) — tên sub-ctx-audit-* khớp lưới C11(b) sub-*.md hiện hành (và filter (sub|harness)-* queue #8) ⇒ vai mới NẰM TRONG lưới diary-delta ngay từ đầu, không lặp kẽ trio.
T4 — FAULT-INJECT máy (scratch-tree) — role: test-specialist · effort M · depends: T1+T2
Dựng cây tạm ở scratchpad (--root seam): render template THẬT (mẫu sạch = "đúng cái lời-lệnh THẬT sinh ra", thư §6 — CẤM tự chế mẫu dễ-xanh) + fixtures hỏng từng phép + đột-biến + mồi-ngầm-đĩa (markers: giả). Chạy trọn PHẦN B #1-#17 + #21; ghi bảng PASS/FAIL vào sub-file lane; số wall-clock thật (Measure-Command ×3) trả cho T6a điền vào pause.md.
T5 — ENGINE .claude/workflows/hmw.js — role: implementer-frontend · effort XS · depends: T3 (tên vai chốt)
+'ctx-audit' vào VALID_ROLES (comment 1 dòng: +S153 ctx soft-memory 0df10df4 — vai KIỂM lớp mềm, INFORM-only, @2 bookend) + thêm ctx-audit vào danh-sách read-only trong writeGuard (:233). KHÔNG đụng WIDTH_CAP (owner-số — chỉ NÊU câu hỏi roster-21 trong report).
T6 — LEAD-SOLO: wire 4 lệnh (governance single-writer) · effort M · depends: T1 (lệnh gọi máy phải có máy)
- a.
pause.md+§2.6-bis (đặt SAU (C) machine-derive, TRƯỚC (D) auto-snapshot — để secrets-sweep của (D) quét luôn block vừa chèn = lưới-2 sau máy-draft lưới-1): "Refresh lớp MỀM_mind-s-<N>.md: (1) soạn NHÁP block A-E {A gói-turn · B hướng-tiếp + nhánh-đã-loại · C kế-hoạch delta-suy-nghĩ KHÔNG chép checklist · D đang-thảo-luận + nhãn · E 1 dòng/spawn {verdict + con-trỏ}}; mục trống ghi(trống — khai); việc ĐÃ-CHỐT = con-trỏ WAL/HANDOFF, CẤM chép. (2)python scripts/session_ctx.py mind-check --session <N> --draft <file-nháp-scratchpad>— TRƯỢT ⇒ sửa nháp, CẤM chèn (rào quét dịch-trái). (3) Chèn TOP dưới<!-- MIND-TOP -->, số hiệu = ĐẾM block TRƯỚC chèn. (4) mind-check full. Trần = khoámind_ctx_kb(B1 — CẤM chép số vào đây); vượt ⇒ nén block CŨ NHẤT trừ block-0+top, <3 block ⇒ TỪ-CHỐI nén + cờ. File_mindchưa có (ca vào giữa) ⇒ tạo từ template + khai trễ. Chi phí đo/ước: +~0.3-0.6s máy (2 lượt ~140-300ms, cùng cỡ machine-block 140ms) + 1 Edit + ~1-3K tok soạn — 0 spawn (giữ §1 NGỪNG-spawn nguyên vẹn)." - b.
tiep.md§2.6 +bullet đọc: "Có_mind-s-<N>.md⇒ đọc TỪ TRÊN XUỐNG (block trên cùng giàu nhất) +mind-check --session <N>(~140-300ms)"; §3-bis +khối: "Bản NẠP-LẠI ≤15 dòng trong báo-cáo đầu — BẮT BUỘC nhắc ≥1 TÊN ý-D + ≥1 E-verdict từ block trên cùng (bằng-chứng NỘI DUNG — sàn khoản 3; câu 'đã nạp' suông KHÔNG tính); đối-chiếu 4-khoản: hướng-tiếp vsnext:(LỆCH ⇒ TIN SỔ MÁY + giương cờ) · kế-hoạch vs bản-đồ · ý D đã định-đoạt mà chưa đổi nhãn ⇒ cờ (đổi nhãn = việc lead, ghi ở block kế) · con-trỏ (máy đã chấm); + nạp NỀN RÚT-GỌN theo khoátiep_reload(B1 — CẤM chép danh sách tệp vào đây; ước ~40-60K tok input cache-được)." - c.
session-start.md: BƯỚC 0.8 (a-bis) +1 row_mind-s-<N>.md| lớp MỀM 4-tầng, block MIND- mới-nhất-ở-TRÊN | ghi block-0 @Phase 3.5 (lead) · refresh @pause.md §2.6-bis· đọc @tiep.md §2.6; +section "Phase 3.5 — Ctx soft-memory (adopt0df10df4@S153)" sau Phase 3: "(i) Lead Write_mind-s-<N>.mdtừ template — block-0 nội dung THẬT {A bootstrap-findings · B hướng phiên + vì-sao · C delta bản-đồ · D carry ý-treo từ_mindphiên trước + ý mới anh vừa nêu · E dòng-sống wave @open}; 'trước tiên' = trước pause đầu (hub §2: đặt CUỐI nghi-thức mở vì nội dung giàu nhất chỉ có sau các vòng kiểm). (ii) mind-check. (iii) Spawnctx-audit@open (AUTO, INFORM-only — máy TRƯỚC vai: bắt lỗi rẻ trước, đốt tiền sau) — PIN path_mind+ run-folder bookend; lead scribesub-ctx-audit-open.mdNGAY khi trả + M9 diary-seed on-behalf." + §2.1 roster list +1 dòng 🔎 ctx-audit. - d.
session-end.md: §L.b +(l): "🔎 ctx-audit @close (AUTO, sau các vòng đo, trước §L.c): PIN_mind+ run-folder bookend-close; kiểm hồi-tố 5-khoản + đối-chiếu 4-khoản + bất-biến chuỗi + chấm mồi-ngầm; lead scribesub-ctx-audit-close.md+ diary-seed."; §6.3-bis +2 ý:markers:thêmmind-blocks=<n>(chụp cân-sổ — máy KHÔNG BAO GIỜ đọc nó làm nguồn đếm, đĩa thắng) + "SAU khi ghi_end⇒mind-check --session <N>(closed-mode tự siết: con-trỏ đang-chờ → TRƯỢT) — TRƯỢT ⇒ xử lý TRƯỚC commit chốt." - Restart-note in đậm ở cả 4 chỗ sửa: nghi-thức ăn từ PHIÊN SAU restart CLI.
T7 — LEAD-SOLO: memory-budget.json 3 khoản (Mục 1) · effort S · depends: T1 land (reader có thật rồi mới gỡ caveat)
T8 — LEAD: docs + hậu-cần · effort S-M · depends: T1-T7
docs/STATUS.md §Sub-agents 20→21 (+1 dòng ctx-audit — canonical count); .claude/agents/README.md +row (INFORM-only, @2 bookend, decision-tree "không delegate việc ghi _mind"); docs/governance/ctx-soft-memory-se-draft.md — append khối "RESOLVED @S153 qua pipeline /fable-real→hmw (vết ủy quyền); 4 câu chốt (35)32 · (36)b · (37)b · (38)a" GIỮ draft làm vết; docs/governance/adap-reports/2026-07-25-…-vong-ctx.md — nấc agreed→executed (điều kiện: T1-T7 land + acceptance PASS; ghi rõ kiểm-chứng = CHƯA, chờ dogfood T9 — thư §7 cấm khai quá nấc); thư outbox → hub (khuôn §8): số nền SE 596.316B ≈ 149-199K + form SE (1-vai/2-bookend + máy-mỗi-pause, lệch hub-form có lý do BINDING) + 2 datum #53 (return-only hết miễn nhiễm ×2 @S153 · C11(b) trio-blind + fix filter) + kẽ T4 lòi thêm (nếu có) — gộp thư queue #10 bookend S153 được.
T9 — PHIÊN SAU (sau restart): registry-probe ctx-audit (BƯỚC 0.6b spawn-probe ALIVE) + dogfood 1 vòng THẬT 4 cửa + mồi-ngầm + đo wall-clock pause thật → điền số đo vào pause.md §2.6-bis nếu lệch ước >2× + báo hub kết quả dogfood (đóng vòng "lỗi gửi về hub").
Mục 3 — ACCEPTANCE per-task (lệnh chạy được + kỳ vọng)
| Task | Lệnh | Kỳ vọng |
|---|---|---|
| T1 | python scripts/session_ctx.py mind-check --session 6 |
session-6 chưa có _mind ⇒ bỏ-qua-có-khai + exit 0 (KHÔNG xanh-im: in lý-do + kết quả glob *mind*) |
| T1 | python scripts/session_ctx.py mind-check --session 6 --root <cây-tạm-thiếu-khoá-mind_ctx_kb> |
exit 3 fail-loud "missing key" (CẤM default) |
| T1 | python -c "open('scripts/session_ctx.py','rb').read().decode('ascii')" |
không exception (ASCII-source giữ) |
| T2 | grep -c 'MIND-RULES-START|MIND-RULES-END|MIND-TOP' .claude/templates/session-mind-template.md |
3 marker đủ; khối luật chứa đủ 3 rào + lý-do |
| T3 | grep -n 'INFORM-only|effort: max|model: opus' .claude/agents/ctx-audit.md + grep khuôn-retired (consent, OVERDUE.*mỗi phiên) |
3 hit đầu; 0 hit khuôn-retired trong phần nhiệm-vụ |
| T4 | bảng PHẦN B #1-#17+#21 trong sub-file lane | từng phép PASS, fixture-hỏng TRƯỢT thật, đột-biến ĐỎ thật |
| T5 | grep -n "ctx-audit" .claude/workflows/hmw.js |
≥2 hit (VALID_ROLES + writeGuard read-only list) |
| T6 | grep -n "mind-check" .claude/commands/{pause,tiep,session-start,session-end}.md |
4/4 file có call-site; pause có "§2.6-bis" + số wall-clock; tiep có tiep_reload + "≤15 dòng"; session-end có mind-blocks= |
| T7 | python -c "import json;d=json.load(open('.claude/agent-memory/memory-budget.json',encoding='utf-8'));print(d['mind_ctx_kb'],d['tiep_reload']['mode'])" |
32 rut-gon; grep _session_ctx_kb_honest_caveat = 0 hit (đã thay _session_ctx_kb_reader) |
| T8 | grep STATUS §Sub-agents "21"; adap-report chứa "executed" + "chờ dogfood" | đúng nấc, không khai quá |
| T9 | spawn-probe + dogfood + Measure-Command | ALIVE; vòng 4-cửa exit 0; mốc wall-clock ghi lại |
PHẦN B — CHECK-LIST KIỂM-TRA-LẠI (lead + anh chạy SAU khi hmw xong)
Mỗi phép = {lệnh · kỳ-vọng · loại}. Cây tạm = scratchpad qua
--root(fault-inject seam, mirror-RepoRoot). #1-#17+#21 chạy được NGAY sau wave (T4 đã chạy 1 lượt — lead re-chạy chọn mẫu); #18-#20+#22-#23 cần restart/phiên-sau.
- [happy] Fixture SẠCH sinh từ template THẬT (render
session-mind-template.md+ block-0 + 1 refresh đúng số) →mind-check --session <N> --root <cây-tạm>→ exit 0, 0 trượt 0 cờ. (Mẫu sạch PHẢI từ lời-lệnh-thật sinh ra — thư §6, cấm mẫu dễ-xanh tự chế.) - [fault-inject] Rào-1: block dưới RULES-END chứa dòng
> anh: ...→ TRƯỢT exit 1 + in đúng file:line. - [anti-Goodhart] Rào-1 enclosure: chuỗi
> anh:CHỈ nằm TRONG khối luật START/END → KHÔNG trượt (use⟂mention — chính khối luật chứa chuỗi cấm để giải thích). - [fault-inject + anti-Goodhart] Rào-2 biến-thể: 4 fixture {
ts:·TS :·Ts:· tab-thụt} → 4/4 TRƯỢT; đối-chứng heading## MIND-1 — 2026-07-26T...→ KHÔNG trượt (ts trong heading ≠ key đầu dòng). - [đột-biến] Rào-2 single-truth: sửa
_TS_KEY_REtrong session_ctx.py (vd bỏ nhánh khoảng-trắng) → chạy lại #4 → hành-vi đổi THEO (chứng mind-check import chính hằng, không cài regex bản 2); grep đếm định-nghĩa regex ts trong scripts/ = đúng 1 nơi. - [fault-inject 2-chiều] Rào-3: fixture chứa
sk-test123...→ TRƯỢT; fixture chứa[đã che a1b2c3d4]→ ĐẠT (ngoại-lệ nhãn che 8-hex). - [anti-Goodhart] 2-lưới độc lập: inject
sk-vào_mindcây tạm →session_ctx.py secrets-sweep --session <N>CŨNG exit 1 (mind-check KHÔNG thay sweep; sweep rglob trọn dir vốn đã phủ_mind— 2 net cùng kêu). - [fault-inject + F-1] Con-trỏ 3-trạng-thái ma trận: {path tồn tại → đạt} · {cha có, file chưa → CỜ (open) / TRƯỢT (closed)} · {cha không có → TRƯỢT cả 2 mode} · {TÊN-TỆP-SAI trong thư-mục thật → đang-chờ (open — kẽ khai nguyên văn thư §4) → TRƯỢT (closed)}. 4 ca × 2 mode đúng bảng.
- [anti-Goodhart] F-1 anti-xoá-con-trỏ: ca đang-chờ ở open-mode — đọc message máy: PHẢI nói "chờ file sinh ở cửa đóng" chứ KHÔNG gợi ý xoá con-trỏ (đường-rẻ-nhất-để-xanh phải là đường đúng).
- [fault-inject + anti-đóng-cứng] Số-hiệu: {MIND-2 xuất hiện ×2 → TRƯỢT} · {top nhỏ hơn số dưới → TRƯỢT} · {dãy 0,1,5 với 5 ở top → ĐẠT} (chỉ đòi duy-nhất + mới-hơn — không neo công-thức, đúng hub §3).
- [fault-inject + mồi-ngầm-đĩa] Bất-biến chuỗi: {p=2, blocks=3}→đạt · {p=2, blocks=2}→đạt · {p=2, blocks=4}→TRƯỢT · {p=2, blocks=1}→TRƯỢT; rồi thêm dòng
markers: _pause=9GIẢ vào_end→ kết quả KHÔNG ĐỔI (máy đếm đĩa, tự-khai chỉ sinh cờ-INFO lệch — chống đúng bẫy khai-THIẾU hub đo được). - [đột-biến ×2] Trần/nén: fixture 33KB → CỜ vượt trần + hướng dẫn nén (KHÔNG trượt — nợ hiển thị); fixture 2-block 33KB → CỜ "TỪ-CHỐI nén"; đặt
mind_ctx_kb=1ở cây tạm → mọi fixture CỜ (chứng đọc khoá LIVE); XOÁ khoá → exit 3 fail-loud. - [fault-inject + đóng-nợ H18] Phép-phụ-8:
_context65KB cây tạm → CỜ vượtsession_ctx_kb; đối chứng 10KB → im. Sau T7: grep_session_ctx_kb_honest_caveattrong memory-budget.json = 0 hit (caveat đã thay bằng note reader — đúng 3 điều note cũ tự dặn). - [fault-inject] Draft-mode dịch-trái: draft số-hiệu ≠ count-on-disk → TRƯỢT trước-chèn; draft chứa
ts:→ TRƯỢT trước-chèn (lỗi KHÔNG BAO GIỜ vào tệp); draft sạch → đạt. - [fault-inject — kẽ tên-sai] Xanh-im: dir có
_mind-s6.md(thiếu-trước 6), canonical vắng → output PHẢI NÊU đúng chuỗi_mind-s6.mdtrong lý-do bỏ-qua (pipe grep tên sai → hit); closed-mode → TRƯỢT. (Không nêu tên = lỗi chính tả đi qua cửa dưới vỏ "chưa có gì để kiểm".) - [happy — đo BINDING] Wall-clock:
Measure-Command { python scripts/session_ctx.py mind-check --session 6 }×3 → tb ≤ ~0.5s; tổng pause-thêm (draft + chèn + full) ước ≤ ~1 phút wall / 0 spawn — so mốc pause hiện hành (dò 5ms + machine-block 140ms + sweep 64ms). Lệch ước >2× ⇒ điền số THẬT vào pause.md §2.6-bis (T9). - [đột-biến + khai] Immutability: sửa 1 byte block cũ trong
_mindđã commit →git diffHIỆN đúng dòng. KHAI: máy KHÔNG canh bất-biến per-run (cần git-history diff — ngoài tầm $0); lưới = luật + git + ctx-audit @close so-git khi nghi. - [happy end-to-end — T9] Dogfood 1 vòng THẬT: session-start ghi block-0 (≥1 nội-dung máy-khuôn-không-tự-sinh — TÊN 1 ý D thật; metadata KHÔNG tính) → /pause refresh (MIND-1) → /tiep: báo-cáo có bản nạp-lại ≤15 dòng nhắc ≥1 tên-ý-D + 1 E-verdict → /session-end: closed-check exit 0 +
_endcómind-blocks=<n>khớp đĩa. - [mồi-ngầm — T9] ctx-audit @open gieo 1 ý CHƯA-chốt (vết trên đĩa
sub-ctx-audit-open.mdTRƯỚC pause) → cửa-sổ SAU (/tiep) nêu lại đúng ý → ĐẠT. KHAI kẽ: single-lead ⇒ "bên bị chấm không biết" chỉ đạt xuyên-cửa-sổ (fresh window không nhớ ý nào là mồi) — chép vào phần khai, không tả thành tính năng. - [happy + đối-chứng dương — T9] Restart-verify: TRƯỚC restart spawn
ctx-auditphải FAIL/absent (chứng no-hot-reload agent-file-mới — số đo SE S120/S121 thắng quan-sát hub §7); SAU restart spawn-probe trảALIVE|ctx-audit(BƯỚC 0.6b). - [happy — verify claim đề bài] Sàn-3 ⑤ không cần tín-hiệu mới: commit
_mindqua hook →git log --name-only --format='%s' origin/main..HEAD | grep -q '.claude/sessions/'→ hit (⑤ sẵn phủ —_mindnằm TRONG path-4 hiện có, KHÔNG path hook mới ⇒ đúng luật "path mới = tín-hiệu mới" mà không kích hoạt nó). - [fault-inject 2-chiều — sau wave] Lưới C11(b): lead scribe
sub-ctx-audit-open.mdmà CHƯA seed diaryagent-memory/ctx-audit/→governance-detectors.ps1C11(b) FLAG diary-0-delta (vai mới NẰM TRONG lướisub-*.md— không lặp kẽ trioharness-*-return.md); seed xong → im. - [đột-biến + owner-note] hmw STOP-HARD: wave thử
role:'ctx-audit'TRƯỚC T5 → throw STOP-HARD (đối-chứng dương); SAU T5 → chạy. NÊU OWNER (không tự đổi): roster 21 >hmw_width.cap20 ⇒ full-roster sweep sẽ LOUD-skip 1 lane — quyết định số là của anh (O-7). - [khai KHÔNG-KIỂM-ĐƯỢC — chép vào adap-report + thư hub] (i) bằng-chứng-nội-dung @tiep không máy-kiểm được (transcript ngoài tầm máy — mirror hub §7(iii); lưới thay = #18 dogfood + #19 mồi-ngầm); (ii) 2-cửa-sổ-song-song = kẽ chấp nhận, chưa bịt (mirror hub §7(iv); PIN đích-danh
--sessiongiảm đua nhưng không đóng); (iii) máy không canh bất-biến-block per-run (#17 lưới git).
Điểm lead PHẢI verify kỹ (trước khi ghi spec-file chính thức)
- Ranh LEAD-SOLO T6/T7/T8 — command .md + memory-budget.json + docs canonical = governance single-writer (H6.1 + hub §7 "lời lệnh là quản-trị, chỉ một người ghi"). Wave CHỈ giao T1-T5. Nếu lead muốn wave đụng command ⇒ phải tự bác luật nhà đã viết — đề nghị KHÔNG.
- Máy = extend session_ctx.py, KHÔNG .ps1 mới — lý-do 1-nguồn (
_SECRET_RES+_TS_KEY_RE); .ps1 mới = cài regex bản 2 = 2-sự-thật (đúng thứ rào-2 cấm). Nếu lead nghiêng PS1-khuôn ⇒ phải trả lời được "secret-patterns sống ở đâu, 1 hay 2 chỗ?". (Đây là điểm em ĐỀ KHÁC draft leadctx-mind-check.ps1— lý-do mạnh hơn ghi rõ tại T1.) - (36)(b) ⇒ O-1 carve-out KHÔNG cần — pause.md §1 "NGỪNG spawn" giữ nguyên. Đừng ai "adopt verbatim" carve-out (a) của hub vào pause SE (bài S138 chép-khuôn-kế-thừa-lỗi).
- Vết ủy quyền (35)-(38) = OWNER-DELEGATED→LEAD-DECIDED, anh veto 1 edit — CẤM ghi "owner chốt" (tái phạm C8b S149 nếu ghi sai).
- Chiều chèn NGƯỢC nhau:
_mindmới-nhất-ở-TRÊN ⟂_contextFLOW mới-nhất-ở-CUỐI — T2/T6 phải khai to ở cả 2 chỗ. - Restart 2-đợt: wave land FILE; nghi-thức + vai ĂN từ phiên sau restart (T9). hmw.js là ngoại lệ ăn-ngay (re-invoke).
- Đừng trùng việc queue @closeout S153: C11(b) filter fix = queue #8 (lane tooling) — spec này KHÔNG làm lại, chỉ đặt tên artifact khớp cả 2 đời filter.
Token cost estimate (lượt invest này): ~90-110K in / ~14-16K out.