📥Installation

ScheduleGate is distributed as a single binary — no runtime dependencies required.

1

macOS

Download schedulegate from your purchase email. Move it to a directory on your PATH:

$ mv schedulegate /usr/local/bin/
2

Windows

Download schedulegate.exe. Place it in a directory on your PATH, or run directly:

> schedulegate.exe --version
3

Linux

Download schedulegate-linux. Make executable and move to PATH:

$ chmod +x schedulegate-linux
$ mv schedulegate-linux /usr/local/bin/schedulegate
4

Verify

Confirm the installation:

$ schedulegate --version

⚡Quick Start

Run a full DCMA 14-point assessment on your schedule export:

$ schedulegate assess my_schedule.xlsx

Generate an HTML report, CSV database, and Excel exceptions workbook:

$ schedulegate assess my_schedule.xlsx \
  --html report.html \
  --csv history.csv \
  --exceptions-report exceptions.xlsx \
  --customer "Acme Corp" --project "P-1042" \
  --status-date 05/19/2026 --verbose
Supported file formats: Excel (.xlsx) and CSV. Column headers are matched case-insensitively with fuzzy alias resolution, so most Microsoft Project default layouts work without pre-processing.

🏆Product Tiers

ScheduleGate uses a license key system to gate features. All tiers unlock the same core engine — the difference is which output formats and commands are available.

Feature Community (Free) Pro ($99/yr) Team ($299/yr) Enterprise ($999/yr) Lifetime ($199)
assess — terminal output ✓ 1/month ✓ Unlimited ✓ Unlimited ✓ Unlimited ✓ Unlimited
--html / --csv / --exceptions-report ✗ ✓ ✓ ✓ ✓
--json / --json-output ✗ ✓ ✓ ✓ ✓
compare — version comparison ✗ ✓ ✓ ✓ ✓
check-patterns — YAML rules ✗ ✓ ✓ ✓ ✓
validate — column check ✓ ✓ ✓ ✓ ✓
License expiry N/A 1 year + 7-day grace 1 year + 7-day grace 1 year + 7-day grace Never expires
Community tier details: Free users get exactly 1 assessment per calendar month with terminal output only. No HTML, CSV, Excel, or JSON exports. The compare and check-patterns commands are fully blocked. The validate command is always free.
Pro, Team, Enterprise, Lifetime: All non-Community tiers unlock the same feature set — the differences are commercial (pricing, seat count, CI/CD support). Upgrade at any time with schedulegate license set <key>.

🔑License Management

Your license key is validated, stored in ~/.schedulegate.yaml, and automatically used on every run. You can also pass a key for a single run with the global --license-key flag.

Global flags: --config <file> overrides the config file location (default ~/.schedulegate.yaml); --license-key <key> provides a key for a single run.

Commands

license info
Display your current tier, subject (email), expiry date, and masked key.
license set <key>
Validate and persist a license key. The key format is SG-.... Stored to config automatically.
license clear
Remove your stored key and revert to Community tier.
$ schedulegate license info
$ schedulegate license set SG-abc123...
$ schedulegate license clear
Expiry: Pro, Team, and Enterprise keys expire after 1 year with a 7-day grace period. Lifetime keys never expire. If your key expires, features revert to Community tier until you renew.

📊assess — DCMA 14-Point Assessment

Reads a schedule file (Excel or CSV) and computes up to 14 health metrics defined by the DCMA Program Assessment and Reporting Manual (PAM). Each metric produces a pass/fail verdict, a percentage value, and — where applicable — a per-task exceptions list.

Pro Terminal output is available on all tiers (1/month on Community). HTML, CSV, Excel, and JSON outputs require Pro or above.

$ schedulegate assess <file> [flags]

Flags

