Skip to content

Bidding & Schedule

The planning chain: a published script becomes a bid (days per entity per task), and a published bid becomes a schedule (a seat-aware Gantt). Both live under the Planning workspace (bid → estimate → schedule → tracker).

Two tools, not one

The bidding engine (script → days) is app/tools/bidding/. The sidebar Estimate calculator (app/tools/bid/) is a separate, simpler pricing tool.

The bidding engine

GET /c/{company}/project/{project}/bidding (app/tools/bidding/bidding.py).

Core math: for each entity, days = Σ key[kind][complexity][task] over the tasks its assigned template enables. Three data layers:

Layer What it holds Where
Keys Days per task per complexity (A/B/C) per kind (character / asset / set / scene / shot) {cookbook_dir}/config_files/bidding_standards.json
Templates Named task checklists per kind (e.g. Character – Cloth) same standards file
Bid document Per-project resolve data: names, complexity + template assignments, omits, manual rows versioned asset in the prd/docs/bid task MSD

Rows auto-populate from the published script's registries (characters, environments, props, scenes). Per row you set: production name, complexity A/B/C, template, optional hand-typed day overrides, omit. Bulk edits fan one field across selected rows; everything autosaves.

Standards are edited in-app on the Standards tab — keys, templates, and columns (columns must map to real Production Tasks in CFG.task_registry).

Publish (POST /bidding/publish) writes a self-contained bid.json into a fresh minor of prd/docs/bid and runs the publish recipe, which renders bid.xlsx (alc/services/bid.py).

The schedule

GET /c/{company}/project/{project}/schedule (alc/services/schedule.py + app/tools/schedule/).

compute_schedule() reads the latest published bid and produces the Gantt:

  • Work items — one per (entity, task), sized by bid days.
  • Dependencies — a DAG from the Production Tasks graph (task.upstream / downstream), resolved within each entity.
  • Swimlanes — one lane per department/task, ordered by phase group then dependency depth.
  • Seats — per-department head counts (default 5, per-project overrides); a deterministic greedy scheduler assigns each item to the seat that frees first. Each seat is one person's row.
  • Plus weekend bands, month/week ticks, milestones, the client deadline line with overrun band, and a cost readout (day_rate).

Settings (start date, target end, head counts, zoom, day rate) live at config_files/schedule/{project_id}/settings.json; dated deliveries (scene + asset bundles) at deliveries.json.