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.