file
Path to the schedule file. Accepts .xlsx or .csv. Positional argument — must be the first argument after assess. Required.
Required
-m, --metrics
Comma-separated metric IDs to run (integers 1–14). When omitted, all 14 metrics run. Example: --metrics 1,5,12 — Logic, Hard Constraints, Critical Path Test.
Optional
--status-date
Override the status (data) date for date-dependent metrics. Defaults to today. Formats: YYYY-MM-DD · MM/DD/YYYY · MM/DD/YY
Optional
--customer
Customer name embedded in HTML/CSV reports. Does not affect calculations. Example: --customer "Lockheed Martin"
Optional
--project
Project number or identifier for reports. Example: --project "N00019-24-C-1234"
Optional
--html
File path for the HTML assessment report. Auto-opens in browser. Example: --html ./reports/assessment.html
Output
--csv
File path for CSV database. Rows are appended (not overwritten) — suitable for tracking assessments over time. Optimised for Power BI. Example: --csv ./db/history.csv
Output
--exceptions-report
File path for Excel workbook listing every task that triggered a metric violation, with corrective action guidance. One sheet per metric. Example: --exceptions-report exceptions.xlsx
Output
--json
Output machine-readable JSON to stdout (suppresses terminal UI). Useful for CI/CD pipelines and scripting.
Output
--json-output
Write JSON results to a file instead of stdout. Example: --json-output report.json
Output
--pct-format
Override the percent complete scale. MS Project exports 0–100; Primavera uses 0.0–1.0. Values: "0-100" (default) · "fraction" (auto-multiplies by 100)
Optional
--date-locale
Controls which date format is tried first for ambiguous dates. Values: "US" (MM/DD first, default) · "EU" (DD/MM first)
Optional
--debug-logic
Prints per-task successor resolution trace during Metric 1 (Logic). Useful for auditing Metric 1 results or troubleshooting.
Optional
-v, --verbose
Appends raw numerator/denominator counts to each metric row. Example: Logic 3.2% [7 / 219]
Optional

📈compare — Schedule Version Comparison

Takes two schedule files — a Previous version and a Current version — and benchmarks them using a three-pillar scoring engine to quantify schedule stability, reliability, and scope churn.

Pro Requires a Pro license key or above.

$ schedulegate compare <previous> <current> [flags]

Flags

previous, current
Positional arguments: the baseline (older) schedule and the current schedule. Accepts .xlsx or .csv. Both required.
Required
--html
File path for the HTML comparison report. Auto-opens in browser.
Output
--detailed
Include row-by-row task-level change detail in the HTML report.
Optional
--csv
Append one summary row per comparison run to a CSV file.
Output
--json / --json-output
Machine-readable JSON output to stdout or file.
Output
--customer / --project
Metadata for report headers. Does not affect scoring.
Optional
--pct-format / --date-locale / --status-date
Same semantics as the assess command.
Optional

Scoring Pillars

The overall score (0–100) is a weighted composite of three pillars:

40
Pillar A: Stability
Measures date slippage. Tasks with Finish Variance > 2 days are penalized. Milestones count double. If 40% of tasks slip, you lose all 40 points.
30
Pillar B: Reliability
Measures duration bloat. Tasks growing > 10% in duration are penalized. A harsh 1.5× multiplier: 20% bloat = 0 points.
30
Pillar C: Scope Churn
Measures scope volatility (tasks added + deleted). 15% churn = 0 points. High churn signals poor planning or changing requirements.

Friction Index (Ghost Tasks)

A Ghost Task is a task whose planned start date is in the past (before the status date) but is still at 0% complete. These are tasks that should have started but haven't — they represent immediate execution bottlenecks.

The tool aggregates Ghost Tasks by their top-level WBS to show which phase of the project is stuck.

Detailed Task Analysis (--detailed)

When using --detailed with --html, the report includes a row-by-row breakdown of every significantly changed task:

SymbolMeaningImpact
⊕New TaskScope Churn — task added in current version
×DeletedScope Churn — task removed
⊠DelayedStability — finish slipped > 2 days
←Pulled InStability — finishing earlier than planned
🐢BloatedReliability — duration grew > 10%
👻Ghost TaskReliability — start in past, 0% complete
📝ModifiedNeutral — minor name/date changes
□UnchangedNeutral — no significant changes

✅validate — Column Schema Validation

Checks whether a schedule file contains the columns expected by the DCMA assessment engine. Reads only the header row — does not parse task data. Use this as a pre-flight check before running assess.

Free Always available — no license key required.

$ schedulegate validate <file> [flags]

Flags

file
Schedule file to validate (.xlsx or .csv). Positional, required.
Required
--html / --csv / --json / --json-output
Output formats — same semantics as assess.
Output

Output Statuses

StatusMeaning
READY All 7 required columns found. Schedule is ready for assessment.
INCOMPLETE One or more required columns missing. Check the column list below.

Required Columns

Canonical NameExample MS Project Header
task_idTask ID, ID
nameName, Task Name
durationDuration
startStart
finishFinish
predecessorsPredecessors, Predecessor
percent_complete% Complete, Percent Complete
Missing Summary/Rollup column: If neither a Summary nor Rollup column is present, the tool silently degrades all 14 DCMA metrics because it cannot distinguish summary rows from work tasks.

📜check-patterns — YAML Pattern Compliance

Validates that a schedule contains tasks matching user-defined patterns, expressed as glob rules in a YAML file. Useful for verifying schedule templates, checking discipline coverage, or enforcing naming conventions.

