ต้องให้ทีมตัดสินใจ + ต้องได้คำตอบจาก agent-platform ไม่ใช่งาน implement
เจอตอนเปิด contracts/identity/v1/identity.schema.yaml จริงเพื่อทำ #17
ปัญหา
ADR-0007 วางลำดับชั้นไว้ว่า Tenant → Workspace → Resource และ schema เขียนกำกับ WorkspaceId ไว้ตรง ๆ ว่า
ขอบเขตงานภายใน tenant — agent, knowledge, tool, policy อยู่ใน workspace
Project และ Department เป็น label ของ workspace ไม่ใช่ชั้น id ใหม่
และ RequestContext มี workspace_id เป็น field จริง (optional เฉพาะ event ระดับ tenant)
แต่ repo นี้ไม่มี workspace เลยทั้ง repo — และเราใช้ department เป็น metadata filter ธรรมดา ซึ่งตาม ADR-0007 คือ label ของ workspace ไม่ใช่ metadata อิสระ
ทำไมต้องรีบ
ถ้าคำตอบคือ knowledge plane ต้องมี workspace_id → มันคือ isolation ชั้นที่สองถัดจาก tenant ไม่ใช่ field เพิ่มเฉย ๆ กระทบ:
| ของที่ต้องแก้ |
ผลกระทบ |
schema.sql |
ต้องมี column workspace_id + เข้า composite index + เข้า unique constraint |
ScopePredicate |
ต้องบังคับ workspace เหมือนที่บังคับ tenant (hard, ไม่ใช่ filter) |
PolicyContext / TenantScope |
ต้องมี workspace scope |
evaluation/ground_truth.py |
fixture ทั้งชุดต้องมี workspace + ต้องมี case พิสูจน์ว่าข้ามไม่ได้ |
department ที่ใช้อยู่ |
อาจต้องเลิกเป็น metadata filter แล้วกลายเป็น label ของ workspace |
เหมือนเคสเดียวกับ #5 — เปลี่ยนหลังมี baseline แล้วตัวเลข benchmark เดิมใช้เทียบไม่ได้ และรอบนี้หนักกว่าเพราะแตะ security boundary ด้วย
ตั้ง milestone ไว้ที่ Phase 1 เพราะ schema.sql อยู่ตรงนั้น — ต้องเคาะก่อนเริ่มเขียนแถวจริงลงตาราง ไม่ใช่หลัง
คำถามที่ต้องได้คำตอบ
- knowledge plane ต้องมี
workspace_id ตั้งแต่แรกไหม หรือ tenant พอสำหรับเฟสนี้
- ถ้าต้องมี —
workspace_id เป็น hard boundary ระดับเดียวกับ tenant หรือเป็นชั้นที่อ่อนกว่า (ข้าม workspace ในเงื่อนไขบางอย่างได้)
department ที่เราใช้เป็น metadata filter อยู่ ควรกลายเป็น label ของ workspace ตาม ADR-0007 หรือคงเป็น metadata ได้
ทางเลือก
- คง tenant อย่างเดียวตอนนี้ แล้วบันทึกเป็น known gap — เร็ว แต่ต้องรื้อ schema ทีหลังแน่ถ้าคำตอบข้อ 1 คือ "ต้องมี"
- ใส่
workspace_id เลยตั้งแต่ตอนนี้ ตาม ADR-0007 — แพงกว่าตอนนี้ ถูกกว่าตอนหลัง
- ใส่เป็น nullable ก่อน แล้วค่อยบังคับตอน Phase 8 — ⚠️ §25 ห้าม "ให้ tenant filter เป็น optional ใน production path" ไว้ชัด ทางนี้เสี่ยงผิดหลักการเดียวกัน
เงื่อนไขว่าปิดได้
ได้คำตอบทั้ง 3 ข้อ แล้วบันทึกเป็น ADR ใน docs/ (เกี่ยวกับ #21) · ถ้าเลือกทาง 2 ให้เปิด issue implement แยก
ถามฝั่ง platform ไว้ที่ #17 แล้ว
อ้างอิง: ADR-0007 · schema.sql, src/enterprise_knowledge/security.py, src/enterprise_knowledge/contracts.py
ต้องให้ทีมตัดสินใจ + ต้องได้คำตอบจาก
agent-platformไม่ใช่งาน implementเจอตอนเปิด
contracts/identity/v1/identity.schema.yamlจริงเพื่อทำ #17ปัญหา
ADR-0007 วางลำดับชั้นไว้ว่า Tenant → Workspace → Resource และ schema เขียนกำกับ
WorkspaceIdไว้ตรง ๆ ว่าและ
RequestContextมีworkspace_idเป็น field จริง (optional เฉพาะ event ระดับ tenant)แต่ repo นี้ไม่มี
workspaceเลยทั้ง repo — และเราใช้departmentเป็น metadata filter ธรรมดา ซึ่งตาม ADR-0007 คือ label ของ workspace ไม่ใช่ metadata อิสระทำไมต้องรีบ
ถ้าคำตอบคือ knowledge plane ต้องมี
workspace_id→ มันคือ isolation ชั้นที่สองถัดจาก tenant ไม่ใช่ field เพิ่มเฉย ๆ กระทบ:schema.sqlworkspace_id+ เข้า composite index + เข้า unique constraintScopePredicatePolicyContext/TenantScopeevaluation/ground_truth.pydepartmentที่ใช้อยู่เหมือนเคสเดียวกับ #5 — เปลี่ยนหลังมี baseline แล้วตัวเลข benchmark เดิมใช้เทียบไม่ได้ และรอบนี้หนักกว่าเพราะแตะ security boundary ด้วย
ตั้ง milestone ไว้ที่ Phase 1 เพราะ
schema.sqlอยู่ตรงนั้น — ต้องเคาะก่อนเริ่มเขียนแถวจริงลงตาราง ไม่ใช่หลังคำถามที่ต้องได้คำตอบ
workspace_idตั้งแต่แรกไหม หรือ tenant พอสำหรับเฟสนี้workspace_idเป็น hard boundary ระดับเดียวกับ tenant หรือเป็นชั้นที่อ่อนกว่า (ข้าม workspace ในเงื่อนไขบางอย่างได้)departmentที่เราใช้เป็น metadata filter อยู่ ควรกลายเป็น label ของ workspace ตาม ADR-0007 หรือคงเป็น metadata ได้ทางเลือก
workspace_idเลยตั้งแต่ตอนนี้ ตาม ADR-0007 — แพงกว่าตอนนี้ ถูกกว่าตอนหลังเงื่อนไขว่าปิดได้
ได้คำตอบทั้ง 3 ข้อ แล้วบันทึกเป็น ADR ใน
docs/(เกี่ยวกับ #21) · ถ้าเลือกทาง 2 ให้เปิด issue implement แยกถามฝั่ง platform ไว้ที่ #17 แล้ว
อ้างอิง: ADR-0007 ·
schema.sql,src/enterprise_knowledge/security.py,src/enterprise_knowledge/contracts.py