Run the per-student application pipeline. Generates a disposable runtime workspace from DB, tailors CVs per JD, invokes fill-forms.mjs in headed mode, pauses at every submit for Miura's click, then ingests tracker rows + drafts back into the DB. Idempotent on (student, company, role, job_url).
Trigger: /cruzar run-cohort --student <id> --job-url <url>.
Architecture: Flow D -- Run cohort ADRs: ADR-01 work-on-laptop, ADR-03 absorb-scope, ADR-08 fill-forms
profiles.readiness_verdict = "ready" for the target student..env populated with all variables from ..env.example--student <id> -- student ID (required).--job-url <url> -- target JD URL for this invocation (required in MVP 0).--debug -- retain the runtime dir after run (optional, default false).bun run apps/web/scripts/operator/run-cohort.ts --student <id> --job-url <url>
profiles.readiness_verdict = "ready".
b. Generates .cruzar-runtime/<student_id>/ with profile.md, profile.yml, data/applications.md.
c. Invokes apps/career-ops/bin/fill-forms.mjs as a subprocess with the job URL and workspace context.
d. Parses fill-forms output (company, role, platform, screenshots, missed fields).
e. Inserts applications row (idempotent on unique key).
f. Calls tailorCvForJd() to generate per-JD CV markdown, render PDF, upload to R2, persist generated_cvs.
g. Inserts status_events row (kind=applied).
h. Inserts fill_form_drafts row (state=submitted).
i. Cleans up runtime dir (unless --debug).applications row with status applied committed for the run.generated_cvs.--job-url produces zero new applications (idempotency via unique key on applications table).0 -- success. JSON stdout: { success: true, student_id, application_count }.1 -- error. JSON stdout: { success: false, error, message }.2 -- invalid flags. JSON stdout: { success: false, error: "args", issues }.llmJsonCompletion), then error exit.application_count: 0, skipped: true.