Releases: rnwolf/ccpm-scheduler
Release list
v0.12.0
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 synthesizedFINISHnode has always
used) -E_NO_RESOURCEis exempted,E_BAD_DURATIONallows0. - A non-critical chain that reaches project completion with zero slack
(no room for a feeding buffer) now connects directly to the synthesized
FINISHmilestone instead of being silently left disconnected. check_schedulegained 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
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 byE_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:qtynotation in
resource_ids(previously unparsed entirely - anid:qtytoken became
one malformed resource id). Schedule output encodes quantity the same
way, so it survives the round trip throughschedule.csv. - The leveling engine and
check_scheduleboth 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
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)
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 hchainreproduces 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
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/nonegets 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
schedule.csvnow carriesrealistic_durationfor 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 --tasksremains as the fallback for pre-v0.7 schedule files.project-network.htmlresource 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
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
- New
graphsubcommand:ccpm-scheduler graph schedule.csv project-network.htmlrenders 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. --versionnow 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
Initial release for PyPi. Chek that github workflow for publishing packages on release are working.