Skip to content

Decision: does the knowledge plane need workspace_id? ADR-0007 says department is a workspace label, not metadata #23

Description

@monthop-gmail

ต้องให้ทีมตัดสินใจ + ต้องได้คำตอบจาก 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 อยู่ตรงนั้น — ต้องเคาะก่อนเริ่มเขียนแถวจริงลงตาราง ไม่ใช่หลัง

คำถามที่ต้องได้คำตอบ

  1. knowledge plane ต้องมี workspace_id ตั้งแต่แรกไหม หรือ tenant พอสำหรับเฟสนี้
  2. ถ้าต้องมี — workspace_id เป็น hard boundary ระดับเดียวกับ tenant หรือเป็นชั้นที่อ่อนกว่า (ข้าม workspace ในเงื่อนไขบางอย่างได้)
  3. department ที่เราใช้เป็น metadata filter อยู่ ควรกลายเป็น label ของ workspace ตาม ADR-0007 หรือคงเป็น metadata ได้

ทางเลือก

  1. คง tenant อย่างเดียวตอนนี้ แล้วบันทึกเป็น known gap — เร็ว แต่ต้องรื้อ schema ทีหลังแน่ถ้าคำตอบข้อ 1 คือ "ต้องมี"
  2. ใส่ workspace_id เลยตั้งแต่ตอนนี้ ตาม ADR-0007 — แพงกว่าตอนนี้ ถูกกว่าตอนหลัง
  3. ใส่เป็น 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    coreStorage, ingestion, embedding, retrieval engineneeds-decisionBlocked on a team decision, not on implementationsecurityACL, tenant isolation, policy boundary (§4.2, §4.3)

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions