Skip to content

feat: ontology/catalog plane above the document KG (#13) - #73

Open
seonghobae wants to merge 17 commits into
mainfrom
cursor/ontology-catalog-plane-90aa
Open

feat: ontology/catalog plane above the document KG (#13)#73
seonghobae wants to merge 17 commits into
mainfrom
cursor/ontology-catalog-plane-90aa

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Closes #13.

Intent

Add the buyer-facing ontology/catalog plane above naruon's document knowledge graph. A steward can register, list, retrieve, and query tenant-scoped glossary terms, catalog datasets, and concept assets while keeping document bodies and specialist-engine responsibilities in their owning products.

This is not LineageWeave, DiskSage ingest/preview, a local GRC registry, or a TEPP/IRT scoring implementation.

Buyer workflow

  • POST /plane/catalog-objects — register a glossary term, catalog dataset, or concept asset
  • GET /plane/catalog-objects and GET /plane/catalog-objects/{id} — browse the tenant plane
  • GET /plane/query?q=... — find objects by title, alias, concept key, or document-KG identifier
  • POST .../document-kg-links — attach an opaque naruon/DiskSage/commons reference without ingesting content
  • POST .../concept-bindings — attach an ontology concept key

Every successful response includes Korean buyer guidance in customer_next_action and the recorded policy_decision_id. Steward display names remain usable under purpose-bound authorization rather than indiscriminate masking.

Identity, policy, and trust boundary

Production requests use:

  • Authorization: Bearer <Keyverse access token>
  • X-CWL-Tenant-Reference
  • X-CWL-Access-Purpose (catalog_browse | glossary_stewardship | ontology_query | document_kg_alignment)

Raw X-CWL-Oidc-Subject authentication is disabled by default, including when JWKS coordinates are absent. A non-external local demo or CI environment may explicitly set SDP_ALLOW_UNVERIFIED_SUBJECT_HEADER=true; JWKS-configured environments reject the raw header even when that flag is present. Paid-pilot and production deployments must not enable the demo flag.

All /plane/* operations invoke the existing policy.evaluate() before catalog access. The existing policy evidence store records allow/deny decisions; successful envelopes return the corresponding decision ID. SDP does not provision tenants, an IdP, or SCIM.

Persistence and data model

  • In-memory remains the pytest/CI default when SDP_DATABASE_DSN is unset.
  • With SDP_DATABASE_DSN, create/list/get/query/attach use migration 0002 so paid-pilot restarts retain catalog rows.
  • No parallel schema, no direct document storage, and no AGE/pgvector dependency for this relational plane.
  • 3NF, two-or-more-word snake_case: catalog_objects, object_definitions, object_aliases, document_kg_links, concept_object_bindings, commons_score_references, object_stewards.
  • In-memory and SQL stores enforce the same tenant-local slug and child-relation uniqueness contracts.
  • Document-KG identifiers are strict opaque identifiers; local paths, relative paths, file URIs, and path-bearing values are rejected.
  • Provenance and score pointers require HTTPS.

Boundaries preserved

Review remediation

The initial CodeRabbit review was against aa53a8e and became stale after the following exact-source repairs:

  • shared RLock around the in-memory store's check/write/iteration boundary
  • in-memory/SQL duplicate relation parity
  • Literal-derived runtime value sets and typed object_kind query validation
  • HTTPS-only external pointers and strict opaque identifier validation
  • policy decision/evidence recording on every catalog-plane operation
  • Korean buyer next-action copy
  • snapshot/restore test isolation
  • raw subject-header authentication disabled by default with explicit demo/CI opt-in only

Resolved review threads were closed only after checking the current source. The raw subject-header finding is addressed by the new default-deny regression and implementation; it remains to be resolved after exact-head CI confirms the change.

TDD and verification

The default-deny subject-header regression was added before the production change. The focused RED reproduced the vulnerable behavior as Failed: DID NOT RAISE TenantBindingError; the minimal implementation then made both the default-deny case and explicit-demo-opt-in case pass in the focused harness.

Current exact head: bfa409f8971a3b28aac31ec7bca371fa94f7f07f.

Exact-head repository Tests, fuzz, Security Scan, and SAST runs were triggered by this source change and remain authoritative. Do not merge from predecessor-head evidence. Merge still requires every live required check, all review threads resolved, and a qualifying independent current-head approval.


Open in Devin Review

Summary by CodeRabbit

  • 새로운 기능

    • 카탈로그 객체 생성·조회·검색과 문서 지식 그래프 및 온톨로지 연결 기능을 추가했습니다.
    • 설정된 데이터베이스를 통해 카탈로그 데이터를 지속적으로 저장하고 테넌트별로 격리합니다.
    • 정책 결정 정보가 응답에 포함됩니다.
    • 기업 마스터 엔터티 해석 계약을 문서화했습니다.
  • 보안

    • 검증되지 않은 주체 헤더 인증을 기본 차단하고, 운영 환경에서는 검증된 Bearer 토큰을 사용합니다.
  • 문서

    • 인증, 저장소 운영, 카탈로그 계약 및 표준 참고 자료를 보강했습니다.
  • 개선

    • 버전을 0.3.1로 업데이트했습니다.

Add create/list/get/query for glossary and catalog objects that reference
naruon document-KG ids instead of ingesting documents. Bind Keyverse OIDC
subject and X-CWL-Tenant-Reference fail-closed, keep steward PII usable,
and persist the plane in 3NF snake_case tables (issue #13).

Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Aug 18, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

온톨로지·카탈로그 평면을 추가했다. 테넌트 바인딩, 카탈로그 객체 API, 문서 KG 연결, 개념 바인딩, 검색, 3NF 마이그레이션 및 관련 문서를 구현했다. 테스트는 권한, 격리, JWT, 입력 검증을 확인한다.

Changes

온톨로지·카탈로그 평면

Layer / File(s) Summary
카탈로그 계약과 저장 구조
src/sdp_core/catalog_plane.py, src/sdp_core/__init__.py, migrations/0002_ontology_catalog_plane.sql, docs/adr/0001-ontology-catalog-plane.md, README.md, docs/implementation-compliance.md, docs/papers/README.md, CHANGELOG.md, pyproject.toml
Pydantic 계약과 공개 타입을 추가했다. 카탈로그 객체, 정의, 별칭, 문서 KG 링크, 개념 바인딩, 점수 참조 및 스튜어드 테이블을 추가했다. ADR과 구현 문서를 갱신했다.
테넌트 바인딩과 권한 경계
src/sdp/tenant_binding.py, src/sdp/api.py
OIDC subject, Bearer JWT, 테넌트 참조 및 접근 목적을 fail-closed 방식으로 검증한다. 검증 결과를 PlaneActor로 변환하고 오류 정보를 HTTP 응답으로 변환한다.
카탈로그 객체 처리
src/sdp/catalog_plane.py
테넌트별 객체 생성, 목록·단건 조회, 문서 KG 링크 추가, ontology concept binding 추가 및 부분 문자열 검색을 구현했다. 관리자와 리더의 역할별 권한을 적용했다.
Catalog-plane API 연결
src/sdp/api.py, tests/test_api.py
/plane/catalog-objects, /plane/query 및 연결 엔드포인트를 추가했다. 권한, 입력, 미존재 오류를 HTTP 상태 코드로 변환한다. 테스트 상태 초기화에 catalog plane을 포함했다.
동작 및 마이그레이션 검증
tests/test_catalog_plane.py, tests/test_migrations.py
객체 생성·조회·검색, 테넌트 격리, 역할 제한, fail-closed 바인딩, JWT 테넌트 일치, KG 식별자 검증 및 3NF 마이그레이션 제약을 검증한다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Merge Risk: 🟠 High · up to aa53a

This PR adds externally reachable catalog-object writes and queries, but the current implementation can trust a caller-supplied identity header as an administrator and omits required policy decision and audit propagation; it also permits relationship duplicates and unsafe concurrent access in the in-memory store. These create concrete security, consistency, and availability risks, so the PR is not ready to merge until the identity boundary and enforcement/storage issues are addressed.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant FastAPI
  participant bind_keyverse_tenant
  participant catalog_plane
  participant CatalogStore
  Client->>FastAPI: catalog-plane request with tenant headers
  FastAPI->>bind_keyverse_tenant: validate identity, tenant, and purpose
  bind_keyverse_tenant-->>FastAPI: return PlaneActor
  FastAPI->>catalog_plane: execute catalog operation
  catalog_plane->>CatalogStore: create, retrieve, link, or query object
  CatalogStore-->>catalog_plane: return tenant-scoped result
  catalog_plane-->>FastAPI: return PlaneEnvelope
  FastAPI-->>Client: return response or mapped error
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning 카탈로그·글로서리·문서 KG 연결 기능은 추가했지만 Apache AGE·pgvector 기반 구현과 정책 거버넌스 기능은 확인되지 않습니다. Apache AGE·pgvector 저장소 연동과 정책 거버넌스 범위를 구현하거나 #13의 요구사항을 별도 이슈로 분리하십시오.
✅ Passed checks (4 passed)
Check name Status Explanation
Out of Scope Changes check ✅ Passed 문서, 마이그레이션, 테스트, 버전 변경은 온톨로지·카탈로그 평면 구현과 직접 관련됩니다.
Docstring Coverage ✅ Passed Docstring coverage is 87.50% which is sufficient. The required threshold is 80.00%.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 문서 KG 위에 온톨로지·카탈로그 평면을 추가하는 주요 변경 사항을 명확하게 요약한 제목입니다.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/ontology-catalog-plane-90aa

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae
seonghobae marked this pull request as ready for review August 18, 2026 05:24
coderabbitai[bot]

This comment was marked as resolved.

cursoragent and others added 9 commits August 18, 2026 05:34
Reject X-CWL-Oidc-Subject when Keyverse JWKS is configured, reuse
policy.evaluate for create/search evidence without masking, lock the
in-memory store, and enforce unique child keys plus opaque https-only
references.

Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
Route create/list/get/query/attach through a 0002-backed store when the
DSN is set so a paid-pilot restart keeps glossary and catalog rows.
Keep the in-memory store as the CI/pytest default. SQLite unit tests
exercise the same table mapping without Apache AGE.

Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
The test-only 0002 adapter already maps TIMESTAMPTZ to TEXT. SQLite
also rejects DEFAULT now(), so unit tests now substitute
CURRENT_TIMESTAMP. Production Postgres still uses the original
migration.

Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for bfa409f8971a3b28aac31ec7bca371fa94f7f07f.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (10 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (10 files)"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs (3 files)"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs (3 files)"]
  R2 --> V2["docs review"]
  Evidence --> S3["Test (7 files)"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test (7 files)"]
  R3 --> V3["targeted test run"]
Loading

@opencode-agent

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: bfa409f8971a3b28aac31ec7bca371fa94f7f07f
  • Workflow run: 32132218586
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

Pull request overview

OpenCode could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for bfa409f8971a3b28aac31ec7bca371fa94f7f07f.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (10 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (10 files)"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs (3 files)"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs (3 files)"]
  R2 --> V2["docs review"]
  Evidence --> S3["Test (7 files)"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test (7 files)"]
  R3 --> V3["targeted test run"]
Loading

@opencode-agent opencode-agent Bot added priority: medium Normal-priority or P2 work status: needs-review Open pull request requiring current-head review or checks type: feature New or expanded product capability labels Aug 22, 2026
@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown

Caution

Review failed

An error occurred during the review process. Please try again later.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

Next included review available in 3 minutes.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 751db734-32d2-4a6d-85bf-edbce1e311c1

📥 Commits

Reviewing files that changed from the base of the PR and between f592e7d and 311668e.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (24)
  • docs/implementation-compliance.md
  • pyproject.toml
  • src/sdp/api.py
  • src/sdp/browse.py
  • src/sdp/catalog.py
  • src/sdp/catalog_plane.py
  • src/sdp/catalog_plane_store.py
  • src/sdp/config.py
  • src/sdp/connectors.py
  • src/sdp/orchestrator.py
  • src/sdp/policy.py
  • src/sdp/seed.py
  • src/sdp/tenant_binding.py
  • src/sdp_core/contracts.py
  • tests/__init__.py
  • tests/conftest.py
  • tests/test_api.py
  • tests/test_authz.py
  • tests/test_browse.py
  • tests/test_catalog.py
  • tests/test_catalog_plane.py
  • tests/test_catalog_plane_sql.py
  • tests/test_integration_catalog_plane.py
  • tests/test_orchestrator.py
📝 Walkthrough

Walkthrough

카탈로그 플레인에 tenant-bound API, 정책 결정 기록, 메모리·관계형 저장소 선택, 0002 마이그레이션, 인증 제한을 추가했다. 기업 마스터 해석의 소유권과 unique·miss·tie 계약도 문서화했다. 테스트는 API, 보안, 영속성, 테넌트 격리를 검증한다.

Changes

카탈로그 계약과 저장 구조

Layer / File(s) Summary
카탈로그 계약과 3NF 저장 구조
src/sdp_core/catalog_plane.py, src/sdp_core/__init__.py, migrations/0002_ontology_catalog_plane.sql
공개 카탈로그 타입과 PlaneEnvelope.policy_decision_id를 확장했다. 문서-KG 식별자와 URI에 검증 규칙을 적용했다. 카탈로그 객체, 정의, 별칭, KG 링크, 개념 바인딩, 점수 참조, 스튜어드 테이블을 추가했다.
기업 마스터 해석 계약
docs/adr/0001-ontology-catalog-plane.md, docs/adr/0002-corporate-master-resolution-owner.md, docs/corporate-master-resolution-api.md, docs/prd-trd.md, docs/implementation-compliance.md, CHANGELOG.md, docs/papers/README.md
Semantic Data Portal의 해석 소유권과 sdp.corporate-master-resolution/v1 계약을 정의했다. unique만 바인딩을 반환하고 miss·tie는 unbound로 유지하도록 명시했다. 구현 전 heuristic과 자동 row 생성을 금지했다.

테넌트 바인딩과 인증 경계

Layer / File(s) Summary
Keyverse 인증과 subject 헤더 제한
src/sdp/tenant_binding.py, README.md, CHANGELOG.md
Keyverse Bearer JWT를 기본 인증 경로로 정의했다. X-CWL-Oidc-Subject는 명시적 opt-in과 미구성 JWKS 조건에서만 허용한다. JWKS가 구성되면 해당 헤더를 거부한다.
인증 경계 검증
tests/conftest.py, tests/test_catalog_plane_subject_header_trust.py, tests/test_catalog_plane.py
subject 헤더의 기본 거부와 데모 opt-in 허용을 검증한다. JWKS 구성 시 401 오류를 검증한다. tenant 불일치, 역할 부족, 지원하지 않는 접근 목적도 검증한다.

카탈로그 저장소 구현

Layer / File(s) Summary
저장소 추상화와 구현
src/sdp/catalog_plane_store.py
SDP_DATABASE_DSN이 없으면 스레드 안전 인메모리 저장소를 사용한다. DSN이 있으면 SQLAlchemy 관계형 저장소를 사용한다. 객체와 하위 레코드를 트랜잭션으로 저장하고, 테넌트 범위 조회·검색·중복 검증·스냅샷·복원을 제공한다.
0002 영속성 연결
migrations/0002_ontology_catalog_plane.sql, README.md, docs/adr/0001-ontology-catalog-plane.md, tests/test_catalog_plane_sql.py, tests/test_integration_catalog_plane.py
SQLite 호환 스키마와 live DSN 재오픈 경로를 검증한다. 저장된 카탈로그 객체, 정의, 스튜어드 정보와 연결 데이터의 복원을 검증한다.

카탈로그 처리와 API 연결

Layer / File(s) Summary
정책 기반 카탈로그 작업
src/sdp/catalog_plane.py
생성·조회·검색·연결 작업을 저장소 호출로 변경했다. policy.evaluate() 결과의 결정 ID를 응답 envelope에 기록한다. 중복 링크와 개념 바인딩을 검증한다.
FastAPI 엔드포인트
src/sdp/api.py
카탈로그 객체 생성·목록·단건 조회, 문서 KG 링크 연결, 개념 바인딩, 검색 엔드포인트를 추가했다. tenant 바인딩 후 권한·입력·존재 오류를 HTTP 상태 코드로 변환한다.

동작과 영속성 검증

Layer / File(s) Summary
API 및 테넌트 동작 검증
tests/test_api.py, tests/test_catalog_plane.py
객체 생성, 목록·단건 조회, 검색, 링크·바인딩 연결, 정책 결정 ID, 오류 응답, 테넌트 격리를 검증한다.
저장소 및 마이그레이션 검증
tests/test_catalog_plane_sql.py, tests/test_migrations.py, tests/test_integration_catalog_plane.py
저장소 선택, SQLite 재시작 영속성, 고유 제약, 0002 테이블 구조와 조건부 live DSN 동작을 검증한다.
릴리스 버전 갱신
pyproject.toml
프로젝트 버전을 0.3.1로 변경했다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Merge Risk: 🔵 Low · up to f592e

The PR adds tenant-scoped catalog persistence, querying, and attachment APIs while tightening subject-header authentication defaults. It is mergeable with explicit owner awareness for test isolation and cleanup, managed access to the authentication configuration, SQL query efficiency, and documentation accuracy; the supplied evidence does not show a release-blocking defect.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant FastAPI
  participant TenantBinding
  participant CatalogPlane
  participant CatalogPlaneStore
  Client->>FastAPI: tenant 및 인증 헤더와 catalog 요청
  FastAPI->>TenantBinding: identity·tenant·purpose 검증
  TenantBinding-->>FastAPI: tenant-bound actor 반환
  FastAPI->>CatalogPlane: 카탈로그 작업 호출
  CatalogPlane->>CatalogPlaneStore: 객체 저장·조회·연결·검색
  CatalogPlaneStore-->>CatalogPlane: 테넌트 범위 레코드 반환
  CatalogPlane-->>FastAPI: policy_decision_id 포함 envelope 반환
  FastAPI-->>Client: 결과 또는 HTTP 오류 반환
Loading
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning 온톨로지 기반 카탈로그, glossary, policy governance, 독립 구성 요소는 구현했습니다 [#13]. 그러나 연결된 이슈가 명시한 Apache AGE와 pgvector 통합은 추가하지 않았습니다. Apache AGE와 pgvector 통합을 구현하거나, 해당 요구사항을 별도 후속 이슈로 분리하고 #13의 수용 범위를 명확히 갱신하십시오.
Out of Scope Changes check ⚠️ Warning 카탈로그 평면, 인증, 영속화, 마이그레이션, 테스트 문서는 PR 목표와 관련됩니다. 그러나 corporate-master entity-resolution 소유권 ADR, API 계약, ONT-009 요구사항은 연결된 이슈의 카탈로그 평면 범위를 넘어서는 별도 기능 계약입니다. corporate-master entity-resolution 관련 변경을 별도 PR과 이슈로 분리하거나, #13에 해당 범위를 명시적으로 추가하십시오.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 문서 KG 위의 ontology/catalog plane 추가라는 PR의 주요 변경을 정확하고 간결하게 설명합니다.
Docstring Coverage ✅ Passed Docstring coverage is 93.22% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 118 functions across 12 files. (7 skipped: …
Full details: Docstring Coverage

Explanation

Docstring coverage is 93.22% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 118 functions across 12 files. (7 skipped: 7 unsupported.)

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/ontology-catalog-plane-90aa

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

seonghobae added a commit that referenced this pull request Aug 23, 2026
…ners)

Keep the file as the steward next-action list. Clarify Keyverse header trust, GRC redaction ownership, #32-before-#73, org trivy-fs/osv/dependency-review, and NVIDIA_NIM as an external connector variable.
seonghobae added a commit that referenced this pull request Aug 25, 2026
- Preserve policy-driven apply_mask (PRD P0); scope no-new-masking rule
  to the catalog plane; GRC owns redaction/evidence export contract.
- Document-KG owner is naruon; LineageWeave owns lineage DAG reconstruction.
  Portal writes neither; provenance pointers only (PROV-DM row aligned).
- Record caller-supplied user on /browse preview as an open gap instead of
  claiming fail-closed today; DSN does not yet persist catalog CRUD until #73.
- Cite existing Figma file JjYSqr6nWxpARUjaVKhG16 from design-tokens contract;
  Storybook scene/edge-case event inventory listed as open UI gap.
- Mark NVIDIA_NIM_API_KEY as external orchestrator connector var, currently
  unreferenced by this repo's workflows/tests.
- Insert PR #81 (CVE-2026-69247 cryptography bump) at top of merge order.
devin-ai-integration[bot]

This comment was marked as resolved.

@seonghobae
seonghobae enabled auto-merge (squash) August 26, 2026 13:29
coderabbitai[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 2 new potential issues.

Open in Devin Review

Comment thread src/sdp/policy.py

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Verified roles ignored outside create/search branches

evaluate only forwards roles in the early create and search branches. The dataset-level checks (_can_mutate, _is_admin(subject) at policy.py:84 and :92, _has_reader_role(subject) at policy.py:108) drop it and fall back to demo-map has_role. Harmless now since the plane only uses create/search, but a future caller passing verified roles for query/preview/schema/publish would silently be evaluated against demo-map roles instead.

(Refers to this code)

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread src/sdp_core/contracts.py
Comment on lines 63 to +65
license: str = "internal"
related_datasets: list[str] = Field(default_factory=list)
schema: list[ColumnMetadata] = Field(default_factory=list)
dataset_schema: list[ColumnMetadata] = Field(default_factory=list, alias="schema")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: schema field renamed with backward-compatible alias

Dataset and the create/patch requests rename schema to dataset_schema with alias="schema" and serialize_by_alias=True, so JSON input/output keeps the schema key while avoiding the Pydantic .schema() method shadow. All internal .schema reads were updated, demo_seed.py still binds via the alias, and validate_metadata maps the schema requirement to dataset_schema. No stale dataset.schema attribute reads remain in src.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@opencode-agent
opencode-agent Bot disabled auto-merge August 26, 2026 14:29
Comment thread tests/test_api.py

import sdp.catalog as app_catalog
import sdp.catalog_plane as app_catalog_plane
import sdp.api as app_api
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

priority: medium Normal-priority or P2 work status: needs-review Open pull request requiring current-head review or checks type: feature New or expanded product capability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SDP: ontology/catalog plane above the doc KG

2 participants