Pro Requires a Pro license key or above.

$ schedulegate check-patterns <schedule-file> --rules <rules.yaml> [flags]

Flags

schedule file
Schedule file to check (.xlsx or .csv). Positional, required.
Required
--rules
Path to YAML rules file. Required.
Required
--detailed
Show matching task names (TaskID + Name) per rule, capped at 100.
Optional
--html / --csv / --json / --json-output
Output formats — same semantics as assess.
Output
--pct-format / --date-locale
Same semantics as assess.
Optional

YAML Rules Format

Each rule specifies a set of glob patterns to match against task fields, plus count constraints:

rules: - name: "Mechanical Order Entry Tasks" match: name: "*Order Entry*" discipline: "05 - Mechanical Engineering" min_count: 1 - name: "Long duration tasks" match: name: "*" constraints: min_duration: 30 min_count: 1 max_count: 50

Key rules:

  • All matching is case-insensitive — both pattern and field value are lowercased.
  • Glob syntax — uses *, ?, [...] (Go path.Match).
  • AND logic across fields — a task must match ALL fields in the match map.
  • Summary and milestones excluded — only work (leaf) tasks are evaluated.
  • Duration constraints subtract from the effective count: matching tasks that fail duration constraints are still listed with --detailed but excluded from the pass/fail count.

Supported Match Fields

YAML KeyAliasesTask Field
nametask_nameTask Name
wbswbs_codeWBS
idtask_idTask ID
resourcesresource_namesResources
predecessors—Predecessors
constraint_type—Constraint Type
disciplinetask_disciplineDiscipline
mechanical_segment_nbrmech_segment, mechanical_segmentMechanical Segment Nbr
control_segment_nbrcontrol_segment, controls_segmentControl Segment Nbr

Output Statuses

StatusMeaning
COMPLIANT All rules passed. Schedule meets expected patterns.
NON-COMPLIANT One or more rules failed. Check which patterns are missing or over-represented.

📤Output Formats

🖥
Terminal
Always produced. Shows the ASCII logo, score card, and colour-coded pass/fail rows. Add --verbose for raw counts.
🌐
HTML Report
Dark-theme interactive report with score gauge, metric results, and expandable exceptions. Auto-opens in browser.
Flags: --html
📊
CSV Database
One row per run appended to a flat file. Designed for Power BI trend analysis.
Flags: --csv
📁
Excel Exceptions
Multi-sheet workbook: Summary, Universe, Critical Path, and per-metric detail sheets with corrective guidance.
Flag: --exceptions-report (assess only)
📄
JSON (stdout)
Machine-readable JSON for CI/CD pipelines. Suppresses terminal UI.
Flag: --json
💾
JSON (file)
Same as stdout JSON but written to a file.
Flag: --json-output
Tier requirement: Terminal output is always available (1/month on Community). All other output formats require a Pro license key or above.

🔍Audit Reference

Purpose: This section documents every convention the tool uses so that auditors can reproduce any result independently from raw schedule data.
Overall Score Formula

The overall score shown at the top of the report is:

Overall Score = metrics that PASS ÷ metrics that ran (excluding N/A)

A metric is excluded from the denominator only when it returns N/A (currently only Metric 10 — Resources, when no resource column is present). Binary metrics (Metric 12) count as 1 pass or 1 fail, never fractional.

"Work Task" — Population Definition

Most metrics operate on the work task population, defined as tasks where all of the following hold:

  • IsSummary = false — roll-up summary rows are excluded
  • IsMilestone = false — zero-duration milestones are excluded

Metrics that additionally restrict to incomplete tasks further require PercentComplete < 100. Metric 5 (Hard Constraints) includes milestones but excludes summaries. Metric 13 (CPLI) includes milestones in its completion task scan.

Summary rows: always excluded Milestones: excluded from most metrics Milestones: included in Metric 5 only Milestones: included in CPLI completion search (Metric 13)
Predecessor String Parsing (Metrics 1–4)

The Predecessors column is a delimited string of relationship tokens. Split on commas and semicolons, then parsed with the grammar:

token = <TaskID> [ <RelType> ] [ sign <magnitude> <unit> ]
RelType = FS | SS | FF | SF (default: FS if omitted)
sign = + (positive lag) | - (negative lag / lead)
unit = d (days) | w (weeks)
TokenInterpretationAffects
5Task 5, FS, no lag — compliantMetric 1, 4
5FSTask 5, Finish-to-Start — compliantMetric 1, 4
5SSTask 5, Start-to-Start — non-FS violationMetric 4
5FS+3dTask 5, FS, +3 day lag violationMetric 3
5FS-3dTask 5, FS, –3 day lead violationMetric 2
Schedule Field Units & Data Types
FieldUnit / TypeMetric(s)
TotalSlackDecimal working days (float)6, 7, 12, 13
BaselineDurationDecimal working days (float)8
PercentComplete0–100 (numeric)1–11, 14
Start / FinishForecast dates9, 13
ActualStart / ActualFinishActual dates (nil = not set)9
BaselineFinishDate (nil = no baseline)11, 14
ConstraintTypeString (case-insensitive)5

📐DCMA 14-Point Metrics

Transparency note: Every metric below documents exactly what population is selected, which field drives the calculation, the formula used, and the DCMA PAM reference. Share this section with PMs so they understand precisely why a task was flagged.
1
Logic PAM § 4.1 — Network Logic
≤ 5% ▾

Measures whether every incomplete work task is wired into the network — i.e., has at least one incoming (predecessor) and one outgoing (successor) logic link.

What it measures

The percentage of incomplete non-summary, non-milestone tasks missing a predecessor, a successor, or both.

Population

All tasks where IsSummary = false, IsMilestone = false, and PercentComplete < 100.

Formula
tasks missing pred or succ ÷ total incomplete tasks

Successor presence is inferred: a task has a successor if its Task ID appears in any other task's Predecessors field.

Threshold & direction

Pass when result ≤ 5%. Lower is better.

2
Leads PAM § 4.2 — Leads (Negative Lag)
0% ▾

Negative lag (a "lead") allows a successor to start before its predecessor finishes. DCMA treats this as artificial schedule compression; the PAM goal is zero.

What it measures

The percentage of predecessor relationships on incomplete tasks carrying a negative lag value.

Population

Individual predecessor links on incomplete work tasks. Denominator is relationships, not tasks.

Formula
links with negative lag ÷ total predecessor links
Threshold & direction

Pass when result equals 0% (zero tolerance).

3
Lags PAM § 4.3 — Lags (Positive Lag)
≤ 10% ▾

Positive lags introduce waiting time between predecessor and successor without an explicit task. DCMA requires delays to be modelled as real tasks so they can be tracked and resourced.

What it measures

The percentage of predecessor links on incomplete tasks carrying a positive lag value.

Population

Same as Leads: individual predecessor links on incomplete work tasks.

Formula
links with positive lag ÷ total predecessor links
Threshold & direction

Pass when result ≤ 10%. Insert an intermediate task to model the delay.

4
Relationship Types PAM § 4.4 — FS Relationships
≥ 90% ▾

Finish-to-Start (FS) is the only relationship type that models true sequential work. SS, FF, and SF often mask schedule compression or insufficient decomposition.

What it measures

Proportion of all predecessor links on incomplete work tasks using Finish-to-Start.

Population

All predecessor links on incomplete work tasks. Bare tokens default to FS.

Formula
FS links ÷ total links
Threshold & direction

Pass when result ≥ 90%. Higher is better; 100% is ideal.

5
Hard Constraints PAM § 4.5 — Constraints
≤ 5% ▾

Hard constraints lock a task to a specific date, overriding network-driven scheduling. They inflate float and prevent the critical path from being computed correctly.

What it measures

Percentage of incomplete tasks (including milestones) carrying a hard constraint.

Hard constraint types
Must Finish On (MFO) Must Start On (MSO) Start No Later Than (SNLT) Finish No Later Than (FNLT)
Formula
tasks with hard constraint ÷ total incomplete tasks
Threshold & direction

Pass when result ≤ 5%. Replace with ASAP or SNET where possible.

6
High Float PAM § 4.6 — High Float
≤ 5% ▾

Excessive total float indicates a task is poorly connected to the network — usually caused by missing successor links, hard constraints, or an unrealistically late project finish.

What it measures

Percentage of incomplete work tasks with TotalSlack > 44 working days.

Threshold value

44 working days (~2 calendar months).

Formula
tasks with TotalSlack > 44 ÷ total incomplete work tasks
Threshold & direction

Pass when result ≤ 5%. Lower is better.

7
Negative Float PAM § 4.7 — Negative Float
≤ 5% ▾

Negative float means a task is already late relative to its constraint or project finish date.

What it measures

Percentage of incomplete work tasks with TotalSlack < 0.

Root causes
  • Hard constraint overriding logic
  • Duration longer than available time window
  • Predecessor chain longer than expected finish
Formula
tasks with TotalSlack < 0 ÷ total incomplete work tasks
Threshold & direction

Pass when result ≤ 5%. Zero is ideal.

