ariadne/agent-ops/rules/project/domain/platform/rules.md
2026-07-24 05:45:04 +09:00

3.4 KiB

domain last_rule_review_commit last_rule_updated_at
platform unborn-head 2026-07-23

platform

목적 / 책임

Go 서버와 마이그레이션 프로세스를 조립하고, 설정·로깅·HTTP·PostgreSQL 연결 및 조직 격리와 최소 권한을 운영 경계에서 강제한다.

포함 경로

  • internal/platform/ — 설정, Fx 부트스트랩, 로깅, HTTP 서버, 데이터베이스 연결과 마이그레이션을 제공한다.
  • apps/server/ — Ariadne 서버 실행 진입점이다.
  • apps/migrate/ — 별도 자격 증명을 사용하는 마이그레이션 진입점이다.
  • deploy/ — PostgreSQL 역할 등 개발·배포 기반 구성을 제공한다.

제외 경로

  • internal/domain/ — 오류·조직·수정 작업의 비즈니스 불변 규칙은 domain-model 책임이다.
  • internal/integration/ — IOP 실행 포트와 외부 이벤트 검증은 integrations 책임이다.
  • apps/client/ — Flutter 사용자 경험과 화면 구성은 client 책임이다.

주요 구성 요소

  • bootstrap.New — Fx로 설정, 로깅, 데이터베이스, HTTP 서버 수명주기를 조립한다.
  • database.Database — runtime·identity 연결과 schema/권한 호환 상태를 관리한다.
  • database.WithinOrganization — 트랜잭션 로컬 조직 컨텍스트를 설정하는 유일한 조직 소유 데이터 접근 경계다.
  • database.runtimeTableAccess — 조직 소유 테이블별 runtime 역할의 최소 권한 목록이다.
  • database.RunMigrations — 전용 역할, advisory lock, checksum과 schema 검증을 적용한다.
  • httpserver.Server/healthz, /readyz와 보안 헤더를 제공한다.

유지할 패턴

  • 모든 환경 변수는 ARIADNE_ 접두사를 사용하고 config.Load에서 기본값과 양의 duration을 검증한다.
  • runtime, identity, migration 연결과 역할을 분리하고 서버 시작 시 실제 역할·권한·소유권·RLS를 검증한다.
  • 조직 소유 데이터 작업은 WithinOrganization의 단일 트랜잭션 안에서 수행한다.
  • 새 조직 소유 테이블은 강제 RLS, 조직 범위 정책, runtimeTableAccess 최소 권한을 같은 변경에 포함한다.
  • 적용된 마이그레이션 파일은 불변으로 두고 새 순번의 상향 마이그레이션을 추가한다.
  • HTTP 수명주기는 Fx hook과 제한된 timeout을 사용한다.

다른 도메인과의 경계

  • domain-model: organization.ID 같은 값 타입을 받지만 도메인 판정을 데이터베이스나 HTTP 구현으로 대체하지 않는다.
  • integrations: IOP 구현체와 외부 API를 조립하되 실행 정책의 권한 불변식은 integrations 경계에서도 검증한다.
  • client: 서버는 API와 상태를 제공하고 client의 Flutter 위젯·테마를 직접 소유하지 않는다.

금지 사항

  • 원시 pgxpool.Pool을 조직 소유 repository나 다른 패키지에 노출하지 않는다.
  • 서버 runtime 또는 identity 역할에 슈퍼사용자, BYPASSRLS, schema create, 테이블 소유권을 부여하지 않는다.
  • 감사 이벤트·오류 발생·승인 같은 불변 이력 테이블에 runtime 수정·삭제 권한을 추가하지 않는다.
  • 운영 환경 쓰기나 최초 전역 사용자·조직 생성 권한을 일반 서버 경계에 임의로 추가하지 않는다.
  • 이미 적용된 마이그레이션의 내용을 수정하지 않는다.