[CLAUDE] Docs: adopt Harness-15 memory-budget per-agent (token-governor + value-gate + work-state block, S81)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m0s

8/8 floor via engine section-G + budget.json (harness_floor/token_governor/value_protect) + session-start 2.1.5 + rules 6.6 + gate-script value-protect FLAG (runtime-fired test-specialist). Review wf_b7f3c8ac-b53 PASS/PASS/HONEST -> 2 CONCERN fixed (anchoring + tool-attribution) + refresh stale measured S71->S81. adap-report + email ai_infra body-hash bb8fb6e803ae. 0 production code, A7 217/217, detector 26-flag baseline.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-06-20 22:46:17 +07:00
parent 447082fb03
commit 0bc2112952
11 changed files with 273 additions and 12 deletions

View File

@ -34,18 +34,40 @@
"autoinject_cap_bytes": 25600,
"low_watermark_ratio": 0.85,
"keep_floor_entries": 5,
"strike_threshold": 2
"strike_threshold": 2,
"value_protect": {
"_note": "Harness-15 B(b) value-gated archival (S81, 2026-06-20): keep_floor_entries protects NEWEST-n (recency/age axis); value_protect protects HIGH-VALUE entries regardless of age (value axis, orthogonal). Recurring-bug / anti-pattern / gotcha / root-cause entries STAY in L1-hot even when old -- archival cuts LOW-VALUE, NOT FIFO-by-date. This is mark RC-...10-29-11 (time/age=false-proxy) applied to the memory layer. Mechanism = CONVENTION (em-main judgement when condensing L1->L2); the patterns below are an advisory grep-hint for the DRY-RUN planner to FLAG protected entries, NOT an enforced auto-exclude (no overclaim: archive-gate stays DRY-RUN, em-main decides).",
"patterns": ["gotcha #", "anti-pattern", "recurring", "lost-update", "race", "bai hoc", "lesson", "guard", "root-cause", "silent-fail"]
}
},
"harness_floor": {
"_note": "Harness-15 A1/A3 (S81, 2026-06-20): SAN-harness = fixed per-spawn cost (NOT tunable) = tool-schema + framing + own persona/role file + lead-pasted base-doc slice + task prompt. SEPARATE HOUSE (A3 anti-double-count): persona + lead-pasted-docs belong HERE (floor), NOT counted in token_governor.l1_always (which = own agent-memory + archive index + work-state block only). MEASURED-ESTIMATE not exact (H15 honest-note b): persona = directly measured bytes (.claude/agents/<name>.md 4.3KB-13.3KB => ~1.3K-4.0K tok via /3.3); tool-schema + framing = harness-injected (cannot byte-count locally), estimated comparable to AI_INFRA same-toolset-family (Read/Write/Edit/Bash/Grep/Glob/Skill/RAG).",
"measured_token_estimate": 21000,
"rounded_up_tokens": 30000,
"components_note": "persona(measured 1.3K-4.0K, DIRECTLY via Get-ChildItem byte-count of .claude/agents/*.md, NOT via measure-agent-memory.ps1 which only sizes agent-memory tiers) + tool-schema(est ~5K) + framing(est ~2K) + lead-pasted base-slice(est ~5-9K; em-main injects CLAUDE.md/README-slice + task ctx) + prompt(est ~1K). README decision-tree corpus = 32704B but em-main pastes a SLICE, not whole. The ~21K sum is SE's OWN reasoning over SE's OWN agents (persona byte-measured + each harness-injected sub-component estimated independently); it lands NEAR AI_INFRA's ~21K because the toolset family is identical (Read/Write/Edit/Bash/Grep/Glob/Skill/RAG), NOT because borrowed. SE's governing cap = 30K (SE's own round-up), independent of AI_INFRA's figure."
},
"token_governor": {
"_note": "Harness-15 A2/B(a)/B(e) (S81, 2026-06-20): SECOND governor (token) ORTHOGONAL to the BYTE governor (tiers/archive_gate above). Keep BOTH (B(e)) -- byte measures file-size-on-disk, token measures context-loaded; independent (an agent can exceed byte-cap yet load FEWER tokens; VN text ~3.0-3.5 byte/tok so byte/4 = upper bound => real headroom LARGER). Numbers = LEAD-AUTHORITY hard-cap derived from SE byte-caps x workload (multi-module ERP => heavier budget); NO AI may re-optimize them down (B(a)). Budget = MINIMUM-to-USE floor, NOT a ceiling to dribble against: FILL L1 with real work-state up to budget; under-fill ONLY when high-value content exhausted; NEVER garbage-stuff (token-saving = forgetting work).",
"l1_always_tokens": 12000,
"l1_always_note": "own agent-memory (MEMORY.md ~8K @ 25600B/3.3) + archive _INDEX map (~2K) + work-state block (~2K). Always-loaded.",
"l2_ondemand_tokens": 6000,
"l2_ondemand_note": "archive verbatim/gist sections + skill sections. Pulled per-need, NOT always-loaded => no context-rot when unused.",
"l3_rag_tokens": 4000,
"l3_rag_note": "RAG search_memory/search_code result per query. On-demand.",
"headline_floor_plus_l1_tokens": 42000,
"headline_note": "always-present per spawn = SAN(30K) + L1(12K). L2/L3 expand only on-demand (no always-cost)."
},
"measured": {
"cicd-monitor": { "l1_hot": 23653, "l2_verbatim": 178856, "l2_index": 16779, "l2_gist": 29737, "rollout": "done" },
"investigator-codebase": { "l1_hot": 23187, "l2_verbatim": 68612, "l2_index": 9234, "l2_gist": 27297, "rollout": "done (re-curated S71: moved 3 oldest, gist gen:2)" },
"reviewer": { "l1_hot": 24844, "l2_verbatim": 54901, "l2_index": 7370, "l2_gist": 19114, "rollout": "done (re-curated S71: moved 10 oldest, gist gen:2)" },
"implementer-backend": { "l1_hot": 17692, "l2_verbatim": 59233, "l2_index": 10105, "l2_gist": 23079, "rollout": "done" },
"frontend-designer": { "l1_hot": 24004, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (no archive; watch L1 near cap)" },
"test-specialist": { "l1_hot": 23919, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (no archive; watch L1 near cap)" },
"_note": "S81 2026-06-20 FRESH re-measure (scripts/measure-agent-memory.ps1) post-S80 curate. Supersedes stale S71-seeded values. byte-governor snapshot (l1_hot = file-size-on-disk); cross-check token_governor for the orthogonal token-thread.",
"cicd-monitor": { "l1_hot": 12227, "l2_verbatim": 194964, "l2_index": 17626, "l2_gist": 29737, "rollout": "done (re-curated S80: keep-floor-hit manual condense, ~3 huge run-records -> archive)" },
"investigator-codebase": { "l1_hot": 10281, "l2_verbatim": 102446, "l2_index": 12308, "l2_gist": 27297, "rollout": "done (re-curated S80: 15 recon entries -> archive)" },
"reviewer": { "l1_hot": 10242, "l2_verbatim": 92316, "l2_index": 10067, "l2_gist": 19114, "rollout": "done (re-curated S80: 13 war-story entries -> archive)" },
"implementer-backend": { "l1_hot": 19394, "l2_verbatim": 59233, "l2_index": 10105, "l2_gist": 23079, "rollout": "done" },
"frontend-designer": { "l1_hot": 26129, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (no archive); OVER autoinject-cap 25600 (under soft-cap 30720) -- WATCH strike-1, first-overflow needs _INDEX/gist build" },
"test-specialist": { "l1_hot": 27723, "l2_verbatim": 5546, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (tiny archive, no _INDEX); OVER autoinject-cap 25600 (under soft-cap) -- WATCH strike-1; value-protect FLAG fired S81 (gotcha#/guard in move-set)" },
"harvest-curator": { "l1_hot": 18952, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (no archive)" },
"tooling-auditor": { "l1_hot": 18431, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (no archive)" },
"implementer-frontend": { "l1_hot": 12169, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (empty archive)" },
"implementer-frontend": { "l1_hot": 17386, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (empty archive)" },
"investigator-api": { "l1_hot": 8510, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (empty archive)" },
"database-agent": { "l1_hot": 5917, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (no archive)" }
}

View File

@ -95,6 +95,18 @@ Em main xác nhận **lead model resolve được** đầu session. Lead SE = **
- Mark cấp Active-High = LỆNH (P3 binding); vi-phạm `error-ledger.md §L.a` RCA (P9). KHÔNG tự đóng dấu / đổi cấp (P4/P8 chờ anh confirm).
- **Light/hỏi-đáp session thể skip; governance session nên chạy.**
### 2.1.5 Work-state block — LEAD nạp + phát-biểu trạng-thái-công-việc ĐẦU phiên (Harness-15 B(c), S81)
> Floor H15 B(c) (🔴 [`harness-11-engine.md §G.2`](../../docs/governance/harness-11-engine.md)): khoảng-trống quên-việc hay rơi đúng vào **chính LEAD** (em main tự-nạp kiến-trúc/luật nhưng bỏ quên trạng-thái-công-việc). Chốt-chặn = LEAD **PHẢI nạp + phát-biểu rõ** 4 thành-phần (ở Phase 3 REPORT). KHÔNG bỏ qua vì "tiết-kiệm token" — **tiết-kiệm-token = quên-việc** (rơi trạng-thái giữa phiên, làm-lại tốn HƠN).
- **4 thành-phần work-state block** (phát-biểu Phase 3 REPORT):
1. **Lộ-trình đang chạy (active-roadmap)** phase/plan hiện-tại (`docs/STATUS.md` Phase line).
2. **Việc đang-làm-dở (WIP)** `docs/STATUS.md §🔥 In Progress` + `HANDOFF` last-session "🔴 NEXT (em)".
3. **Quyết-định đang-chờ (pending-decisions)** carry product/ops + AskUserQuestion chưa chốt + mark Medium (neo chưa-rõ).
4. **Lỗi-lặp-lại cần nhớ (recurring-bugs)** gotcha/anti-pattern liên-quan task (`docs/gotchas.md`; các mục này = value_protect §G.2(b), GIỮ-L1 bất-kể tuổi).
- **Nạp-đầy L1 (B(a)):** dùng-đủ ngân-sách token (`memory-budget.json:token_governor`) bằng nội-dung-THẬT, KHÔNG dè-xẻn / KHÔNG nhồi-rác. Budget = sàn-tận-dụng, KHÔNG trần-tiết-kiệm.
- **Light/hỏi-đáp session tóm-tắt gọn; feature/bug/governance phát-biểu đủ 4 thành-phần.**
### 2.2 Skill registry (6 skill)
- Liệt kê: `contract-workflow` · `form-engine` · `permission-matrix` · `dependency-audit-erp` · `ef-core-migration` · `iis-deploy-runbook`
- Dùng skill khi task khớp (KHÔNG tự suy luận lại). Phân bổ per agent: xem README skill matrix.

View File

@ -32,3 +32,4 @@
| 2026-06-18 | 2026-06-18-se-to-ai_infra-harness-10-flat-refine-adopt-report | se → ai_infra | outbox/ai_infra | 5f511fe5c0f2 |
| 2026-06-18 | 2026-06-18-se-to-ai_infra-harness-11-adopt-report | se → ai_infra | outbox/ai_infra | 2316773229f2 |
| 2026-06-20 | 2026-06-20-se-to-ai_infra-harness-12-13-14-adopt-report | se → ai_infra | outbox/ai_infra | 7b8615b3291e |
| 2026-06-20 | 2026-06-20-se-to-ai_infra-harness-15-adopt-report | se → ai_infra | outbox/ai_infra | bb8fb6e803ae |

View File

@ -0,0 +1,51 @@
---
id: 2026-06-20-se-to-ai_infra-harness-15-adopt-report
from: se
to: ai_infra
category: Governance
type: adopt-report
date: 2026-06-20
content_sha256: bb8fb6e803aee9636acd2d1fb5e8193458a3834ca6d4753c33696576b424fa26
nac: sent
---
# Báo cáo áp dụng Harness-15 (Ngân sách bộ nhớ per-agent, token-based) — từ SOLUTION_ERP
Kính gửi nhóm Hạ tầng AI dùng chung,
SOLUTION_ERP (se) đã hoàn tất việc áp dụng Harness-15 trong phiên S81 (ngày 2026-06-20), đi qua đúng quy trình hai bước (thực thi và rà soát độc lập) và đã tự ký duyệt trong hệ governance của dự án. Báo cáo chi tiết kèm bằng chứng được lưu tại `docs/governance/adap-reports/2026-06-20-Governance-harness-15-memory-budget.md`.
## Kết quả tổng quát
Chúng tôi đã áp đủ cả tám mục sàn bắt buộc (sáu sàn chức năng: đo-sàn cộng năm hành vi a tới e, cộng hai mục cấu hình là ghi ngân sách ba tầng và tách nhà chống đếm trùng). Có một hoàn cảnh thuận lợi: SOLUTION_ERP đã có sẵn thước byte và mô hình ba tầng L1/L2/L3 từ Harness-9 và Harness-11, nên phần áp dụng ròng của Harness-15 chỉ còn là thêm thước token (bộ điều phối thứ hai, trực giao với thước byte), thêm cắt-tỉa-theo-giá-trị, và chính thức hóa khối trạng thái công việc đầu phiên.
## Các điểm chính
1. Đo sàn của chính dự án. Chúng tôi đo trực tiếp kích thước các tệp vai trò của mười một agent (từ 4,3KB đến 13,3KB); phần công cụ và khung dựng prompt được ước lượng vì không byte-count cục bộ được. Tổng sàn vào khoảng 21K token, làm tròn lên thành 30K làm trần riêng của dự án. Chúng tôi xin nói rõ và trung thực: con số khoảng 21K của chúng tôi trùng với con số của bên phát, nhưng đó là vì bộ công cụ cùng họ (Read, Write, Edit, Bash, Grep, Glob, Skill, RAG), chứ không phải vì mượn số — trần thực thi của chúng tôi là 30K do dự án tự làm tròn lên.
2. Cắt tỉa theo giá trị, không theo tuổi. Đây là phần chúng tôi thấy giá trị nhất. Bộ cắt tỉa hiện tại của chúng tôi giữ năm bản ghi mới nhất (trục thời gian). Harness-15 yêu cầu thêm trục giá trị: giữ các mục lỗi-lặp-lại và mẫu-sai bất kể tuổi đời. Chúng tôi đã thêm một cờ cảnh báo vào bộ cắt tỉa: khi một kế hoạch dồn-archive định chuyển một mục chứa dấu hiệu giá trị cao (gotcha, anti-pattern, root-cause) ra khỏi tầng nóng, bộ cắt tỉa nêu cờ để người chủ trì giữ lại. Cờ này đã chạy thật và bắt được một trường hợp (agent test-specialist có mục chứa "gotcha #" và "guard"). Xin nói trung thực: đây là cờ cảnh báo, không phải tự động loại trừ — quyết định giữ vẫn do người chủ trì, đúng theo triết lý của chúng tôi rằng tự động ghi đè bộ nhớ là mối nguy số một và cố ý chưa làm.
3. Khối trạng thái công việc đầu phiên. Chúng tôi đồng ý với quan sát rằng khoảng trống quên việc hay rơi đúng vào chính lead. Chúng tôi đã chính thức hóa một bước ở đầu phiên, theo đó lead phải nạp và phát biểu rõ bốn thành phần: lộ trình đang chạy, việc đang làm dở, quyết định đang chờ, và lỗi lặp lại cần nhớ.
4. Giữ cả hai thước đo. Thước byte (vệ sinh kích thước tệp bộ nhớ) và thước token (ngân sách ngữ cảnh) được giữ tách biệt trong cấu hình, không gộp lại.
## Trung thực về độ chín (không nói quá)
- Năm trong sáu sàn chức năng là quy ước, tức kỷ luật của người và AI: nạp đầy, quyết định cắt-theo-giá-trị, nêu trạng thái, ba tệp chốt. Chỉ có "giữ hai thước đo" (hai khối cấu hình tách biệt) và phần đo byte trực tiếp là cơ chế hóa. Chúng tôi không nhận "cơ chế hóa" cho thứ chỉ là kỷ luật.
- Con số sàn là đo được nhưng không chính xác tuyệt đối: phần persona đo thật từng byte, phần công cụ và khung dựng là ước lượng.
- Thước token hiện đang ở mức ước lượng (token xấp xỉ byte chia 3,3; còn byte chia 4 là cận trên nên dư địa thật còn lớn hơn). Chúng tôi chưa có công cụ đo token thực nạp mỗi lần khởi tạo agent, nên các con số ba tầng là trần do lead cấp dựa trên quy mô công việc, chưa phải số đo thật. Đây cùng nút thắt với phần budget-hit-rate của Harness-14.
## Vòng rà soát đã bắt lỗi của chính chúng tôi
Vòng rà soát độc lập (workflow `wf_b7f3c8ac-b53`, ba luồng) cho kết quả PASS, PASS và HONEST, nhưng đã bắt hai điểm thiếu chính xác mà bản tự thực thi suýt để lọt: thứ nhất, cách diễn đạt "trùng cách làm của bên phát" đọc như đang dựa vào con số của bên phát, đã được sửa lại cho rõ là suy luận riêng của dự án; thứ hai, phần đo-sàn trích dẫn sai tên script (script đó chỉ đo byte của các tầng bộ nhớ, không đo persona), đã được sửa. Chúng tôi xem đây là minh chứng cụ thể cho giá trị của quy trình hai bước.
## Đề xuất ngược (reverse-findings)
1. Dự án nào đã chắc Harness-9 (seed-by-measure) và Harness-11 (keep-floor cộng canonical-anchor) thì gần như đã có sẵn nửa-byte của mô hình hai-governor; phần áp dụng ròng của Harness-15 khi đó chỉ còn là thước token, cắt-theo-giá-trị, và khối trạng thái công việc.
2. Thước token là trần cứng nhưng hiện chưa đo được token thực nạp. Nếu bên phát mở một công cụ đếm token-nạp-mỗi-lần-khởi-tạo cho các dự án anh em, thước token sẽ chuyển được từ trạng thái ước lượng sang đo thật.
Trạng thái sản phẩm giữ nguyên, không có thay đổi mã sản phẩm nào: Migration 57, 88 bảng, 354 test, 71 gotcha.
Trân trọng,
SOLUTION_ERP (se).

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,48 @@
# S81 (2026-06-20) — Adopt Harness-15: memory-budget per-agent (token-governor + value-gate + work-state block)
> em-main single-writer + 1 REVIEW Workflow. **0 production code.** State GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`.
## Anh giao
`/check-email AI_INFRA và /adap-apply step by step cẩn thận từng bước, review sau lẫn imple, report trung thực.`
## STAGE 1 — check-email AI_INFRA
- outbox/se có 4 file, **cả 4 đã processed S79** (06-11 design-guide · 06-18 harness-11 · 06-19 harness-all-notify · 06-20 harness-14-notify) → **0 new directed**. STAGE 2 = no-op.
- Fan-out diff (outbox/all 28 vs adap-reports 21): unambiguous-new = **`2026-06-20-Governance-harness-15-memory-budget`** + checklist-15.
- Verify-not-redo: **H14** (checklist-14 6/6 🔴 floor đã phủ S79 — mark `RC-…11` A1-4 + engine §F.4 D1-2) · **harness-all-update-v2.0** = PLAN-ANNOUNCE visibility-only (KHÔNG action) · checklist-9-10-v2/11 phủ S72/S75.
## IMPLEMENT (em-main D9, 8/8 🔴 floor)
| Floor | Artifact | Nấc |
|---|---|---|
| A1 đo-SÀN | persona đo TRỰC-TIẾP `Get-ChildItem` (4.3-13.3KB) + harness-injected SE-ước-riêng → 21K→**30K cap-riêng-SE**; `memory-budget.json:harness_floor` | runtime→executed-file · mechanized(byte-count)+convention(ước/round-up) |
| A2 ghi-3-tầng | `token_governor` L1 12K/L2 6K/L3 4K, lead hard-cap no-AI-re-optimize | executed-file · mechanized |
| A3 tách-nhà | persona+lead-docs=SÀN, KHÔNG đếm L1-managed | executed-file · convention |
| B(a) nạp-đầy | `token_governor._note`+session-start §2.1.5+rules §6.6 (sàn-tận-dụng no-saving no-garbage) | executed-file · convention |
| B(b) value-gate | `archive_gate.value_protect` 10-pattern + `memory-archive-gate.ps1` **FLAG runtime-fired** (test-specialist gotcha#/guard) ⟂ keep-floor recency = mark `RC-…11` | executed-file (runtime-proven) · convention + mechanized-FLAG-only |
| B(c) work-state block | `session-start §2.1.5` (roadmap+WIP+pending+recurring) vá khoảng-trống-LEAD | executed-file→runtime · convention |
| B(d) 3-tệp-chốt | persona + MEMORY auto-inject + `hmw.js:124` MEMORY-PACK — verified | executed-file · convention |
| B(e) 2-governor | byte (`tiers`/`archive_gate`) ⟂ token (`token_governor`) | executed-file · mechanized |
Canonical record = `harness-11-engine.md §G` (+ artifact-map row + scope-note §G). **5/6 sàn = convention, chỉ (e)+đo-SÀN = mechanized** (honest, KHÔNG over-claim).
## REVIEW (Workflow `wf_b7f3c8ac-b53`, 3 free-text lane — KHÔNG ép-schema per lesson S73)
- Part-A **PASS** · Part-B **PASS** · Honesty **HONEST**.
- Bắt **2 CONCERN** (review→fix loop): (1) anchoring "matches AI_INFRA" → reframe SE-ước-riêng-trùng-vì-cùng-toolset-KHÔNG-mượn-số · (2) attribution sai `measure-agent-memory.ps1` (script đó chỉ đo agent-memory-tier byte) → sửa "persona đo TRỰC-TIẾP `Get-ChildItem`". Cả 2 **đã fix**.
- Bonus: review đọc **stale `measured` block** (S71-seed) → misread "no sub over cap" → em refresh `measured` S71→S81 fresh (frontend-designer 26129 + test-specialist 27723 OVER cap, đúng WATCH).
## Verify
- `memory-archive-gate.ps1` value-protect FLAG runtime-fired (test-specialist) + **A7 GATE PASS 217/217** (integrity post-edit).
- `governance-detectors.ps1` = **26-flag baseline** (0 new vocab-fork/broken-link từ edits).
- budget.json JSON valid (3 ConvertFrom-Json check).
## Bài học (NEW)
- **Independent review bắt honesty-imprecision self-review ship:** số-trông-mượn (21K trùng AI_INFRA) + tool-cite-lỏng (sai script). Cả 2 disclosed-không-giấu nhưng skeptic-cold đọc ra "weakest link". Fix = tighten wording để honest-thing = obviously-honest. → cùng họ `feedback_canonical_spec_over_broadcast` (pull-canonical-đừng-phỏng-theo).
- **Stale-config đánh-lừa cả reviewer:** reviewer reason off file-says → stale `measured` block khiến nó misread "no sub over cap". Config-staleness mislead không chỉ người mà cả self-verification. → §2.1.2 budget-audit phải re-measure ĐẦU mỗi adap đụng budget.json.
- **Value-gate = mechanized FLAG nhưng EXCLUDE = convention (D6):** detect deterministic (đây là gotcha) → mechanize FLAG; decision (giữ-hay-archive) = judgement → em-main. Auto-exclude = cross "script tự-ghi-memory" = mối-nguy #1 cố-ý-tránh.
## Output (15 file, 0 production code)
`memory-budget.json` · `harness-11-engine.md §G` · `session-start §2.1.5` · `rules §6.6` · `memory-archive-gate.ps1` · adap-report `2026-06-20-Governance-harness-15-memory-budget.md` · STATUS · HANDOFF · email `outbox/ai_infra/2026-06-20-se-to-ai_infra-harness-15-adopt-report.md` (body-hash `bb8fb6e803ae`) · `_index` · session log này.
## 🔴 NEXT
- **Anh:** restart CLI (session-start §2.1.5 runtime) + **confirm mark H-15** (đề-xuất Active-High, report-before-stamp) → `/user-mark-active-high` hoặc OK.
- **Em (carry):** frontend-designer 26.1KB + test-specialist 27.7KB WATCH strike-1 · monthly audit 2026-07-01.
- **Pending product/ops (carry):** Ngưỡng giá CEO UAT · "C" chuyển phiếu chờ spec · tzutil VPS · email typo anh Chương · 5 real-staff pw · gán CNTT.

View File

@ -0,0 +1,50 @@
# adap-report — Harness-15 (Memory-budget per-agent, token-based)
- **id:** 2026-06-20-Governance-harness-15-memory-budget
- **source broadcast:** `ai_infra/broadcasts/outbox/all/2026-06-20-Governance-harness-15-memory-budget.md` (`status: 🟢 ADOPT` · `reviewer_gate: PASS wf_269fc353-560` · `content_sha256: 95272379462a3eb0061855e5fcc24454f45f54a17a5790f326b3f7982847f2f8`) + checklist `2026-06-20-Governance-checklist-harness-15.md` (`content_sha256: 94267ab5c2fbb0b972f7df65686554903d19b23ab4156b47c8e79eb70f872bd5`)
- **no directed notify** cho H15 (outbox/se dừng ở harness-14-notify) → pull qua **fan-out `outbox/all`** per `/adap-apply` (anh giao `/check-email AI_INFRA và /adap-apply step by step, review sau lẫn imple, report trung thực`).
- **adopted by:** se (SOLUTION_ERP) · **session:** S81 · **date:** 2026-06-20
- **protocol:** §6 mandate = 2-process tách-biệt (IMPLEMENT em-main single-writer D9 [governance-authoring solo per H6.1] + REVIEW workflow độc-lập) + report.
- IMPLEMENT: em-main đo SÀN (runtime) → `memory-budget.json` (harness_floor + token_governor + value_protect) + engine `§G` + session-start `§2.1.5` + rules `§6.6` + gate-script value-protect FLAG.
- REVIEW: `wf_b7f3c8ac-b53` (3 free-text lane: Part-A PASS · Part-B PASS · Honesty HONEST) → bắt 2 CONCERN honesty (anchoring + tool-attribution) → **đã fix** (review→fix loop).
- **project-fit:** ✅ FIT — SE đã có L1/L2/L3 + byte-archive-gate + budget.json seed-by-measure (Harness-9/11). H-15 = thêm **thước TOKEN** (governor thứ-2) + **value-gate** + **work-state block**.
## VERDICT: ✅ ADOPTED — 8/8 🔴 floor MET · 2-governor mechanized + 5/6 sàn-chức-năng convention (honest)
H-15 = ngân-sách bộ-nhớ per-agent token-based, cốt-lõi **"budget = sàn-tận-dụng-tối-thiểu KHÔNG trần-tiết-kiệm"** (tiết-kiệm-token = quên-việc, khoảng-trống hay rơi đúng vào **LEAD**). **Phát-hiện then-chốt:** SE đã có thước-BYTE + 3-tầng từ H-9/H-11 → adopt = thêm thước-TOKEN orthogonal + value-gate (mark `RC-…10-29-11` áp xuống tầng-bộ-nhớ) + formalize work-state block @session-start (vá khoảng-trống-LEAD).
## Nấc theo floor (review `wf_b7f3c8ac-b53`)
| Floor | SE artifact | Nấc | Cơ-chế-hóa vs quy-ước |
|---|---|---|---|
| 🔴 **A1 đo-SÀN** | persona đo-thật-byte TRỰC-TIẾP (`Get-ChildItem` 4.3-13.3KB) + harness-injected ước SE-riêng → 21K→**30K cap riêng SE** (`harness_floor`) | runtime→executed-file | mechanized (byte-count) + convention (ước + round-up) |
| 🔴 **A2 ghi 3-tầng** | `token_governor` L1 12K / L2 6K / L3 4K (lead hard-cap, no-AI-re-optimize) | executed-file | **mechanized** (config) |
| 🔴 **A3 tách-nhà** | persona+lead-docs = SÀN, KHÔNG đếm vào L1-managed (own-mem+_INDEX+work-state) | executed-file | convention (accounting) |
| 🔴 **B(a) nạp-đầy L1** | `token_governor._note` + session-start §2.1.5 + rules §6.6 (sàn-tận-dụng, no-token-saving, no-garbage) | executed-file→runtime | convention (kỷ-luật nạp) |
| 🔴 **B(b) value-gate** | `archive_gate.value_protect` 10-pattern + **gate-script FLAG runtime-fired** (test-specialist gotcha#/guard) ⟂ keep-floor recency = mark `RC-…10-29-11` | executed-file (**runtime-proven**) | convention (em-main quyết) + mechanized **FLAG-only** (advisory, KHÔNG auto-exclude) |
| 🔴 **B(c) work-state block** | `session-start §2.1.5` 4 thành-phần (roadmap+WIP+pending+recurring-bugs) vá khoảng-trống-LEAD | executed-file→runtime mỗi phiên | convention (kỷ-luật đầu-phiên) |
| 🔴 **B(d) 3 tệp-chốt** | persona `.claude/agents/*.md` + own MEMORY.md auto-inject + `hmw.js:124` MEMORY-PACK slice — **verified đã có** | executed-file | convention (verify-declare) |
| 🔴 **B(e) 2-governor** | byte (`tiers`/`archive_gate`) ⟂ token (`token_governor`) — giữ CẢ HAI tách-biệt | executed-file | **mechanized** (2 config tách) |
**Completeness-gate:** 8/8 🔴 (6 sàn-chức-năng: đo-SÀN+a+b+c+d+e · 2 config: ghi-3-tầng + tách-nhà) — review meta-gate xác-nhận đủ.
## Tailoring (SE-specific)
- §G gom vào `harness-11-engine.md` (engine governance hợp-nhất A-G) — H-15 byte-governor + 3-tầng = đã có (H-9/H-11) → map-onto + thêm token-governor, KHÔNG dựng mới.
- value-gate = mechanized **FLAG-only** (DÒ+NÊU-CỜ D6) thay vì auto-exclude — đúng triết-lý SE detector (auto-WRITE memory = mối-nguy #1, cố-ý chưa-làm). EXCLUDE = em-main quyết.
- con-số 3-tầng SE tự-suy từ byte-cap × workload (ERP nhiều-module); con-số AI_INFRA = bằng-chứng HỌ KHÔNG áp-cứng SE.
## Honest caveats (KHÔNG nói quá)
- **5/6 sàn-chức-năng = CONVENTION** (nạp-đầy · value-gate-DECISION · work-state · 3-tệp-chốt = kỷ-luật người+AI). Chỉ **(e) 2-config + đo-SÀN byte-count** = mechanized. KHÔNG nhận "mechanized" cho kỷ-luật.
- **floor = measured-ESTIMATE KHÔNG exact:** persona đo-thật-byte (verified review: investigator-api 4324B / cicd-monitor 13298B / README 32704B khớp đĩa từng byte); tool-schema+framing = ƯỚC-LƯỢNG (không byte-count cục-bộ được). token≈byte/3.3 (byte/4 = cận-trên → headroom THẬT lớn hơn).
- **value-protect = advisory FLAG KHÔNG enforce:** gate-script chỉ `Write-Output` cờ, KHÔNG move/exclude file (DRY-RUN giữ nguyên); EXCLUDE = em-main. Đã runtime-fire 1 case thật (test-specialist) — KHÔNG over-claim "tự-bảo-vệ".
- **2 CONCERN review đã fix (review→fix loop):** (1) anchoring — wording "matches AI_INFRA" → reframe "SE ước-riêng, trùng vì cùng-họ-toolset KHÔNG mượn-số"; (2) attribution — đo-SÀN cite sai `measure-agent-memory.ps1` (script đó chỉ đo agent-memory-tier byte) → sửa "persona đo TRỰC-TIẾP `Get-ChildItem`". + refresh stale `measured` block (S71→S81 fresh, đóng misread).
## Reverse-findings (đề-xuất ngược AI_INFRA)
1. **SE byte-governor đã thoả H-15 (e)-half + value-axis-precedent TRƯỚC adopt:** Harness-9 seed-by-measure + Harness-11 keep-floor/2-strike = nửa byte của 2-governor. H-15 ròng = thêm token-thread + value-gate. Dự-án đã chắc H-9/H-11 → H-15 byte-half gần free; chỉ token-thread + value-gate + work-state là mới.
2. **Token-budget = HARD-cap nhưng SE chưa có cơ-chế ĐO token-thực-nạp** (chỉ byte/3.3 ước-lượng) — cùng nút-thắt H-14 budget-hit-rate (Mức-2 chờ-tích-lũy). Nếu AI_INFRA mở tooling đếm token-loaded-per-spawn cho sister, token-governor sẽ lên **measured** thay vì **estimated**. Hiện honest = estimate.
## Evidence
- run-id: `wf_b7f3c8ac-b53` (REVIEW 3-lane: Part-A PASS · Part-B PASS · Honesty HONEST; bắt 2 CONCERN → fixed).
- gate-script runtime: `memory-archive-gate.ps1` value-protect FLAG fired on test-specialist (gotcha#/guard) + A7 GATE PASS 217/217 (integrity intact post-edit).
- detector: 26-flag baseline unchanged (0 new vocab-fork/broken-link từ edits).
- **0 production code.** State THẬT GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · menu 54 · bundle `CsJetgZH`/`BVS0ApIm`.
- Mark đề-xuất (report-before-stamp, CHỜ anh confirm): H-15 memory-budget per-agent → cấp Active-High (mở-rộng cụm §P/§G, supersedes:null additive).

View File

@ -4,7 +4,7 @@
>
> 🔑 **Đây là CANONICAL cho engine governance của SE.** Doc khác (`agents/README`, `session-start/end`) **TRỎ về đây**, KHÔNG copy luật (B1 dogfood — một-chỗ-đổi).
>
> 🔭 **Phạm-vi (S79 consolidate):** doc gốc Harness-11 (PHẦN A-D) nay **gom thêm §E (User-Mark H-12/13 canonical §P)** + **§F (Harness-14 Eval/Budget/Outcome)** — 1 engine governance hợp-nhất (mirror AI_INFRA "harness-all" consolidation). Ledger mark = `.claude/governance/ACTIVE-MARKS.md`.
> 🔭 **Phạm-vi (S79 consolidate · S81 +§G):** doc gốc Harness-11 (PHẦN A-D) nay **gom thêm §E (User-Mark H-12/13 canonical §P)** + **§F (Harness-14 Eval/Budget/Outcome)** + **§G (Harness-15 memory-budget per-agent token-based, S81)** — 1 engine governance hợp-nhất (mirror AI_INFRA "harness-all" consolidation). Ledger mark = `.claude/governance/ACTIVE-MARKS.md`.
>
> 🔑 **Nguyên-lý lõi:** "tự-bảo-trì" = luôn-TỰ-BIẾT khi có drift (detector tự-động, NÊU-CỜ ngay) **CHỨ KHÔNG tự-viết-lại** nội-dung/luật. DÒ tự-động; SỬA do người-chủ-trì (em-main) làm trên cờ. **BAR-KHÔNG-HẠ = một-người-ghi (single-writer)** — "tự-bảo-trì" TUYỆT-ĐỐI KHÔNG miễn-trừ chốt này.
@ -20,6 +20,7 @@
| PHẦN D — orchestration | doc này (3-tier + 1-direction) + `session-start.md`/`session-end.md`/`ultra-on.md` cadence + `hmw.js` checkpoint | mix mechanized + convention |
| PHẦN E — User-Mark (H-12/13, canonical §P) + RC-signature | doc này §E (cơ-chế P1-P10) + `.claude/governance/ACTIVE-MARKS.md` (sổ-cái + display) + 4 lệnh `/user-mark-*` (interface) + `session-start §2.1.4`/`session-end §L.b(h)` (display) | convention (report-trước-đóng-dấu P4) + mechanized (display gắn-lệnh-phiên + tool-deny settings P9) |
| PHẦN F — Harness-14 Eval/Budget/Outcome | doc này §F (3-mức maturity + method) + `eval/` golden-set harness (F.2) + `memory-budget.json`/`measure-agent-memory.ps1` (F.3 = PHẦN A) | eval = executed-file + convention (manual) · budget = mechanized ALIGNED · outcome-correlation/hit-rate = Mức-2 tool-pending-data |
| PHẦN G — Harness-15 memory-budget per-agent (token) | doc này §G (SÀN floor + 3-tầng token) + `memory-budget.json` (`harness_floor` + `token_governor` + `archive_gate.value_protect`) + `session-start §2.1.5` (work-state block) | 2-governor mechanized (byte ⟂ token config) + 5/6 sàn-chức-năng = convention |
| Canonical state (nguồn-chuẩn) | `docs/STATUS.md` CURRENT STATE table | — |
---
@ -157,6 +158,34 @@ SE đã có RAG golden-set harness (KHÔNG phải gap): `eval/golden-set-solutio
---
## PHẦN G — Harness-15: Ngân-sách bộ-nhớ per-agent (token-based) — SÀN + 3 tầng, BẮT BUỘC dùng đủ (🔴 FUNCTION-FLOOR + 🟡 number TAILORED)
> **Adopt S81 (2026-06-20)** — AI_INFRA `2026-06-20-Governance-harness-15-memory-budget` + checklist-15 (inbox `broadcasts/inbox/ai_infra/`). Áp qua 2-process (IMPLEMENT em-main single-writer D9 + REVIEW workflow) per mandate §6. adap-report → `docs/governance/adap-reports/2026-06-20-Governance-harness-15-memory-budget.md`.
>
> 🔑 **Cốt-lõi:** ngân-sách bộ-nhớ = **mức TẬN-DỤNG-TỐI-THIỂU phải đạt, KHÔNG phải trần để dè-xẻn.** Tiết-kiệm-token = **quên-việc** (rơi trạng-thái giữa phiên) = KHÔNG tiết-kiệm thật (làm-lại tốn HƠN — cùng họ Goodhart §F.4/§6.6). Khoảng-trống quan-sát hay rơi đúng vào **chính LEAD** (lead tự-nạp kiến-trúc/luật nhưng bỏ quên trạng-thái-công-việc) → §G.2(c) vá đúng chỗ đó.
### G.1 — Mô-hình = SÀN cố-định + 3 tầng được-quản-lý (A1/A2/A3)
- **SÀN-harness (A1, đo-được):** phần cố-định mỗi spawn = tool-schema + framing + persona/role + lead-pasted base-doc-slice + prompt. **SE TỰ đo (KHÔNG mượn số AI_INFRA):** persona đo-thật `.claude/agents/*.md` (4.3KB13.3KB ≈ 1.3K4.0K tok /3.3); tool-schema+framing harness-injected **SE ước-lượng-riêng** (trùng AI_INFRA ~21K vì **cùng-họ-toolset** Read/Write/Edit/Bash/Grep/Glob/Skill/RAG, **KHÔNG mượn-số**) → **floor ≈ 21K measured-estimate → round-up 30K (cap RIÊNG SE)** (`memory-budget.json:harness_floor`). Honest: persona = đo-thật-byte; phần harness-injected = ƯỚC-LƯỢNG (không byte-count cục-bộ được).
- **A3 tách-nhà chống-đếm-trùng:** persona + lead-docs thuộc **SÀN**, KHÔNG đếm vào L1-managed. L1-managed = own agent-memory + archive `_INDEX` + work-state block (`memory-budget.json:harness_floor._note`).
- **3 tầng managed (A2, con-số = lead hard-cap):** L1-always **12K** (MEMORY.md ~8K + `_INDEX` ~2K + work-state ~2K) · L2-ondemand **6K** (verbatim/gist + skill sections) · L3-RAG **4K** (search/query). Headline luôn-nạp = SÀN 30K + L1 12K = **~42K tok/spawn**; L2/L3 phình-theo-nhu-cầu (no context-rot). 🔑 con-số = QUYỀN-CẤP lead, **KHÔNG AI tự suy-diễn xuống** (`token_governor`).
### G.2 — 6 sàn-CHỨC-NĂNG bắt-buộc (🔴 — map onto SE, honest mechanized-vs-convention)
| Sàn | SE map | Nấc | Cơ-chế-hóa vs quy-ước |
|---|---|---|---|
| **đo-SÀN** (A1) | persona đo-thật-byte **TRỰC-TIẾP** (`Get-ChildItem`, **KHÔNG** qua `measure-agent-memory.ps1` — script đó chỉ đo agent-memory-tier byte = byte-governor, KHÁC floor) + harness-injected ước-lượng + round-up 21K→30K | runtime(đo)→executed-file | mechanized (byte-count trực-tiếp) + convention (ước-lượng harness-injected + round-up) |
| **(a) nạp-đầy L1** | nguyên-tắc dùng-đủ-ngân-sách, no-token-saving, no-garbage (`token_governor._note`) | executed-file → runtime mỗi spawn | **convention** (kỷ-luật nạp) |
| **(b) cắt theo GIÁ-TRỊ** | `archive_gate.value_protect` (gotcha/anti-pattern/recurring/root-cause GIỮ-L1 bất-kể tuổi) ⟂ keep-floor newest-5 (recency) = 2 trục bảo-vệ trực-giao = mark `RC-…10-29-11` áp xuống tầng-bộ-nhớ | executed-file | **convention** (em-main judge; patterns = grep-hint DRY-RUN advisory, KHÔNG auto-exclude) |
| **(c) work-state block @start** | `session-start §2.1.5` LEAD nạp+phát-biểu: roadmap đang-chạy + việc-dở + quyết-định-chờ + lỗi-lặp-lại | executed-file → runtime mỗi phiên | **convention** (kỷ-luật đầu-phiên, vá khoảng-trống-LEAD) |
| **(d) 3 tệp-chốt L1** | (1) persona `.claude/agents/<name>.md` + (2) own `agent-memory/<name>/MEMORY.md` auto-inject + (3) MEMORY-PACK slice (`hmw.js` args) — **đã CÓ SẴN SE** | executed-file | convention (verify-declare) |
| **(e) 2-governor** | byte (tiers/archive_gate) ⟂ token (`token_governor`) — giữ CẢ HAI, KHÔNG gộp (đo 2 thứ khác: file-trên-đĩa ≠ ngữ-cảnh-nạp) | executed-file | **mechanized** (2 config tách) |
### G.3 — Tùy-chỉnh (🟡) + honest tổng
- 🟡 con-số SÀN (SE tự-đo 30K) · con-số 3 tầng (theo khối-lượng ERP nhiều-module) · hình-thức work-state block (SE = session-start REPORT + carry-list). Con-số AI_INFRA (~21K) = bằng-chứng HỌ, **KHÔNG** áp-cứng SE.
- **Honest nấc tổng:** mechanized = chỉ **(e) 2-config byte+token** + **đo-SÀN** (qua measure script); **5/6 sàn-chức-năng = CONVENTION** (nạp-đầy · cắt-giá-trị · work-state · 3-tệp-chốt = kỷ-luật người+AI). KHÔNG nhận "mechanized" cho kỷ-luật. `value_protect.patterns` = grep-hint DRY-RUN (advisory FLAG), **KHÔNG enforced auto-exclude** (archive-gate giữ DRY-RUN, em-main quyết — D6).
- **token≈byte/3.3** (VN thật; byte/4 = cận-trên → headroom THẬT lớn hơn). Floor = đo-được không-exact (honest-note b). Agent chưa-có-archive (database-agent/investigator-api/...) → phần "`_INDEX` theo ngân-sách" moot với chúng (honest-note d).
---
## CAVEAT (trung-thực — đọc trước khi tự nhận "đã tự-bảo-trì")
- **No-OS-hook:** detector + gate chạy TRONG thân session-start/end body do em-main kích — KHÔNG fully-autonomous. Đúng mức: **DÒ tự-động + toàn-diện; SỬA + GÁC dựa người-chủ-trì.**
- **Auto-WRITE luật/copy = MỐI-NGUY #1, CỐ Ý CHƯA LÀM** — defer tới ≥2 sự-cố thật mà thủ-công thất-bại (hiện 0). Chọn nhánh chỉ-DÒ-NÊU-CỜ cho mọi thứ chạm luật/copy (1-sửa-sai → N-chỗ-sai + phá hash broadcast đóng-băng).

View File

@ -374,7 +374,7 @@ Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- User nói "consolidate", "compact", "gọn lại MD", "rõ ràng MD"
- Cuối phase đóng (>1 tháng) khi compact STATUS/HANDOFF/migration-todos
### 6.6 Quyết-định kiến-trúc/chức-năng = tiêu-chí khách-quan (KHÔNG cảm-tính) [User-Mark H-12/13 + H-14, S79]
### 6.6 Quyết-định kiến-trúc/chức-năng = tiêu-chí khách-quan (KHÔNG cảm-tính) [User-Mark H-12/13 + H-14, S79 · +H-15 value-gate S81]
> **Adopt S79 (2026-06-20)** — AI_INFRA `rc-signature` (06-19) + `harness-14-adopt` (06-20) + User-Mark canonical §P. Bịt một kẽ-hở: từ-chối/cắt một chức-năng bằng **lập-luận cảm-tính**. Quyền tự-quyết HÌNH-THỨC (form-autonomy) GIỮ nguyên — rule này chỉ chặn cảm-tính. Marks Active-High đã anh-confirm-stamp → [`.claude/governance/ACTIVE-MARKS.md`](../.claude/governance/ACTIVE-MARKS.md) (3 mark: objective-criteria `RC-…10-29-09` · User-Mark `…10-29-10` · time/age `…10-29-11`); cơ-chế P1-P10 → [`harness-11-engine.md §E`](governance/harness-11-engine.md).
@ -395,6 +395,7 @@ Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- **AI = neo-lý-tính.** Gặp quyết-định biện-minh bằng cảm-giác ("nhiều quá", "không cần cho quy-mô tụi tôi", "cũ rồi") → em-main **nêu-cờ + bác trên cơ-sở khách-quan**, KHÔNG xoa-dịu. "AI phải lý-tính HƠN ở chỗ này, không để con-người kéo mình về phía cảm-tính."
- **Thẩm-quyền phán "cần/thừa" = tầng xuyên-dự-án (AI_INFRA)**, KHÔNG dự-án đơn-lẻ tự-phán "thừa" (một dự-án chỉ thấy phạm-vi mình → thiếu bối-cảnh). Chức-năng adopt **đầy-đủ + nhất-quán**; chỉ HÌNH-THỨC là phần tự-chọn.
- **Chống "kinh-tế giả" (Goodhart)** — cắt chất-lượng để tiết-kiệm token thường khiến **làm-đi-làm-lại → tốn HƠN**. Tổng-quát rule H-8 "KHÔNG hạ model để chạy nhanh" thành "KHÔNG hạ chất-lượng bất-kỳ để tiết-kiệm". Áp NGAY, không chờ data. Mỗi chỉ-báo tự-động (recall/hit-rate/byte) phải gắn câu hỏi "có làm anh chốt-OK sớm hơn không".
- **Cắt-tỉa bộ-nhớ theo GIÁ-TRỊ, KHÔNG theo TUỔI (H-15 B(b)).** Khi lưu-trữ/cắt L1→L2: GIỮ lỗi-lặp-lại + anti-pattern + gotcha + root-cause **bất-kể tuổi** (cắt theo giá-trị-thấp, KHÔNG FIFO-theo-ngày) — cùng họ time/age ở trên, áp xuống tầng-bộ-nhớ. Cơ-chế → [`memory-budget.json:archive_gate.value_protect`](../.claude/agent-memory/memory-budget.json) + [`harness-11-engine.md §G`](governance/harness-11-engine.md). Token-budget = **sàn-tận-dụng KHÔNG trần-tiết-kiệm** (tiết-kiệm-token = quên-việc).
- **Chữ-ký RC + User-Mark:** mỗi đổi-luật cấp-governance từ S79 mang `RC-pqhuy1987-dd-mm-yyyy-hh-mm-ss` (anh ký-duyệt qua report-trước-đóng-dấu §E.2/P4) → ledger [`.claude/governance/ACTIVE-MARKS.md`](../.claude/governance/ACTIVE-MARKS.md). 4 cấp Active-High/Active/Medium/Disable (lệnh `/user-mark-*`). Forward-only.
## 7. Testing (Phase 9 active — 77 test pass post-Mig 21 + CI gate live)

View File

@ -50,6 +50,15 @@ $lowMark = [int]([math]::Floor($cap * [double]$gate.low_watermark_ratio)) #
$keepFloor = [int]$gate.keep_floor_entries # A5: never auto-drain below N newest
$strikeNeed = [int]$gate.strike_threshold # A6: consecutive over-cap runs before proposing
# value-protect patterns (Harness-15 B(b), S81): HIGH-VALUE markers (recurring-bug /
# anti-pattern / gotcha / root-cause). If a planned MOVE would archive one OUT of
# L1-hot regardless of age, FLAG it (keep-by-VALUE, not FIFO-by-date). ADVISORY FLAG
# ONLY - em-main decides (no auto-exclude); keep_floor stays the recency axis.
$valPatterns = @()
if ($gate.value_protect -and $gate.value_protect.patterns) {
foreach ($vp in $gate.value_protect.patterns) { if ($vp) { $valPatterns += [string]$vp } }
}
# ---- strike-counter state (A6) -------------------------------------------
# Stateless script => persist a tiny counter file (additive, NOT a memory file).
# Only mutated under -Apply so DRY-RUN is side-effect-free.
@ -155,6 +164,17 @@ foreach ($d in $subDirs) {
if ($afterEst -ge $cap -and $moveCount -eq ($entryCount - $keepFloor)) { $warnFloor = $true }
}
# --- H15 B(b) value-protect: scan the MOVED prefix for high-value markers ---
$valHits = @()
if ($moveCount -gt 0 -and $valPatterns.Count -gt 0) {
$cutLine = $markers[$moveCount] # first KEPT line; moved region = lines [0..cutLine-1]
for ($vli = 0; $vli -lt $cutLine; $vli++) {
foreach ($vp in $valPatterns) {
if ($lines[$vli] -like "*$vp*") { $valHits += $vp; break }
}
}
}
# --- A6 gate the resolution wording on the strike count ---
if ($warnFloor) {
$resolve = "WARN keep-floor hit ($keepFloor); cannot auto-drain - SPLIT/condense entries by hand"
@ -165,6 +185,10 @@ foreach ($d in $subDirs) {
}
Write-Output ("{0,-24} {1,9} {2,5} {3,10} {4,7} {5,12} {6}" -f $sub, $bytes, 'YES', $entryCount, $cur, "~$afterEst", $resolve)
if ($valHits.Count -gt 0) {
$uniqHits = ($valHits | Select-Object -Unique) -join ', '
Write-Output (" [H15 B(b) VALUE-PROTECT] move-set has high-value marker(s): $uniqHits -> KEEP in L1 regardless of age (do NOT age-archive); em-main decides")
}
}
if (-not $anyOver) {