Native DSL grammar for project scheduling. File extension: .proj
Every project file must have exactly one project declaration.
project "Project Name" { start: 2026-01-15 end: 2026-12-31 # optional currency: EUR # optional, default: USD calendar: standard # optional, reference to calendar status_date: 2026-03-01 # optional, for progress tracking }
| Attribute | Required | Description |
|---|---|---|
start | Yes | Project start date (YYYY-MM-DD) |
end | No | Project end date constraint |
currency | No | Currency code for cost calculations |
calendar | No | Reference to default working calendar |
status_date | No | As-of date for progress reporting |
Define working days, hours, and holidays.
calendar "standard" { working_days: mon-fri working_hours: 09:00-18:00 holiday "Christmas" 2026-12-25 holiday "New Year" 2026-12-31..2027-01-01 }
| Attribute | Description |
|---|---|
working_days | Days of the week: mon-fri, mon-sat, etc. |
working_hours | Daily working hours: HH:MM-HH:MM |
holiday | Single date or date range |
Define team members with rates and capacity.
resource dev "Senior Developer" { rate: 500/day capacity: 0.8 # 80% availability efficiency: 1.2 # productivity factor email: "dev@company.com" role: "Backend Developer" leave: 2026-08-01..2026-08-15 }
| Attribute | Required | Description |
|---|---|---|
rate | No | Cost per day or hour: 500/day, 60/hour |
capacity | No | Availability factor (0.0-1.0), default: 1.0 |
efficiency | No | Productivity multiplier, default: 1.0 |
email | No | Contact email |
role | No | Job title or role description |
leave | No | Vacation/leave date range |
calendar | No | Custom working calendar |
Tasks can be nested to create a Work Breakdown Structure (WBS).
task impl "Implementation Phase" { duration: 10d # fixed calendar duration effort: 40d # person-days of work assign: dev, qa # resource assignments depends: design # dependencies priority: 800 # higher = scheduled first complete: 50% # progress tracking remaining: 3d # explicit remaining work regime: work # temporal regime (work/event/deadline) summary: "Impl" # short display name note: "Detailed notes" tag: backend, critical cost: 5000 # fixed cost payment: 25000 # milestone payment # Nested child task task api "API Development" { effort: 20d assign: dev } }
Duration = Effort / Total_Resource_Units
assign: dev # 100% allocation assign: dev@50% # 50% allocation assign: dev, qa@75% # multiple resources assign: developer * 2 # 2 instances of profile
Four dependency types with optional lag/lead time.
depends: task_a # Finish-to-Start (default) depends: task_a SS # Start-to-Start depends: task_a FF # Finish-to-Finish depends: task_a SF # Start-to-Finish depends: task_a +5d # FS with 5-day lag depends: task_a SS +2d # SS with 2-day lag depends: task_a -1d # FS with 1-day lead depends: task_a, task_b # multiple dependencies depends: parent.child # hierarchical reference
| Type | Syntax | Meaning |
|---|---|---|
| Finish-to-Start | FS (default) | B starts when A finishes |
| Start-to-Start | SS | B starts when A starts |
| Finish-to-Finish | FF | B finishes when A finishes |
| Start-to-Finish | SF | B finishes when A starts |
Zero-duration markers for key dates.
milestone go_live "Go-Live Date" { depends: testing, documentation regime: event # can be scheduled on any day start_no_earlier_than: 2026-06-01 # date constraint payment: 50000 note: "Production deployment" }
Alternatively, set milestone: true on any task.
| Attribute | Description |
|---|---|
depends | Dependencies on tasks or milestones |
regime | Temporal regime: work, event, or deadline |
start_no_earlier_than | Earliest date the milestone can occur |
finish_no_later_than | Latest date the milestone can occur |
payment | Payment amount triggered by milestone |
note | Description or notes |
Constrain when tasks can be scheduled.
task deploy "Deployment" { effort: 2d start_no_earlier_than: 2026-03-01 finish_no_later_than: 2026-03-15 }
| Constraint | Meaning |
|---|---|
must_start_on | Task must start on exact date |
must_finish_on | Task must finish on exact date |
start_no_earlier_than | Task cannot start before date |
start_no_later_than | Task must start by date |
finish_no_earlier_than | Task cannot finish before date |
finish_no_later_than | Task must finish by date |
Control how tasks interact with calendars (RFC-0012).
# Effort-bearing task: respects working days task develop "Development" { regime: work effort: 10d assign: dev } # Event: can occur on any calendar day (including weekends) milestone release "Product Release" { regime: event depends: develop start_no_earlier_than: 2026-06-15 } # Deadline: contractual/regulatory date milestone compliance "Compliance Deadline" { regime: deadline finish_no_later_than: 2026-06-30 }
| Regime | Calendar Behavior | Use Case |
|---|---|---|
work | Respects working days | Effort-bearing tasks (default) |
event | Any calendar day | Releases, launches, go-lives |
deadline | Exact date required | Contractual, regulatory dates |
regime: work unless specified.5d # 5 days 2w # 2 weeks (10 working days) 8h # 8 hours (1 day) 1m # 1 month (~20 working days)
2026-01-15 # ISO 8601 format (YYYY-MM-DD)
2026-01-01..2026-01-15 # inclusive range