SPB Git

spb/airiskindex Public

The most methodologically rigorous, fully transparent AI job-exposure index.

TypeScript 88% Python 6.1% SQL 2.7% CSS 1.2% JavaScript 0.9% Shell 0.8%

feat(db): initial migration

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
simon-pierre boucher committed 6 days ago (Aug 5, 2026) parent 62a5a0f

Showing 2 changed files with +172 and −0

added packages/db/prisma/migrations/20260805045624_init/migration.sql +169 −0
@@ -0,0 +1,169 @@
1 +-- CreateTable
2 +CREATE TABLE "Occupation" (
3 + "code" TEXT NOT NULL,
4 + "title" TEXT NOT NULL,
5 + "description" TEXT,
6 + "escoUri" TEXT,
7 + "romeCode" TEXT,
8 + "crosswalkNote" TEXT,
9 + "medianWageCents" INTEGER,
10 + "wageCurrency" TEXT NOT NULL DEFAULT 'USD',
11 + "employment" INTEGER,
12 +
13 + CONSTRAINT "Occupation_pkey" PRIMARY KEY ("code")
14 +);
15 +
16 +-- CreateTable
17 +CREATE TABLE "Task" (
18 + "id" TEXT NOT NULL,
19 + "occupationCode" TEXT NOT NULL,
20 + "statement" TEXT NOT NULL,
21 + "importance" DOUBLE PRECISION,
22 +
23 + CONSTRAINT "Task_pkey" PRIMARY KEY ("id")
24 +);
25 +
26 +-- CreateTable
27 +CREATE TABLE "TaskRating" (
28 + "id" TEXT NOT NULL,
29 + "taskId" TEXT NOT NULL,
30 + "dimension" TEXT NOT NULL,
31 + "model" TEXT NOT NULL,
32 + "promptVersion" TEXT NOT NULL,
33 + "sampleIndex" INTEGER NOT NULL DEFAULT 0,
34 + "rating" INTEGER NOT NULL,
35 + "rationale" TEXT,
36 + "rawResponse" JSONB NOT NULL,
37 + "ratedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
38 +
39 + CONSTRAINT "TaskRating_pkey" PRIMARY KEY ("id")
40 +);
41 +
42 +-- CreateTable
43 +CREATE TABLE "ExpertOverride" (
44 + "id" TEXT NOT NULL,
45 + "taskId" TEXT NOT NULL,
46 + "dimension" TEXT NOT NULL,
47 + "ratingLow" INTEGER NOT NULL,
48 + "ratingMid" DOUBLE PRECISION NOT NULL,
49 + "ratingHigh" INTEGER NOT NULL,
50 + "reviewer" TEXT NOT NULL,
51 + "note" TEXT,
52 + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
53 +
54 + CONSTRAINT "ExpertOverride_pkey" PRIMARY KEY ("id")
55 +);
56 +
57 +-- CreateTable
58 +CREATE TABLE "ScoreRun" (
59 + "id" TEXT NOT NULL,
60 + "indexVersion" TEXT NOT NULL,
61 + "raterPromptVersion" TEXT NOT NULL,
62 + "raterModels" TEXT[],
63 + "notes" TEXT,
64 + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
65 +
66 + CONSTRAINT "ScoreRun_pkey" PRIMARY KEY ("id")
67 +);
68 +
69 +-- CreateTable
70 +CREATE TABLE "OccupationScore" (
71 + "id" TEXT NOT NULL,
72 + "runId" TEXT NOT NULL,
73 + "occupationCode" TEXT NOT NULL,
74 + "substitutionLow" DOUBLE PRECISION NOT NULL,
75 + "substitution" DOUBLE PRECISION NOT NULL,
76 + "substitutionHigh" DOUBLE PRECISION NOT NULL,
77 + "exposureLow" DOUBLE PRECISION NOT NULL,
78 + "exposure" DOUBLE PRECISION NOT NULL,
79 + "exposureHigh" DOUBLE PRECISION NOT NULL,
80 + "augmentationLow" DOUBLE PRECISION NOT NULL,
81 + "augmentation" DOUBLE PRECISION NOT NULL,
82 + "augmentationHigh" DOUBLE PRECISION NOT NULL,
83 + "highlyExposedTaskShare" DOUBLE PRECISION NOT NULL,
84 +
85 + CONSTRAINT "OccupationScore_pkey" PRIMARY KEY ("id")
86 +);
87 +
88 +-- CreateTable
89 +CREATE TABLE "TaskScore" (
90 + "id" TEXT NOT NULL,
91 + "runId" TEXT NOT NULL,
92 + "taskId" TEXT NOT NULL,
93 + "substitutionLow" DOUBLE PRECISION NOT NULL,
94 + "substitution" DOUBLE PRECISION NOT NULL,
95 + "substitutionHigh" DOUBLE PRECISION NOT NULL,
96 + "exposureLow" DOUBLE PRECISION NOT NULL,
97 + "exposure" DOUBLE PRECISION NOT NULL,
98 + "exposureHigh" DOUBLE PRECISION NOT NULL,
99 + "augmentationLow" DOUBLE PRECISION NOT NULL,
100 + "augmentation" DOUBLE PRECISION NOT NULL,
101 + "augmentationHigh" DOUBLE PRECISION NOT NULL,
102 +
103 + CONSTRAINT "TaskScore_pkey" PRIMARY KEY ("id")
104 +);
105 +
106 +-- CreateTable
107 +CREATE TABLE "ApiKey" (
108 + "id" TEXT NOT NULL,
109 + "hashedKey" TEXT NOT NULL,
110 + "name" TEXT NOT NULL,
111 + "rateLimitPerMin" INTEGER NOT NULL DEFAULT 600,
112 + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
113 +
114 + CONSTRAINT "ApiKey_pkey" PRIMARY KEY ("id")
115 +);
116 +
117 +-- CreateIndex
118 +CREATE INDEX "Task_occupationCode_idx" ON "Task"("occupationCode");
119 +
120 +-- CreateIndex
121 +CREATE INDEX "TaskRating_taskId_dimension_idx" ON "TaskRating"("taskId", "dimension");
122 +
123 +-- CreateIndex
124 +CREATE INDEX "TaskRating_promptVersion_idx" ON "TaskRating"("promptVersion");
125 +
126 +-- CreateIndex
127 +CREATE UNIQUE INDEX "TaskRating_taskId_dimension_model_promptVersion_sampleIndex_key" ON "TaskRating"("taskId", "dimension", "model", "promptVersion", "sampleIndex");
128 +
129 +-- CreateIndex
130 +CREATE UNIQUE INDEX "ExpertOverride_taskId_dimension_key" ON "ExpertOverride"("taskId", "dimension");
131 +
132 +-- CreateIndex
133 +CREATE INDEX "ScoreRun_indexVersion_idx" ON "ScoreRun"("indexVersion");
134 +
135 +-- CreateIndex
136 +CREATE INDEX "OccupationScore_occupationCode_idx" ON "OccupationScore"("occupationCode");
137 +
138 +-- CreateIndex
139 +CREATE UNIQUE INDEX "OccupationScore_runId_occupationCode_key" ON "OccupationScore"("runId", "occupationCode");
140 +
141 +-- CreateIndex
142 +CREATE INDEX "TaskScore_taskId_idx" ON "TaskScore"("taskId");
143 +
144 +-- CreateIndex
145 +CREATE UNIQUE INDEX "TaskScore_runId_taskId_key" ON "TaskScore"("runId", "taskId");
146 +
147 +-- CreateIndex
148 +CREATE UNIQUE INDEX "ApiKey_hashedKey_key" ON "ApiKey"("hashedKey");
149 +
150 +-- AddForeignKey
151 +ALTER TABLE "Task" ADD CONSTRAINT "Task_occupationCode_fkey" FOREIGN KEY ("occupationCode") REFERENCES "Occupation"("code") ON DELETE RESTRICT ON UPDATE CASCADE;
152 +
153 +-- AddForeignKey
154 +ALTER TABLE "TaskRating" ADD CONSTRAINT "TaskRating_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
155 +
156 +-- AddForeignKey
157 +ALTER TABLE "ExpertOverride" ADD CONSTRAINT "ExpertOverride_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
158 +
159 +-- AddForeignKey
160 +ALTER TABLE "OccupationScore" ADD CONSTRAINT "OccupationScore_runId_fkey" FOREIGN KEY ("runId") REFERENCES "ScoreRun"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
161 +
162 +-- AddForeignKey
163 +ALTER TABLE "OccupationScore" ADD CONSTRAINT "OccupationScore_occupationCode_fkey" FOREIGN KEY ("occupationCode") REFERENCES "Occupation"("code") ON DELETE RESTRICT ON UPDATE CASCADE;
164 +
165 +-- AddForeignKey
166 +ALTER TABLE "TaskScore" ADD CONSTRAINT "TaskScore_runId_fkey" FOREIGN KEY ("runId") REFERENCES "ScoreRun"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
167 +
168 +-- AddForeignKey
169 +ALTER TABLE "TaskScore" ADD CONSTRAINT "TaskScore_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
added packages/db/prisma/migrations/migration_lock.toml +3 −0
@@ -0,0 +1,3 @@
1 +# Please do not edit this file manually
2 +# It should be added in your version-control system (i.e. Git)
3 +provider = "postgresql"
\ No newline at end of file
4