SPB Git

spb/autoscholar

Public
2.1 KB · 50 lines typescript
1import { boolean, index, jsonb, pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";2import { researchRuns } from "./runs.js";34export const qualityPolicies = pgTable("quality_policies", {5  id: uuid("id").primaryKey().defaultRandom(),6  version: text("version").notNull().unique(),7  active: boolean("active").notNull().default(false),8  profiles: jsonb("profiles").$type<Record<string, unknown>>().notNull(),9  createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),10});1112export const qualityGateResults = pgTable(13  "quality_gate_results",14  {15    id: uuid("id").primaryKey().defaultRandom(),16    runId: uuid("run_id")17      .notNull()18      .references(() => researchRuns.id, { onDelete: "cascade" }),19    evaluationId: uuid("evaluation_id").notNull(),20    policyVersion: text("policy_version").notNull(),21    mode: text("mode").notNull(),22    gate: text("gate").notNull(),23    severity: text("severity").notNull(),24    status: text("status").notNull(),25    message: text("message").notNull(),26    evidence: jsonb("evidence").$type<Record<string, unknown>>().notNull().default({}),27    createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),28  },29  (t) => [index("qgr_run_idx").on(t.runId, t.evaluationId)],30);3132export const publicationDecisions = pgTable(33  "publication_decisions",34  {35    id: uuid("id").primaryKey().defaultRandom(),36    runId: uuid("run_id")37      .notNull()38      .references(() => researchRuns.id, { onDelete: "cascade" }),39    evaluationId: uuid("evaluation_id"),40    decision: text("decision").notNull(), // publish | hold | reject41    decidedBy: text("decided_by").notNull(), // system | admin:<uuid>42    rationale: text("rationale").notNull(),43    override: boolean("override").notNull().default(false),44    overrideRationale: text("override_rationale"),45    gateSummary: jsonb("gate_summary").$type<Record<string, unknown>>().notNull().default({}),46    createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),47  },48  (t) => [index("pub_decisions_run_idx").on(t.runId, t.createdAt)],49);50
Files · main
Menu

Theme