Skip to content

Releases: rnwolf/ccpm-scheduler

v0.12.0

Choose a tag to compare

@rnwolf rnwolf released this 28 Jul 20:45

Phase 7: guaranteed single termination point + milestone tasks

  • A duration-0 task with no resources is now a valid milestone task (the
    same convention the engine's own synthesized FINISH node has always
    used) - E_NO_RESOURCE is exempted, E_BAD_DURATION allows 0.
  • A non-critical chain that reaches project completion with zero slack
    (no room for a feeding buffer) now connects directly to the synthesized
    FINISH milestone instead of being silently left disconnected.
  • check_schedule gained a new connectivity check (E_DISCONNECTED_TASK)
    as a defense-in-depth safety net.
  • Docs: new "Guaranteed Single Termination Point" section in
    network-layout.md, milestone-task guidance in formats.md, and several
    stale doc fixes (validation code table, legacy CSV column names).

See PLAN.md's Phase 7 section for full implementation details.

v0.11.0 — per-task resource quantity / pooled resources

Choose a tag to compare

@rnwolf rnwolf released this 28 Jul 18:24

Per-task resource quantity / pooled resources (Phase 5)

A task may now request a specific number of units of a pooled resource,
not just "uses this resource": resources: {"crew": 3} (JSON) or
resource_ids token crew:3 (CSV) means the task consumes 3 of that
resource's daily capacity. A whole number > 1 is a pool draw (e.g. 3 of a
4-capacity crew); a fraction < 1 is a time-share (e.g. 0.5 of one person) -
the same mechanism at either end of one continuum, not two features.
Default remains 1 - every existing network is unaffected (all 5
reference-project golden tests stay byte-identical).

  • validate_network: the old "allocation must equal exactly 1" rule is
    gone. Replaced by E_BAD_ALLOCATION (non-numeric or <= 0) and new
    E_ALLOCATION_EXCEEDS_CAPACITY (a task asking for more than a resource
    has at all, which could never be satisfied).
  • The CSV round trip now understands the id:qty notation in
    resource_ids (previously unparsed entirely - an id:qty token became
    one malformed resource id). Schedule output encodes quantity the same
    way, so it survives the round trip through schedule.csv.
  • The leveling engine and check_schedule both sum quantity per resource
    per day instead of counting tasks, so pooled contention is scheduled
    and verified correctly.
  • The network graph and Gantt utilization panel show quantity consumed.

Also fixed while implementing this: network_from_json's dict-form
allocation parsing crashed on a bad value instead of deferring to
validate_network, inconsistent with this module's own "loading is
lenient" design; and network_to_json could silently drop a resource id
missing from a partial allocations dict.

22 new tests. See PLAN.md Phase 5 for the full design writeup.

Also included in this release

Accumulated since v0.10.0: comprehensive docs + GitHub Pages site, ruff
pre-commit hooks and lint fixes, property-based (hypothesis) testing,
a 100-task large-network test, pytest-cov coverage tooling, and README
updates.

v0.10.0 — calendar-aware deadline horizon, named infeasibility errors

Choose a tag to compare

@rnwolf rnwolf released this 17 Jul 20:36

Fixed

  • Calendar outages no longer cause spurious "no feasible schedule found" errors. The deadline search was capped at the sum of task durations, which ignores calendar gaps: a task waiting out a resource's leave block for its first feasible execution window could push the makespan past the cap. The cap is now a serialized calendar-aware horizon that always suffices, and networks with no outages build byte-identically to v0.9.0.
  • Positive link lags hit the same cap and could also fail spuriously; the horizon now accounts for them.
  • Truly infeasible tasks raise a named error — e.g. task A ('Alpha', 5d) has no feasible calendar window: resource(s) r1 never have capacity for its full duration — instead of the generic message. A resource with base capacity 0 used to hang the forward pass in an infinite loop; the window search is now bounded and complete.

🤖 Generated with Claude Code

v0.9.0 — selectable buffer-sizing methods (cap, hchain, rsem)

Choose a tag to compare

@rnwolf rnwolf released this 17 Jul 09:53

