"""Review gate model - HITL approval/rejection records.""" from sqlalchemy import Column, String, Integer, Text, ForeignKey, DateTime from datetime import datetime from app.models.base import Base, TimestampMixin, TenantMixin class Review(Base, TimestampMixin, TenantMixin): """A review gate record for human-in-the-loop. Types: approval (before proceed), acceptance (final delivery), arbitration (conflict resolution), quality_check Status: pending, approved, rejected, escalated """ __tablename__ = "reviews" id = Column(Integer, primary_key=True, autoincrement=True) task_id = Column(Integer, ForeignKey("tasks.id"), nullable=False, index=True) project_id = Column(Integer, ForeignKey("projects.id"), nullable=False) review_type = Column(String(50), default="approval") status = Column(String(50), default="pending") # Who is reviewing reviewer_id = Column(Integer, ForeignKey("users.id"), nullable=True) reviewer_role = Column(String(50), nullable=True) # Review content review_content = Column(Text, default="") reviewer_comment = Column(Text, default="") # Auto-check results (JSON: rules_check, llm_judge_score, etc.) auto_check_result = Column(Text, default="{}") # Timestamps submitted_at = Column(DateTime, default=datetime.utcnow) reviewed_at = Column(DateTime, nullable=True) def __repr__(self): return f""