8
High Duration PAM § 4.8 — Duration
≤ 10% ▾

Long work packages are harder to track, resource, and recover. DCMA requires work packages ≤ 60 working days (3 months).

What it measures

Percentage of incomplete work tasks with BaselineDuration > 60 working days.

Field used

BaselineDuration (working days). Uses baseline, not current duration.

Formula
tasks with BaselineDuration > 60 ÷ total incomplete work tasks
Threshold & direction

Pass when result ≤ 10%. Break violating tasks into sub-tasks.

9
Invalid Dates PAM § 4.9 — Invalid Dates
0% ▾

Dates inconsistent with the status date indicate a stale schedule or incorrect actuals.

Conditions checked
Forecast Start before status date Forecast Finish before status date Actual Start after status date Actual Finish after status date
Population

Incomplete work tasks only. Status date defaults to today unless --status-date is set.

Formula
tasks with any invalid date ÷ total incomplete work tasks
Threshold & direction

Pass when result equals 0% (zero tolerance).

Tip: Set --status-date to the schedule's actual data date to avoid false positives on this metric.
10
Resources PAM § 4.10 — Resource Loading
≥ 95% ▾

Resource-loading is required for earned value analysis. Unresourced tasks cannot yield reliable BCWS/BCWP values.

What it measures

Percentage of incomplete work tasks with at least one resource assigned.

N/A handling

If no task has a resource, the metric is N/A and excluded from the tally.

Formula
tasks with ≥ 1 resource ÷ total incomplete work tasks
Threshold & direction

Pass when result ≥ 95%. Higher is better.

11
Missed Tasks PAM § 4.11 — Schedule Adherence
≤ 5% ▾

A task is "missed" when its baseline finish date has passed but it is not yet 100% complete.

What it measures

Percentage of work tasks with BaselineFinish ≤ StatusDate that are still incomplete.

Population

Only tasks due by the status date are in the denominator.

Formula
past-due incomplete tasks ÷ all tasks due by status date
Threshold & direction

Pass when result ≤ 5%. Update actuals or re-baseline.

12
Critical Path Test PAM § 4.12 — Critical Path Validity
Pass / Fail ▾

A valid critical path must exist: at least one work task with zero or negative total float, confirming the scheduler drives the finish date through network logic.

What it measures

Binary: does any work task have TotalSlack ≤ 0? Yes = Pass.

Why summaries/milestones excluded

Their float values are roll-ups or trivially zero by constraint, producing false positives.

Formula
COUNT(work tasks where TotalSlack ≤ 0) > 0
Threshold & direction

Pass when at least one critical work task exists.

13
Critical Path Length Index (CPLI) PAM § 3.1.2.3 — Schedule Efficiency
≥ 1.0 ▾

CPLI quantifies schedule efficiency relative to the critical path. Below 1.0 signals the project cannot finish on time under current conditions. Above 1.0 indicates margin.

What it measures

Ratio of "available time plus total float" to remaining critical path duration.

Completion task selection

Scans all non-summary tasks (milestones included) and picks the one with the latest Finish.

Step-by-step calculation
Step 1 — completionTask = task with max(Finish) where IsSummary = false
Step 2 — calDays = (completionTask.Finish − StatusDate) in whole days
Step 3 — CPL = calDays × (5 ÷ 7)
Step 4 — TF = completionTask.TotalSlack
Step 5 — CPLI = (CPL + TF) ÷ CPL

If CPL ≤ 0, CPLI returns 1.0 / Pass automatically.

Interpretation: CPLI = 1.0 means exactly on time. CPLI = 0.95 means the schedule needs to be executed 5% faster than planned.
14
Baseline Execution Index (BEI) DCMA BEI — Schedule Execution
≥ 95% ▾

BEI measures how many tasks were actually completed relative to how many were planned to be complete by the status date.

What it measures

Ratio of completed work tasks to all work tasks whose baseline finish was on or before the status date.

Population

Work tasks only. Tasks with null BaselineFinish are excluded from the denominator but counted in numerator if complete.

Exact formula
Numerator = COUNT(work tasks where PercentComplete = 100)
Denominator = COUNT(work tasks where BaselineFinish ≤ StatusDate
                AND BaselineFinish != null)
BEI = Numerator ÷ Denominator
Edge case: If Denominator = 0 (no baseline data), BEI returns 1.0 / Pass with zero exceptions.
Why BEI can exceed 1.0: The numerator counts all completed tasks (including early completions), while the denominator counts only tasks due by the status date.

schedulegate v1.0.6  ·  DCMA PAM Rev. B metrics  ·  Updated August 2026