/** * Project-scope `cleo.db` — consolidated **tasks-core (batch 2)** domain slice. * * Part of the consolidated PROJECT-scope `cleo.db` target shape authored for * SG-DB-SUBSTRATE-V2 (saga T11242, epic T11245/E2, task T11360). Target-shape * authoring only — physical names carry the `tasks_` domain prefix. The live * runtime modules (`schema/background-jobs.ts`, `schema/experiments.ts`, * `schema/evidence-bindings.ts`, the `task_labels` junction in `schema/tasks.ts`) * keep their UNPREFIXED names until the exodus migration (T11248) swaps the * substrate. * * This batch covers four clean, self-contained tasks-core satellite tables: * - `tasks_background_jobs` ← `background_jobs` (§4 epoch + §7 idempotency) * - `tasks_experiments` ← `experiments` * - `tasks_evidence_ac_bindings` ← `evidence_ac_bindings` * - `tasks_task_labels` ← `task_labels` (AC4 junction, E4 pattern) * * ## E10 §4 — epoch → canonical TEXT ISO8601 * * `background_jobs.{started_at,completed_at,heartbeat_at}` were raw `integer(...)` * epoch columns. In the target shape they are canonical `text(...)` ISO8601. * * **§8.1 epoch-unit disambiguation (RESOLVED).** Reading the writer * (`packages/core/src/store/background-jobs.ts`) settles the unit: it writes * `Date.now()` — **milliseconds** — and reads back via * `new Date(row.startedAt).toISOString()`. So (unlike the conduit domain, which * is seconds) the exodus epoch→ISO8601 conversion for these three columns uses * the **ms divisor**: `strftime('%Y-%m-%dT%H:%M:%fZ', col/1000, 'unixepoch')`. * This resolves §8 item 1 for the background-jobs columns. * * ## E10 §5 — enum (already conformant, preserved) * * `background_jobs.status` → `{ enum: BACKGROUND_JOB_STATUSES }`; * `evidence_ac_bindings.binding_type` → `{ enum: EVIDENCE_BINDING_TYPES }`. * Both reference the named const arrays already exported from the live modules * (§5a — identifier, never literal). * * ## E10 §6 / AC4 — JSON + junction * * `experiments.metrics_delta_json` stays serialized TEXT per the JSON-Column * Audit. `tasks_task_labels` is the membership junction (E4 pattern, AC4) — * `(task_id, label)` composite PK + a label index — mirroring the shape already * on main (`task_labels`); no new JSON pattern is invented. `task_id` is a * cross-table FK into `tasks_tasks` resolved by the exodus prefixer; carried * here as a plain TEXT id since `tasks_tasks` is not in this batch. * * ## E10 §7 — idempotency key (Pattern A) * * `tasks_background_jobs` gains a nullable `idempotency_key TEXT` + UNIQUE * index. Per the canonical report §7 the key coalesces a re-submitted job on * `(job_type, payload_hash)`; the column holds that caller-computed stable key * and a redelivered claim is a no-op via `onConflictDoNothing` (UNIQUE ignores * NULLs, so legacy / un-keyed jobs are unaffected). * * @task T11360 * @epic T11245 * @saga T11242 * @see docs/migration/sqlite-schema-canonical.md §4 · §5 · §6 · §7 · §8.1 * @see docs/migration/sqlite-schema-columns.json (per-column affinity SSoT) */ /** * `tasks_background_jobs` — durable background job rows. * * Domain-prefixed target of the legacy `background_jobs` table. Jobs survive * process restart; a `running` row at startup is transitioned to `orphaned`. * * @task T11360 (target shape) · T641 (original) */ export declare const tasksBackgroundJobs: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "tasks_background_jobs"; schema: undefined; columns: { id: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; operation: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; status: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string enum"; data: "orphaned" | "pending" | "failed" | "cancelled" | "running" | "complete"; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: ["pending", "running", "complete", "failed", "cancelled", "orphaned"]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; startedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; completedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; result: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; error: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; progress: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "number int53"; data: number; driverParam: number; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; heartbeatAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; claimedBy: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; idempotencyKey: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_background_jobs"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** * `tasks_experiments` — experiment metadata side-table, keyed 1:1 to a task. * * Domain-prefixed target of the legacy `experiments` table. `task_id` is a * cross-table FK into `tasks_tasks` resolved by the exodus prefixer; carried * here as a plain TEXT id (PK). * * @task T11360 (target shape) · T944 (original) */ export declare const tasksExperiments: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "tasks_experiments"; schema: undefined; columns: { taskId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_experiments"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; sandboxBranch: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_experiments"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; baselineCommit: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_experiments"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; mergedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_experiments"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; receiptId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_experiments"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; metricsDeltaJson: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_experiments"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_experiments"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: true; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_experiments"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: true; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** * `tasks_evidence_ac_bindings` — M:N join between evidence atoms and ACs. * * Domain-prefixed target of the legacy `evidence_ac_bindings` table. `ac_id` * is a cross-table FK into `tasks_task_acceptance_criteria` resolved by the * exodus prefixer; carried here as a plain TEXT id. `evidence_atom_id` is NOT * an FK (atoms are derived, not stored normalised). * * @task T11360 (target shape) · T10503 (original) */ export declare const tasksEvidenceAcBindings: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "tasks_evidence_ac_bindings"; schema: undefined; columns: { id: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_evidence_ac_bindings"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; evidenceAtomId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_evidence_ac_bindings"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; acId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_evidence_ac_bindings"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; bindingType: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_evidence_ac_bindings"; dataType: "string enum"; data: "direct" | "satisfies" | "coverage"; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: ["direct", "satisfies", "coverage"]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_evidence_ac_bindings"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** * `tasks_task_labels` — membership junction for task labels (AC4 · E4 pattern). * * Domain-prefixed target of the legacy `task_labels` junction (T11356). The * membership-query SSoT that replaces the fragile `labels_json LIKE '%label%'` * filters (§6c). `(task_id, label)` is the natural composite identity — a label * appears at most once per task. `task_id` is a cross-table FK into * `tasks_tasks` resolved by the exodus prefixer; carried here as a plain TEXT * id (the live junction's `ON DELETE CASCADE` is re-applied at exodus once * `tasks_tasks` is present in the same file). * * @task T11360 (target shape) · T11356 (original) */ export declare const tasksTaskLabels: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "tasks_task_labels"; schema: undefined; columns: { taskId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_task_labels"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; label: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "tasks_task_labels"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** Row type for `tasks_background_jobs` SELECT queries (target shape). */ export type TasksBackgroundJobRow = typeof tasksBackgroundJobs.$inferSelect; /** Row type for `tasks_background_jobs` INSERT operations (target shape). */ export type NewTasksBackgroundJobRow = typeof tasksBackgroundJobs.$inferInsert; /** Row type for `tasks_experiments` SELECT queries (target shape). */ export type TasksExperimentRow = typeof tasksExperiments.$inferSelect; /** Row type for `tasks_experiments` INSERT operations (target shape). */ export type NewTasksExperimentRow = typeof tasksExperiments.$inferInsert; /** Row type for `tasks_evidence_ac_bindings` SELECT queries (target shape). */ export type TasksEvidenceAcBindingRow = typeof tasksEvidenceAcBindings.$inferSelect; /** Row type for `tasks_evidence_ac_bindings` INSERT operations (target shape). */ export type NewTasksEvidenceAcBindingRow = typeof tasksEvidenceAcBindings.$inferInsert; /** Row type for `tasks_task_labels` SELECT queries (target shape). */ export type TasksTaskLabelRow = typeof tasksTaskLabels.$inferSelect; /** Row type for `tasks_task_labels` INSERT operations (target shape). */ export type NewTasksTaskLabelRow = typeof tasksTaskLabels.$inferInsert; //# sourceMappingURL=tasks-core-batch2.d.ts.map