Prompt file imported from maingocanh1702/bestmintonclub-payment-check-bot (
.claude/commands/ap-sn9a-tg-owner-identity-adapter.md). Copyright stays with the author.
Bạn đang chạy AUTOPILOT ITEM 9a (tg-owner-identity-adapter) cho feature member-samename-split — ADAPTER ĐẦU TIÊN (không còn inert, chạm bot.ts thật, có thay đổi hành vi). Wire item-8 vào /merge /rename /unlink của TG.
SPLIT của run-queue item 9: 9a = trio merge/rename/unlink → item-8; 9b = gender/alias → item-6 setter; 9c = whois/debt → item-6 read. Slice này CHỈ 9a.
Tiền đề #1 (codex): export AUTOPILOT_CODEX_BIN="/Users/maingocanh/Projects/Bestminton Club Payment check bot/scripts/codex-review-pin.sh" — chưa set/không exec → HALT CODEX_UNAVAILABLE.
Tiền đề #2 (DEP — item 8 trên origin): git fetch origin rồi git grep -l mergeMemberReference origin/main -- src/owner-merge-rename-unlink-core.ts. Thiếu → HALT DEP_MISSING.
Tiền đề #3 (worktree + DB + env): git worktree add .autopilot/worktrees/tg-owner-identity-adapter -b feat/tg-owner-identity-adapter origin/main (verify git log -1 == origin/main) → cd → source .env → export BOT_TOKEN=test-token OWNER_CHAT_ID=1. Test: DB_PATH=/tmp/ap-tg-owner-identity-adapter.db npm test. Pre-flight scripts/autopilot-scope-gate register --manifest docs/autopilot-manifests/tg-owner-identity-adapter.json. ⚠️ KIT bug scope-gate-ready-block-detection-kit: re-register trước ready nếu session song song register sau.
Tiền đề #4 (§A.0 SYNC-FIRST + IMPACT): BẮT BUỘC impact trên 3 hàm item-8 + 3 handler bot.ts (/merge /rename /unlink); re-derive message hiện tại của mỗi handler + outcome kind của item-8 trên base. KHÔNG tin số dòng trong prompt (interface-drift #21).
Mở docs/autopilot/prompts/tg-owner-identity-adapter.md, đọc TOÀN BỘ block text … và THỰC THI nguyên văn: Pre-flight → Step 0 design-probe → STOP chờ founder → Step 1 → Step 2 TDD failing-first → Step 3 implement → Step 4 verify bundle (gồm detect_changes) → Step R codex 2× FULL clean liên tiếp → reconcile manifest scope (L19) → STOP_AT_READY.
⚠️ DESIGN_PROBE_REQUIRED (adapter đầu tiên, yêu cầu byte-identical + thay đổi hành vi thật trên lệnh owner live). Step 0 ghi design-probe.md + STOP, chờ founder chốt 4 điểm:
- OUTCOME→MESSAGE map — mỗi command, map từng outcome kind của item-8 → message TG render; chứng minh case non-ambiguous byte-identical (merged/renamed/conflict/unlinked/not_found); liệt kê i18n MỚI cho same-name outcome (ambiguous(side) + hint "#id", same_member, invalid_new_name), t(vi,en).
- MERGE mutate model — xác nhận TG /merge DIRECT-mutate (không confirm) →
mergeMemberReferenceđúng (resolveMergeReference+commitMerge là cho Messenger confirm, item 11); refuseCombine throw vẫn propagate + catch y như cũ. - resolveMemberArg GIỮ — /gender (L2275/2291) còn dùng → KHÔNG xoá (9b migrate gender); chỉ /merge ngừng gọi.
- NO-CHANGE surface — không db.ts, không đổi merge-notice/MergeResult, không money math, không gender/alias (9b), không whois/debt (9c) — CHỈ swap resolution ở 3 handler. STOP chờ founder.
P1 identity, adapter live — manual_only, KHÔNG auto-merge/push. Ràng buộc chính:
- /merge →
mergeMemberReference(keepArg,dropArg); switch outcome → merged (byte-identical) | ambiguous/same_member/not_found (mới). Giữ try/catch refuseCombine + render merged-notice y hệt. - /rename →
renameMemberReference(oldName,newName); map renamed/conflict (byte-identical) + invalid_new_name/ambiguous/not_found (mới). - /unlink →
unlinkMemberReference(ref,platform); map unlinked flags (byte-identical) + ambiguous/not_found (mới). Giữ parseUnlinkArgs + platform arg. - NEGATIVE (SCOPE_DRIFT → HALT): KHÔNG db.ts; KHÔNG money math/merge-notice; KHÔNG gender/alias (9b); KHÔNG whois/debt (9c); KHÔNG matching.ts; KHÔNG xoá resolveMemberArg.
- Test (2) (/merge same-name → ambiguous fail-closed, không auto-pick) là bằng chứng fix same-name trên TG.
- Counters:
fix-round-count> 5 → MAX_ROUNDS HALT; cùng file ≥3 vòng → REGION_THRASH HALT. Codex kéo db.ts/gender/whois/money/notice → ngoài contract, HALT escalate.
KHÔNG git add -A (stage per-file). KHÔNG merge/push. Final report Variant A (READY) nêu rõ: (a) outcome→message map + path nào byte-identical + i18n mới, (b) same-name giờ fail-closed + regression chứng minh, (c) /merge dùng mergeMemberReference direct-mutate + refuseCombine không đổi, (d) resolveMemberArg còn phục vụ /gender (9b), (e) không đổi db.ts/money/notice → scripts/autopilot-scope-gate ready --manifest docs/autopilot-manifests/tg-owner-identity-adapter.json.
