// Task Runner baseline collections and indexes // Mirrors docs/modules/taskrunner/migrations/pack-run-collections.md (last updated 2025-11-06) function ensureCollection(name, validator) { const existing = db.getCollectionNames(); if (!existing.includes(name)) { db.createCollection(name, { validator, validationLevel: "moderate" }); } else if (validator) { db.runCommand({ collMod: name, validator, validationLevel: "moderate" }); } } const runValidator = { $jsonSchema: { bsonType: "object", required: ["planHash", "plan", "failurePolicy", "requestedAt", "createdAt", "updatedAt", "steps"], properties: { _id: { bsonType: "string" }, planHash: { bsonType: "string" }, plan: { bsonType: "object" }, failurePolicy: { bsonType: "object" }, requestedAt: { bsonType: "date" }, createdAt: { bsonType: "date" }, updatedAt: { bsonType: "date" }, steps: { bsonType: "array", items: { bsonType: "object", required: ["stepId", "status", "attempts"], properties: { stepId: { bsonType: "string" }, status: { bsonType: "string" }, attempts: { bsonType: "int" }, kind: { bsonType: "string" }, enabled: { bsonType: "bool" }, continueOnError: { bsonType: "bool" }, maxParallel: { bsonType: ["int", "null"] }, approvalId: { bsonType: ["string", "null"] }, gateMessage: { bsonType: ["string", "null"] }, lastTransitionAt: { bsonType: ["date", "null"] }, nextAttemptAt: { bsonType: ["date", "null"] }, statusReason: { bsonType: ["string", "null"] } } } }, tenantId: { bsonType: ["string", "null"] } } } }; const logValidator = { $jsonSchema: { bsonType: "object", required: ["runId", "sequence", "timestamp", "level", "eventType", "message"], properties: { runId: { bsonType: "string" }, sequence: { bsonType: "long" }, timestamp: { bsonType: "date" }, level: { bsonType: "string" }, eventType: { bsonType: "string" }, message: { bsonType: "string" }, stepId: { bsonType: ["string", "null"] }, metadata: { bsonType: ["object", "null"] } } } }; const artifactsValidator = { $jsonSchema: { bsonType: "object", required: ["runId", "name", "type", "status", "capturedAt"], properties: { runId: { bsonType: "string" }, name: { bsonType: "string" }, type: { bsonType: "string" }, status: { bsonType: "string" }, capturedAt: { bsonType: "date" }, sourcePath: { bsonType: ["string", "null"] }, storedPath: { bsonType: ["string", "null"] }, notes: { bsonType: ["string", "null"] }, expression: { bsonType: ["object", "null"] } } } }; const approvalsValidator = { $jsonSchema: { bsonType: "object", required: ["runId", "approvalId", "requestedAt", "status"], properties: { runId: { bsonType: "string" }, approvalId: { bsonType: "string" }, requiredGrants: { bsonType: "array", items: { bsonType: "string" } }, stepIds: { bsonType: "array", items: { bsonType: "string" } }, messages: { bsonType: "array", items: { bsonType: "string" } }, reasonTemplate: { bsonType: ["string", "null"] }, requestedAt: { bsonType: "date" }, status: { bsonType: "string" }, actorId: { bsonType: ["string", "null"] }, completedAt: { bsonType: ["date", "null"] }, summary: { bsonType: ["string", "null"] } } } }; ensureCollection("pack_runs", runValidator); ensureCollection("pack_run_logs", logValidator); ensureCollection("pack_artifacts", artifactsValidator); ensureCollection("pack_run_approvals", approvalsValidator); // Indexes for pack_runs db.pack_runs.createIndex({ updatedAt: -1 }, { name: "pack_runs_updatedAt_desc" }); db.pack_runs.createIndex({ tenantId: 1, updatedAt: -1 }, { name: "pack_runs_tenant_updatedAt_desc", sparse: true }); // Indexes for pack_run_logs db.pack_run_logs.createIndex({ runId: 1, sequence: 1 }, { unique: true, name: "pack_run_logs_run_sequence" }); db.pack_run_logs.createIndex({ runId: 1, timestamp: 1 }, { name: "pack_run_logs_run_timestamp" }); // Indexes for pack_artifacts db.pack_artifacts.createIndex({ runId: 1, name: 1 }, { unique: true, name: "pack_artifacts_run_name" }); db.pack_artifacts.createIndex({ runId: 1 }, { name: "pack_artifacts_run" }); // Indexes for pack_run_approvals db.pack_run_approvals.createIndex({ runId: 1, approvalId: 1 }, { unique: true, name: "pack_run_approvals_run_approval" }); db.pack_run_approvals.createIndex({ runId: 1, status: 1 }, { name: "pack_run_approvals_run_status" });