Skip to content

v0.8.5

Choose a tag to compare

@github-actions github-actions released this 16 Aug 00:42
· 45 commits to main since this release

Perth v0.8.5

Diff since v0.8.4

Perth.jl v0.8.5 — who does the work, and when the calendar is different

Nothing breaks: no API change, and a project written by any 0.8 is read exactly as it was. Full changelog: https://github.com/dantebertuzzi/Perth.jl/blob/main/CHANGELOG.md

Added

  • A collaborator registrypeople, person, people!, add_person!, remove_person!, and File → Collaborators…. assignee was, and stays, free text, and free text fragments in silence: "Ana", "Ana " and "ana" become three different people to the workload, to the overallocation check and to the highlight, with nothing on screen explaining why. Every save now trims the name — ends and middle — and unifies spellings that differ only in case, adopting the first one the project already knows. Accents are deliberately not unified: "Ana" and "Âna" may be two real people, and the computer cannot know they are not.

    Because the registry is consulted before the tasks, registering a name is how you fix a spelling everywhere: add_person!(p, "Ana Paula") re-spells every "ana paula" on the tasks. Each collaborator is a Person with name, role, team, email and notes — a name alone in a plan needs a side channel to be understood, and the role and team ride along in the assignee autocomplete, where they pay for themselves at the moment of choosing. The autocomplete offers the registry plus every name already used by a task; offering only the registry would hide names that already exist and invite retyping them, and retyping is what fragments. Removing someone from the list keeps their name on their tasks: they leave the list, not the work.

  • Swimlanes — group the chart by assignee or by team (Lanes: in the toolbar). This is why the names had to be clean first: with assignee fragmenting silently, the same "Ana" would have shown up as three separate lanes. The lane header is a row like any other, same height and same grid, so the table and the timeline stay one drawing — a header one pixel taller would slide every bar below it, and there is a real-browser test pinning exactly that. Collapsing a lane hides the tasks, not the person: what is left is a single bar from the first day of their work to the last, because whoever collapses wants less detail, not to lose the fact that they are busy from March to May.

    WBS summaries stay out of lanes — a summary brackets children who may belong to different people, and hanging it in someone's lane would claim they own the whole block. Grouping never repaints (a bar's automatic colour comes from its position in the project, not on screen), dependency arrows are drawn only between visible rows, and finding a task inside a collapsed lane opens the lane.

  • Statistics by person and by teampeople_stats, team_stats, and View → Statistics…. The engine already knew all of it and never added it up: how much each person carries, how much of that is done, how many days they are double-booked, how many of their tasks are past their deadline. The weight is the same one the S-curve uses, cost when set and person-days otherwise; two screens telling different stories about the same work would be worse than one screen fewer. Overloaded days are a person fact — two people from the same team working the same day is normal, and only an individual can be double-booked — so a team row sums its members' overloaded days rather than recomputing them. Work with no assignee gets its own row instead of being dropped: unowned work is a fact about the plan, not a gap to hide.

  • Calendar bandsBand, bands, bands!, add_band!, remove_band!, and File → Calendar bands…. A named stretch of calendar shaded behind the chart, with the name written along its left edge: a sprint, a shutdown, the rainy season, the fortnight the crane is on site. The colour is yours to pick, and bands may overlap, because a crunch week inside a sprint is a real thing to say. A band is annotation, not scheduling: it never moves a task, constrains a date or enters the CPM engine — it answers "why is this stretch different?", which until now had to live in someone's head. Inverted ranges are swapped on save, the way a negative duration is clamped, and a nameless band is dropped: shading that does not say why is noise.

Changed

  • The WBS summary bracket is no longer a solid block in the text colour — a black bar among pastel ones pulled the eye to the container instead of the work. It is now a thin neutral rail whose filled part is the progress that already rolls up from the children, a number the summary had and showed nowhere on the chart.

Fixed

  • The collaborator panel could lose an edit: it reloaded the whole project after saving, and a second edit made during that reload was overwritten when the older response landed. Both panels now adopt the answer to their own PUT, which is already the normalized state, and never reload underneath themselves.

  • Four translation keys were defined twice with different wording in the same dictionary, where the last definition silently wins; 27 duplicate definitions in total were removed. The suite now fails on any repeated key, and on any key missing from one of the four languages.