Buffer sizing is now a knob instead of a hard-coded rule, applied to both the project buffer and every feeding buffer:

  • cap — Cut & Paste: buffer = sum of safety removed (realistic − optimal) over the protected chain. The new default — the most explainable method for teams new to CCPM.
  • hchain — 50% of chain length: the previous hard-coded behavior, kept selectable (--buffer-method hchain reproduces pre-0.9 schedules byte-identically).
  • rsem — Root-Squared Error: √(Σ safety²), statistical aggregation for genuine two-point estimates.

Select via build --buffer-method, build_schedule(buffer_method=...), or a top-level buffer_method key in the JSON exchange format (the flag/argument overrides the key). Mixed single-/two-point estimate networks normalize per task; summary.md records the method used, how many tasks in each protected chain had derived (single-point) safety estimates, and shows N (method wanted M) when a feeding chain couldn't shift far enough for its full buffer. Formulas and trade-offs: docs/buffer-sizing.md.

Breaking: the default changes schedule output — pre-0.9 behavior is --buffer-method hchain.

🤖 Generated with Claude Code

v0.8.0 — graph supports embedder chain labels and spaced resource names

Choose a tag to compare

@rnwolf rnwolf released this 15 Jul 20:08

Two graph generalizations for tools embedding render_network_html:

  • Resource lists split on ;/, only, so human-readable resource names with spaces survive intact in the resource filter and inspector (CCPM CSV outputs are unaffected).
  • Any chain label other than critical/none gets a palette color, with the verbatim label shown in the legend; feeding-<n> labels keep their friendly "Feeding chain n" rendering.

🤖 Generated with Claude Code

v0.7.0 — safety accounting, resource filter, Gantt polish

Choose a tag to compare

@rnwolf rnwolf released this 13 Jul 21:17
  • schedule.csv now carries realistic_duration for every task that has one (empty for buffers/milestones). Filter by chain to audit how much safety left the tasks versus what landed in that chain's buffer — the "shared insurance" conversation behind CCPM buffer sizing. The network graph reads estimates from the schedule directly; graph --tasks remains as the fallback for pre-v0.7 schedule files.
  • project-network.html resource filter (All resources / Unassigned / each named resource): matching tasks stay solid while the rest fades, so each team member sees their part in the context of the whole plan.
  • Gantt polish: long task labels no longer clip at the left edge; dotted horizontal guides per task row and per resource row make it easy to trace a label to its bar.

🤖 Generated with Claude Code

v0.6.0 — realistic estimates in the network graph

Choose a tag to compare

@rnwolf rnwolf released this 13 Jul 17:29
  • graph --tasks tasks.csv (library: tasks= / load_tasks) enriches each task node with its realistic duration estimate: the hover tooltip reads "(5d optimal, 10d realistic)" and the inspector gains an Estimates row — optimal 5d · realistic 10d (50% safety pooled into buffers) — so teams can review the optimal/realistic balance right on the network view. Without --tasks, output is unchanged.

🤖 Generated with Claude Code

v0.5.0 — interactive project-network graph

Choose a tag to compare

@rnwolf rnwolf released this 13 Jul 16:40
  • New graph subcommand: ccpm-scheduler graph schedule.csv project-network.html renders the schedule as a standalone interactive dependency graph — vis-network via CDN with the graph data embedded, so there is no build step or server; open it in any browser to zoom, pan, drag nodes, toggle hierarchical/free layout, and click a node to inspect task details. The Gantt shows when; the graph shows why. Colors match the Gantt (critical chain firebrick, feeding chains colored, buffers gold/khaki with dashed attachment edges, milestones as diamonds). Library API: render_network_html / write_network_html.
  • --version now reports the true package version (single-sourced from package metadata; 0.4.0 mistakenly reported 0.3.1).
  • Clearer E_FRACTIONAL_ALLOCATION message for whole allocations > 1.

🤖 Generated with Claude Code

Initial release for pypi

Choose a tag to compare

@rnwolf rnwolf released this 13 Jul 10:11

Initial release for PyPi. Chek that github workflow for publishing packages on release are working.