v0.29.1 Recursion HotfixRoster rendering restoredCurrent beta
- Fixed an accidental self-call in the new week-heading formatter that caused “too much recursion” / “Maximum call stack size exceeded” when rendering roster weeks.
- Restores first-run roster previews, saved roster views and Home → This pay fortnight without changing Employment Profile, PayBot, Cloud Sync, calendar or official data.
- Frozen official roster and pay-reference datasets remain unchanged.
v0.29.0 Employment & Pay ProfileDate-aware roles + manual work patterns
- Added a dated Employment & Pay Profile for trainee stages, Driver, legacy/current PDT, DTCO and RDS classifications.
- PayBot can resolve classification and applicable pay rate separately for each day, including role changes inside a fortnight.
- Added personal manual work patterns and no-default-pattern mode for employees who do not follow a supplied master rotation.
- Kept the Part 7 guarantee/overtime engine shared across supported Locomotive Operating classifications, with PF441 treated consistently unless contrary evidence is found.
- Fixed Sources mobile table overflow and standardised 14px spacing between Sources sections.
- Frozen official roster and pay-reference datasets remain unchanged.
v0.28.0 SourcesPay rates · allowances · agreements · public provenance
- Added More → Sources as a public reference area for the information behind RosterBot and PayBot.
- Driver grade and allowance tables are rendered directly from the same frozen PayBot reference pack used by calculations, including all scheduled 2023-EA rate dates.
- Added PB205 entitlement-rate provenance so users can distinguish rounded published EA rates from higher-precision verified entitlement APR anchors used by PayBot.
- Documented the current EA basis for wasted meals, T&I and PDT allowances, plus public links and identifiers for the 2023 and 2019 enterprise agreements.
- No roster data, payroll calculation rules, personal-data schema, Cloud Sync or calendar-subscription logic changed.
v0.27.20 Onboarding & View HotfixDismiss setup confirmation · Calendar default · fortnight spacing
- Fixed the first-run roster confirmation state so “Does this look like your roster?” is dismissed permanently after “Use this as my roster” and does not reappear when opening a month, This pay fortnight or another personal roster view.
- Made Calendar the true default roster view on phones as well as desktop. Existing users who deliberately selected Compact keep that saved preference.
- Added visual breathing room between Week 1 and Week 2 inside each pay fortnight.
- Retains the v0.27.19 outstation MAIN onboarding fix; no official roster data, payroll rules, personal schema, Cloud Sync or calendar-subscription logic changed.
v0.27.19 Outstation Onboarding HotfixSave and restore depot MAIN rosters correctly
- Fixed first-run “Use this as my roster” validation for date-aware outstation MAIN rotations such as Ballarat, Bendigo, Geelong, Seymour, Traralgon and other supplied depots.
- Fixed saved-session restoration using the same depot/date-aware roster validation, so an outstation MAIN setup is not rejected simply because MAIN is not a top-level SCS roster name.
- Validation now checks the selected depot, roster and actual date-aware line count, including the optional alternating second roster/line.
- No official roster data, payroll rules, diary schema, Cloud Sync or calendar logic changed.
v0.27.18 UI LuxuriesAnimated year browsing + human-readable roster periods
- Added a directional slide/fade transition when moving between years in the Home progress calendar, including swipe and arrow navigation; reduced-motion preferences still switch years instantly.
- Official roster-period choices now show the human-readable effective date range beside FP64–FP68 instead of an unexplained FP number alone.
- FLEX is now shown using its own effective-date periods rather than being implied to follow every FP boundary. FP66 correctly offers both FLEX versions either side of the 19 Oct 2025 FLEX change.
- The official roster viewer now reads FLEX master rotations from the effective-dated FLEX source, including periods where FLEX was not embedded directly in the selected FP dataset.
- Official roster/pay data, payroll rules, diary schema, Cloud Sync and live-calendar publishing logic are unchanged.
v0.27.17 Phase 5 Dashboard PolishCleaner Home + Calendar choice-card styling
- Simplified Home to the four useful at-a-glance cards now that Roster, Calendar, Pay and More have permanent primary navigation; removed the redundant second dashboard page and pager dots.
- Renamed Pay variances to Pay checks and made the card explain the difference between no payslips checked, all checked payslips matching, and differences that need review.
- Clarified dashboard search and year-progress legend wording and removed the decorative dashboard slogan so Home is more task-focused.
- Rebuilt the two Calendar method buttons as proper RosterBot cards with reliable mobile text/status layout, fixing the cramped concatenated appearance seen on phone screens.
- Official roster/pay data, payroll rules, diary schema, Cloud Sync and live-calendar publishing logic are unchanged.
v0.27.16 Cross-device Live CalendarOne subscription · any synced RosterBot device can update it
- Live calendar feeds are now account-scoped rather than dependent on the browser that originally created the private subscription URL.
- A signed-in device that does not hold the private calendar token can update the existing feed contents while leaving the token hash and subscription URL unchanged.
- Automatic calendar publishing now waits until Cloud Sync confirms the device is up to date, so a stale or conflicted device cannot overwrite the live calendar feed.
- Calendar subscription preferences now travel inside normal encrypted RosterBot Cloud Sync; the raw private calendar token remains device-local and is never added to Cloud Sync or .rosterbot backup data.
- No calendar backend redeploy, URL regeneration, roster data or payroll-rule changes are required.
v0.27.15 Phase 4 Calendar UXAutomatic subscription vs one-off export
- Reworked Calendar around two plain-language choices: Keep my calendar updated automatically and Export calendar once.
- Moved less-common subscription controls, feed preview, technical refresh/privacy information and one-off file-splitting controls behind progressive disclosure.
- Existing live subscription URLs, calendar generation, Supabase backend, one-off .ics generation and calendar privacy boundary are unchanged.
- Existing active subscriptions open directly into their management view; users can still switch to one-off export at any time.
v0.27.14 Roster History UXHuman-first roster changes
- Reworked Roster History & Changes around the question “What changed?” instead of exposing roster-period architecture.
- Added clear choices for a new roster/line/depot, starting an alternating pair, or changing one side of an existing alternating roster.
- Roster history now opens as a readable timeline; the editor appears only when adding or editing a change. Annual leave and destructive reset controls are progressively disclosed.
- Added a direct Add roster change action beside Current roster in the Roster tab. Existing timeline schema v4, roster calculations, diary records, PayBot, Calendar and Cloud Sync are unchanged.
v0.27.13 Recovery UX HotfixExisting-user onboarding + clearer cloud revision recovery
- Added an “Already have a roster set up?” path on first run, with direct Sign in & restore and .rosterbot import actions so returning users no longer need to create a dummy roster first.
- Cloud Sync now shows a human-readable roster summary for This device and the Current cloud revision, making it obvious when the current cloud revision itself contains the wrong roster.
- Loading an older cloud revision now explains that it only changes this device; if that restored revision should replace the current cloud copy, Sync now is relabelled “Make this current cloud copy”.
- Cloud payload application is verified after restore before RosterBot reports success. Frozen official roster and pay-reference files are unchanged.
v0.27.12 Modular Source PrototypeSplit frozen data + Cloud Sync safety hotfixes
- Split the development build into external CSS, frozen official roster data, frozen PayBot reference data and smaller application scripts while retaining a standalone single-file test build.
- Hardened the Data & Sync close button on touch devices.
- Signing in no longer schedules an immediate automatic transfer when the local and cloud copies differ; RosterBot pauses for explicit review first.
- Roster Lookup, payroll calculations, calendar subscription, Cloud encryption, personal schema v4 and official data values are otherwise unchanged.
v0.27.11 Primary Navigation PrototypeHome · Roster · Calendar · Pay · More
- Added persistent primary navigation after first-run setup, including a mobile bottom bar and desktop/tablet navigation.
- Added a dedicated Roster section with My Roster, Roster History & Changes, permanent Roster Lookup access and the official roster/shift viewer.
- Hardened Roster Lookup as a temporary view: lookup changes do not write the personal roster session or replace the shared personal-roster forecast.
- Moved Data & Sync, Settings, Changelog and Feedback into More while preserving their existing functionality.
- No official roster data, payroll rules, diary schema, calendar generation or Cloud Sync encryption logic changed.
v0.27.10 First-run UX PrototypeSimple onboarding without modes
- New users now land on a focused “Let’s set up your roster” flow instead of an empty dashboard or Advanced Roster Builder.
- Setup asks only for starting date, depot, roster and line, with an optional alternating second roster/line.
- “Show my roster” previews the upcoming roster before anything is saved; “Use this as my roster” then creates the existing schema-v4 personal roster timeline behind the scenes.
- Added a non-destructive Roster Lookup path and removed Quick / Basic vs Personal Diary / Advanced mode choice from the normal first-run experience.
- Existing saved roster history, diary, payroll, calendar subscription, Cloud Sync and official data formats are unchanged.
v0.27.9 Calendar Title PrototypePrivate read-only calendar feeds
- Moved the v0.27 dashboard closer to the approved RosterBot Green concept with softer cards, vector-style icons, a flat settings control and refined light/dark appearances.
- Added an obvious Back to Home control to dashboard drill-down views. This Week now opens only the current roster week without pay or calendar-export UI; This pay fortnight keeps the pay detail.
- Calendar export now has its own dedicated drill-down page, with a placeholder for a future read-only live subscription.
- Reworked Roster & shift viewer into a full tabulated master rotation showing every line for the selected roster, with sticky headings and duty detail lookup.
- Made the day-editor footer actions sticky and safe-area aware so Save, Use rostered and Remove actual record stay reachable on small mobile screens.
- Preserved the v0.26.2 locked-week stacking fix. Existing roster, payroll, Cloud Sync, encryption and personal-data logic remain unchanged.
- Added the first live Calendar Subscription prototype: a deliberately minimal read-only projection containing only shift code, sign-on/off, optional shift-book details and optional OR days.
- Added subscription privacy controls, range choices including Sync all saved history, local feed preview/download, private-link regeneration/disable controls, and provider refresh-delay warnings.
v0.27.0 Dashboard PrototypeNew home dashboard + Green light/dark appearance
- Introduced a dashboard-first home screen with Today, This week, This pay fortnight and Pay variances cards driven by the existing roster/pay diary.
- Added a swipeable second card page for My roster, Calendar exports/subscriptions and a double-width official Roster & shift viewer.
- Added RosterBot Green light/dark appearances and a Settings panel; legacy colour themes are no longer user-selectable in this prototype.
- Existing roster, payroll, Cloud Sync, encryption and personal-data logic remain intact underneath the new navigation layer.
v0.26.2 Locked Week Menu HotfixWeek actions stacking on locked mobile weeks
- Fixed the remaining mobile Week actions bug on locked weeks. The locked-header opacity created its own stacking context, allowing the calendar grid below it to paint over the pop-out menu.
- When a Week actions menu is open, its header is now explicitly positioned above the calendar so Unlock week stays tappable.
- No roster, payroll, Cloud Sync, encryption or personal-data rules changed.
v0.26.1 Mobile UI HotfixiPhone menus + modal reachability
- Fixed the mobile Week actions menu so it opens to the right of its button and remains inside the phone viewport instead of overflowing off the left edge.
- Fixed Data & Sync, Changelog, Feedback and other full-screen dialogs on mobile so their top edge and close button remain reachable with Safari's dynamic browser chrome.
- Made dialog headers sticky while their contents scroll, preserving an always-reachable close control on long panels.
- Banked O/T remains a future feature pending confirmation of the exact payroll rules; no payroll calculation rules changed in this hotfix.
- Cloud encryption/sync, personal-data schema v4 and locked roster/payroll datasets remain unchanged.
v0.26.0 Hosted Tester Releaserosterbot.work deployment
- Embedded the public Supabase project URL and publishable browser key so users at rosterbot.work can create an account or sign in without developer connection setup.
- Connection settings remain available only as an off-domain developer fallback; no secret/service-role credential is included.
- Includes the validated encrypted Cloud Sync, trusted-device, recovery-key and atomic key-management stack from v0.25.2a/v0.25.2b, plus the v0.26.0 RC tester polish.
- Locked roster/payroll rules and personal-data schema v4 remain unchanged.
v0.26.0 Hosted Tester ReleaseStabilised encrypted Cloud Sync + diary polish
- Promoted the validated local-first Cloud Sync stack for real tester use: persistent account sessions, automatic two-device sync, safe conflict handling, AES-256-GCM cloud encryption, trusted-device/session-only unlocks, passphrase rotation and recovery-key replacement.
- Includes the corrected Supabase key-management backend used in the successful credential-revocation tests; payroll and official roster logic remain unchanged.
- Fixed the desktop day-editor PDT control so its label receives the full drawer width instead of wrapping in a narrow half-column.
- Added 1000-character limits to daily diary notes and fortnight notes, plus a 120-character limit to custom claim descriptions, to keep personal sync payloads reasonably bounded without affecting normal notes.
- Cleaned tester-facing Cloud Sync setup wording while retaining manual public project URL/publishable-key configuration on fresh devices.
- Banked overtime and live calendar subscription are intentionally not included yet; both are being specified separately so they do not disturb this stabilised release.
v0.25.2 Encryption Key ManagementPassphrase rotation + recovery-key replacement
- Added Change encryption passphrase for an already-unlocked encrypted cloud. It re-wraps the existing 256-bit master key; the master key, keyed sync fingerprint and encrypted roster body remain unchanged.
- Added Replace recovery key, generating a fresh
RBK1-… secret and requiring the new key to be saved before commit. - Key-management changes use a new atomic Supabase RPC that creates the new wrapper revision and deletes older cloud revision history in the same database transaction. This is intentional: retaining old revisions would retain old passphrase/recovery wrappers and defeat credential revocation.
- Key-management is permitted only when encrypted cloud is unlocked and Safe Sync is Up to date. Server expected-revision checks still block races.
- Trusted-device/session-only behavior from v0.25.1a, AES-256-GCM roster encryption, HMAC-SHA-256 sync fingerprints, local-first operation, schema v4 and locked payroll/roster logic remain unchanged.
v0.25.1a Session Unlock hotfixPreserve session-only encryption unlocks
- Hotfix: repeated session/UI refreshes no longer reload the cloud key from persistent storage when the same account is already active. This fixes session-only unlocks being immediately discarded after unlocking with “Remember on this device” turned off.
- Trusted-device persistence still reloads the remembered key on a fresh page/browser start and after a later sign-in.
- Lock & forget still removes the remembered key; signing out still retains a trusted key by design; encrypted Safe Sync, automatic sync and payroll/roster logic are otherwise unchanged.
v0.25.1 Trusted Device polishPersistent cloud-key UX + safer local clearing
- Makes the existing “remember this device” encryption-key persistence visible in the normal Cloud Encryption card: trusted devices identify themselves explicitly, session-only unlocks can be promoted to trusted without re-entering a passphrase, and the lock action clearly forgets the saved key.
- Signing out continues to remove the Supabase login session while deliberately retaining the trusted encryption key for that account on this browser. Signing back in can therefore resume encrypted automatic sync without another encryption unlock.
- “Clear saved data” now also forgets remembered cloud encryption keys and local crypto-profile metadata on this browser while leaving the encrypted cloud copy untouched. This matches the privacy meaning of clearing local RosterBot data.
- Trusted-device copy now warns that private browsing/site-data clearing can discard the remembered key and that anyone with access to the trusted browser profile may use the locally remembered cloud key.
- v0.25.0 AES-256-GCM payload encryption, PBKDF2 passphrase wrapping, recovery-key unlock, HMAC fingerprints, encrypted conflict handling, v0.24.3d sync readiness/CAS protection, locked payroll/roster components and personal schema v4 remain unchanged.
v0.25.0 Encrypted Cloud SyncClient-side encryption + recovery key
- Added optional client-side encryption for Cloud Sync. Personal roster/pay payloads are encrypted in the browser with AES-256-GCM before upload; Supabase stores an encrypted envelope rather than readable diary JSON.
- A random 256-bit master key protects the roster payload. The master key is wrapped separately by a user encryption passphrase (PBKDF2-SHA-256) and by a random recovery key, so resetting the Supabase account password does not change the roster encryption key.
- Encrypted Safe Sync uses an HMAC-SHA-256 fingerprint keyed by the master key, preserving revision/conflict detection without publishing a plain hash of the personal payload.
- Added new-device unlock by encryption passphrase or recovery key, optional “remember this device”, and a cloud-key lock control. Local browser data remains local-first and readable on the device; this release encrypts the cloud copy, not browser localStorage or manual .rosterbot exports.
- Encryption migration uploads and re-downloads an encrypted revision, verifies that it decrypts back to the current local state, and only then calls the guarded backend cleanup RPC to purge older unencrypted revision history.
- v0.24.3d persistent login, iPad/Safari automatic-sync readiness, conflict/CAS protections, revision history, locked payroll/roster components and personal schema v4 remain unchanged.
v0.24.3d Startup readiness race hotfixMake readiness establish before the first network refresh
- Hotfix: readiness is now probed from the last safe local fingerprint immediately after the persistent session loads, before the first cloud-status network refresh. This removes a startup race where a quick edit could change the fingerprint before the baseline check ran and leave Safari showing “On · waiting”.
- Trusted form input/change activity is now remembered briefly; if a synchronized local-storage change follows that real user interaction while readiness is still pending, RosterBot treats it as an explicit user edit and safely wakes the sync engine. Startup/recovery writes do not get this trusted-user shortcut.
- The existing diary-ready event/flag remains the preferred fast path; the new baseline-match path is a conservative fallback rather than a replacement for IndexedDB recovery.
- Persistent sign-in, password recovery, 10-second cloud timeout, conflict/CAS rules, revision history, locked payroll/roster components and personal schema v4 remain unchanged.
v0.24.3a Account & Session hotfixFix recovery-mode startup ReferenceError
- Hotfix: declared the recovery-mode state before Cloud Sync UI initialization, fixing the
Can't find variable: recoveryMode error that could make an existing signed-in session appear logged out and break sign-in rendering. - Cloud sign-in survives browser/tab restarts by storing only the Supabase session tokens on this device; RosterBot never stores the account password.
- Expired access tokens refresh automatically using Supabase refresh-token rotation; signing out removes the persisted session from this browser.
- Added Forgot password and in-app recovery-link handling, plus a 10-second cloud request timeout.
v0.24.2 Auto Sync readiness hotfixiPad/Safari readiness + explicit app change signals
- Hardened automatic-sync startup so it no longer depends on a single one-shot
rosterbot:local-ready event. The diary now leaves a persistent ready flag and the sync engine recovers if the event is missed. - Added explicit syncable-change notifications from RosterBot's own data-write helpers, so notes/day/week edits can wake the sync engine even when browser storage interception is unreliable.
- Local fingerprint probes can directly wake automatic sync once the diary is ready; opening/refreshing Data & Sync also retries a pending local-only change.
- Added Advanced diagnostics for Auto engine state and the last automatic attempt, making mobile failures visible instead of silently leaving a yellow Local changes state.
- All Safe Sync conflict rules, server revision CAS protection, first-sync manual requirement, account isolation, locked payroll/roster components and personal schema v4 remain unchanged.
v0.24.1 Mobile Auto Sync hotfixBrowser-independent local-change detection
- Added a lightweight local SHA-256 change probe while the app is visible, so automatic sync no longer depends solely on intercepting
localStorage.setItem() calls — important for iPad/Safari-style browser behavior. - Removed the
navigator.onLine pre-check; automatic sync now attempts the real Supabase request and treats an actual request failure as offline, matching manual Sync now behavior more closely. - Failed automatic requests back off briefly instead of repeatedly hammering the network; focus, visibility and reconnect events can trigger a retry.
- All v0.24.0 Safe/Automatic Sync conflict rules, manual first-sync requirement, revision CAS protection and local-first saves remain unchanged.
- Locked roster/payroll components and personal schema v4 remain unchanged.
v0.24.0 Automatic SyncLocal-first background synchronization
- After a device has a safe sync baseline, meaningful diary/pay edits are saved locally first and automatically uploaded after a short debounce.
- RosterBot checks the cloud when the app becomes ready, returns online, regains focus and periodically while visible; cloud-only changes can be applied automatically when the local copy is unchanged.
- First backup/link, cleared-data recovery, incompatible payloads and any two-sided conflict remain manual. Server expected-revision checks still block upload races.
- Backup import, historical revision restore and undo-restore pause automatic sync until the user explicitly reviews and presses Sync now.
- Volatile navigation fields and derived shared-settings are excluded from sync fingerprints/payloads, preventing harmless device navigation from causing cloud revisions or conflicts.
- Locked roster/payroll components and personal schema v4 remain unchanged.
v0.23.1 Auth CallbackEmail confirmation returns to the exact RosterBot page
- Signup now supplies the exact current HTTP/HTTPS RosterBot page as Supabase
redirect_to, so localhost confirmation links return to the app instead of the web-server directory root. - Confirmation callbacks are detected on return; RosterBot immediately removes Supabase auth tokens/errors from the URL fragment before showing a confirmation result.
- For this beta the confirmation callback deliberately does not persist the returned session tokens: after verification, RosterBot asks the user to sign in normally.
- Safe Sync, account isolation, RLS, revision history, payroll/data locks and personal schema v4 are unchanged.
v0.23.0 Account UXCreate account + normal sign-in experience
- Added in-app email/password account creation without changing the local-first model or automatically uploading roster data.
- Added sign-in/create-account tabs, email-confirmation guidance, account verification status and a simpler account card for signed-in users.
- Moved raw Supabase project configuration into a closed Developer / connection settings section; existing saved beta connections continue working.
- Passwords are never persisted by RosterBot; the current beta session remains browser-session scoped while Safe Sync stays manual.
- Kept v0.22.2 Safe Sync conflict handling, canonical SHA-256 fingerprints, server revision checks, locked roster/payroll components and personal schema v4 unchanged.
v0.22.2 Safe Sync hotfixFingerprint-aware manual synchronization
- Hotfix: legacy v0.22.0 cloud payloads are fingerprinted using the current sync-key scope, so old device-only preferences such as theme/view mode cannot create a false two-sided conflict after upgrading.
- Added a single Sync now workflow that compares canonical SHA-256 fingerprints before choosing an upload, download prompt, no-op, or conflict stop.
- Distinguishes local-only changes, cloud-only changes, identical copies, first-device linking and genuine two-sided conflicts without silently overwriting either side.
- Protects a deliberately cleared browser from being mistaken for an automatic cloud-deletion request.
- Moved raw upload/restore/revision controls under Advanced / Recovery while keeping cloud history and one-step local restore safety.
- Server-side expected-revision checks remain the final race-condition guard. No automatic/background sync is enabled yet; locked roster/payroll data and personal schema v4 are unchanged.
v0.22.0 sync proof-of-conceptOptional local-first Supabase sync
- Added an optional Data & Sync workspace while preserving fully local operation and manual
.rosterbot backups. - Uses Supabase email/password authentication with the publishable browser key only; passwords are never written to RosterBot storage.
- Added manual upload, cloud-to-device restore, cloud revision history, per-device base revisions and server-enforced stale-write conflict handling.
- Cloud restores keep a one-step local safety snapshot so the previous local state can be recovered.
- No automatic upload occurs in this prototype. The v0.20.6 payroll/data rules and locked datasets are unchanged.
Combined beta v0.21.2Fortnight progress ticker + HHMM search
- Replaced the single month-level edit/check dots with one diary marker and one payslip marker for every pay fortnight ending in that month.
- Diary markers are filled only when both weeks of that fortnight are locked; payslip markers are filled only when that fortnight has a saved pay check. Hollow markers show incomplete work.
- Supports months containing three pay-fortnight end dates, not just two.
- Universal search now understands four-digit HHMM sign-on/sign-off searches without a colon, so 1349 finds 13:49.
- Kept all v0.20.6 payroll/data rules unchanged. Personal-data schema remains v4.
Combined beta v0.21.1Diary workflow polish
- Fixed Week actions menus being clipped by the week card, including nested leave choices.
- Widened and stabilised the actual-duty live-search field in the day-editor drawer.
- Added autosaved notes to every pay fortnight; fortnight notes are backed up and included in universal search.
- Added a visible legend for year-strip month dots: accent = diary edits, yellow = saved pay check.
- Month selection now displays every complete pay cycle intersecting that month, while days outside the selected month are dimmed rather than omitted.
- Kept all v0.20.6 payroll/data rules unchanged. Personal-data schema remains v4.
Combined beta v0.21.0Unified RosterBot workspace
- Made the personal roster the diary home screen, defaulting to the current pay fortnight with previous/next/today navigation and a year/month jump strip.
- Folded PayBot into RosterBot: pay summaries, breakdowns and day-by-day detail now open inline without a second editable PayBot page.
- Converted the day editor into a desktop side drawer/mobile bottom sheet and added full roster-book shift text for the selected actual/rostered duty.
- Replaced separate week buttons with a compact Week actions menu and a generic Mark as leave workflow supporting annual, personal and unpaid leave.
- Added universal search across diary dates/notes, supplied duty codes/details and saved pay-check variances.
- Added a home summary for next shift, expected pay, PH-credit movement and checked pay variances. Personal-data schema remains v4 and older backups remain compatible.
Combined beta v0.20.6Full-year audit corrections
- Separated PB205 entitlement APR from the rate ADP happened to apply before later backpay corrections; expected pay now follows the entitlement chronology while payroll-applied rates remain available for reconciliation.
- Made roster-book Hrs authoritative for rostered payable duration. Early release cannot reduce rostered pay; a genuine extension beyond the rostered duty can still add overtime.
- Fixed rostered-OFF public holidays so PH Gazette occupies 8h of the 80h fortnight guarantee instead of being added on top.
- Fixed worked-OFF public-holiday shifts crossing midnight so base pay covers the full payable shift while the 0.5 premium follows the calendar classification minute by minute.
- Added Rostered AV: called and worked as an explicit PH diary state; it uses the established rostered-ON/worked pay treatment and accrues the PH credit.
- Carried forward the confirmed FP67 SP215 correction to 15:34–23:34 / 8h00 and added audit regressions for the supplied 2026 cases. Personal-data schema remains v4.
Combined beta v0.20.5Annual-leave payroll correction
- Changed diary annual-leave weeks to a fixed 40 ordinary paid hours per week, independent of the underlying master-roster duty lengths, weekends and >8h shifts.
- Suppressed rostered weekend, public-holiday and overtime penalties while the week is on annual leave.
- A gazetted public holiday inside annual leave now replaces 8h of annual leave with an 8h PH Gazette payment, preserving the 40h weekly / 80h fortnight total.
- Added a permanent 08–21 Mar 2026 regression target: 72h Annual Leave + 8h PH Gazette at $83.0400 = $6,643.20, with no WEROSPEN, PHA, >8hrs RST or WEUNRPEN.
- Kept all locked official roster, roster-book, holiday and verified payroll-rate datasets byte-for-byte unchanged.
Combined beta v0.20.4Fortnight ordinary-hour allocation + per-shift durations
- Changed worked-OR handling so PayBot first fills any unmet ordinary fortnight obligation before classifying an OR-day shift as genuine additional OTUnrShft/WEUNRPEN.
- A moved shift therefore does not create extra pay merely because it landed on an originally rostered OR day; a true 11th shift still receives the additional-shift treatment.
- Kept individual >8h treatment independent: once an OR-day shift is filling ordinary hours, only time beyond 8h receives >8hrs RST plus WEUNRPEN.
- Moved worked/shift duration onto each RosterBot Calendar and Compact shift (for example 8h00 or 8h24) and removed the fortnight WORKED TIME total.
- Kept all locked official roster, roster-book, holiday and verified payroll-rate datasets byte-for-byte unchanged.
Combined beta v0.20.3Fortnight claims + roster workflow polish
- Added worked-time totals to each RosterBot pay-fortnight footer.
- Added Save & close beside the day-editor close control, while keeping Wasted Meal as the shift-linked allowance.
- Added persistent fortnight-level claims for Rest Job Meals, T&I Meals, T&I Beds and a manual travel/other claim.
- Locked public-holiday day editing to date-detected PH controls and automatic conversion defaults such as rostered-on Job / worked.
- Changed expected-gross summation to add payroll element values after cent rounding, matching the supplied ADP payslip presentation.
- Kept all locked official roster, roster-book, holiday and verified payroll-rate datasets byte-for-byte unchanged.
Combined beta v0.20.2ADP tenth-hour rounding refinement
- Refined payroll rounding from always-up to the rule demonstrated by supplied payslips: any positive time class has a 0.1h minimum, then values round to the nearest 0.1h.
- Added the 8h07 regression case: 0.1167h overtime now rounds to 0.1h (not 0.2h), while an 8h02/8h03 excess still receives the 0.1h minimum.
- Kept the over-8-hours split introduced in v0.20.1: excess time receives >8hrs RST plus WEUNRPEN rather than remaining in the rostered/PH premium class.
- Kept all locked roster, roster-book, holiday and verified payroll-rate datasets byte-for-byte unchanged.
Combined beta v0.20.1Payroll rounding hotfix
- Changed payroll time-class handling from nearest-0.1h rounding to always rounding UP to the next 0.1h, matching supplied payslip evidence.
- Corrected rostered shifts over 8 hours so the excess portion receives the unrostered/overtime 0.5 premium rather than remaining inside the rostered/PH premium class.
- Updated the visible PayBot beta version from the stale v0.18 label.
- Kept all locked roster, roster-book, holiday and verified payroll-rate datasets byte-for-byte unchanged.
Combined beta v0.20Modular data freeze + payroll anchors
- Split validated official roster, roster-book, holiday and payroll data into locked build components while preserving the single-file offline release.
- Replaced PB205 date inference with exact payslip-verified APR anchors from Apr 2024 through the current $86.8122 rate.
- Added live numeric duty search: typing 613 finds SP613 first and also fuzzy-matches duty numbers containing 6…1…3 in order; 0613 remains a sign-on-time search.
- Kept personal-data schema v4 unchanged for direct v0.19 compatibility.
Combined beta v0.19Historical roster + PH conversion engine
- Added effective-dated FP64–FP68 official roster data, SCS and supplied outstations, with depot-aware diary anchors.
- Added official public-holiday conversion notices for 2025–2026; converted PH jobs/AV/PH states now resolve before PayBot.
- Fixed public-holiday defaults so rostered work defaults to worked and rostered OR defaults to not required.
- Added PH highlighting, clearer amended-day originals, one-click annual-leave weeks, Save & close in Advanced Builder, and date-correct live duty search.
- Fixed backup export to trigger directly from the user click. FP68 Grand Final 25/09/2026 remains flagged as photo-unverified until its photographed table is verified.
Combined beta v0.18Roster + Pay fusion controls
- Added a compact pay-cycle calendar navigator with month/year controls, previous/next month arrows and 14-day pay-cycle highlighting.
- Clicking any calendar date instantly jumps the roster view to that pay fortnight.
- Expanded the retrospective day editor with shift lookup, +8h, PDT, public-holiday treatment and all currently supported PayBot allowances.
- Diary allowances/PDT/PH treatment now flow directly into PayBot when the fortnight is calculated.
- Changed the day-note prompt to “Daily roster change/any notes regarding shift”.
- Fixed the Quick-mode pay-preview TypeError, Terminal experience-selector text overlap, and Advanced Roster Builder dialog padding.
Combined beta v0.17Quick + Personal Diary architecture
- Split RosterBot into two flexible experiences over one roster engine: Quick / Basic for lightweight planning and Personal Diary / Advanced for long-term history and audit.
- Quick mode no longer commits a roster timeline automatically; users can later convert the current quick setup into their personal diary with one action.
- Advanced Roster Builder now works independently of Basic Setup and accepts periods in any order: earlier than existing history, inserted in the middle, or later than the current final period.
- Saved periods are self-contained anchors, so back-filling older history does not move or recalculate later roster-change anchors.
- Separated personal-diary annual leave from temporary Quick / Basic scenarios and added diary leave management inside Advanced Builder.
- Added edit/remove controls for every saved roster period, earlier/later helpers, and clearer timeline layout.
- Fixed the Advanced Builder roster summary spacing/layout issue where labels such as CONTINUOUS ROSTER and A1 could run together.
Combined beta v0.16Diary-first navigation
- RosterBot now opens as a personal diary: returning users land on the current week, with date-range, current-week and pay-fortnight navigation.
- Replaced the old display-weeks workflow with selectable From / To dates while keeping multi-year history and forecasts available.
- Grouped roster weeks into pay fortnights and added an expected-gross summary plus one-click PayBot details for each fortnight.
- Added week locking to protect completed historical facts from accidental edits while keeping PayBot calculations free to recalculate.
- Added pay-cycle checking with actual payslip gross, difference tracking and calculation snapshots for audit history.
- Basic setups are migrated into the roster timeline so changing the diary view no longer shifts the underlying roster anchor.
Combined beta v0.15Personal roster diary foundation
- Added Advanced Roster Builder with chronological roster arrangements: continuous roster, replace one alternating track while preserving the other, or start a new permanent swap.
- Added retrospective day editing with actual duty/times, status and private notes while preserving the original rostered duty underneath.
- Added one-week roster/line overrides without disturbing the underlying rotation, named public holidays in RosterBot, +1/+4 week annual-leave entry, and removed the old 26-week display cap.
- Added local personal-database storage, backup-age reminders and clearer privacy/data-responsibility messaging. Roster/pay diary data is not stored in a RosterBot account or backend.
- PayBot now consumes RosterBot actual-day records when present and keeps rostered versus actual times visible for audit.
Combined beta v0.14Full Terminal theme
- Rebuilt Design 7 as Terminal: the entire app now uses one 16px system-monospace typeface, including headings, forms, results and controls.
- Removed card styling, rounded controls, coloured status pills and decorative UI from Terminal mode so the page reads like a command-line screen.
- Actions render as bracketed text commands and compact editor rows are reduced to plain aligned text with bracket-style time fields.
- Kept 16px editable fields to preserve the no-auto-zoom behaviour on iPhone.
Combined beta v0.13ASCII / Plain Text theme
- Added Design 7: a high-contrast monospaced ASCII-style theme for RosterBot and PayBot.
- Removed visible card and button boxes in this theme; actions render as bracketed text or simple arrows.
- Inputs use open square-bracket corners instead of full boxes, while keeping 16px mobile input text to avoid iPhone focus zoom.
- Compact roster and PayBot views are flattened into dense terminal-like rows, and payslip/day-by-day views read like a plain-text printout.
Combined beta v0.12Real-payslip reconciliation + workflow polish
- Added a This pay cycle button and stopped input-method changes from clearing the loaded fortnight until Load fortnight is pressed.
- Public holidays are now detected from the date only; the manual PH checkbox has been removed.
- PH credit leave now appears as PH Days Leave and is shown as its own payslip element.
- Payroll time classes are rounded per shift/day to 0.1h before fortnight totals, matching the latest supplied payslip evidence.
- Gross pay keeps full four-decimal rate precision through the calculation and rounds the final dollar total at the end, while displayed line items remain shown to cents.
- Day-by-day view now shows ordinary base or paid leave as well as overtime, penalties and allowances, with a total payment for each day.
- Improved shift-code lookup so master-rotation duties such as SP615, SP616 and SP913 can still be found when roster-book lookup is incomplete.
- Sign-on fields now understand quick text shortcuts such as PH, AL, SL, UL and OR when a full keyboard or paste is available.
- The Data panel now checks browser storage and can request persistent storage where supported.
Combined beta v0.11Tighter mobile compact editor
- Repacked Compact mode into a denser two-row phone layout with day, duty, status and expand controls on one line.
- Reduced card padding and control spacing while keeping sign-on and sign-off directly editable.
- PayBot mobile inputs now use a 16px control font to prevent Safari from auto-zooming when a time field is tapped.
- Shortened the compact Skip control and removed redundant manual-entry sublabels to keep the fortnight easy to scan.
Combined beta v0.10Fast compact entry
- Compact PayBot rows now let you edit sign-on and sign-off times without expanding the day.
- Manual-entry days show empty HHMM fields immediately, with +8h available from the compact row.
- Added Skip → to move to the next day while leaving the current day unchanged; untouched manual days are shown as OR not worked.
- Status badges now use short, readable labels and are no longer squeezed into a tiny pill.
Combined beta v0.9.1Current payroll rate hotfix
- Updated locomotive operating grade calculations to use the cumulative 2% temporary allowance from the pay period starting 26 Jul 2026.
- PB205 now uses the supplied payroll rate of $86.8122 from 26 Jul 2026 while earlier fortnights keep their historical rate.
- Future scheduled grade rates retain the same cumulative temporary allowance until the temporary arrangement ends.
Combined beta v0.9Quick-entry workflow
- Manual sign-on entry now automatically changes an OFF/unknown day to a worked shift so the finish can be entered straight away.
- Added optional Auto next day in Compact mode to move through a fortnight with fewer taps.
- The duty box can now search by sign-on time, such as 0613, and show matching shift codes for that date.
Combined beta v0.8Job details + compact PayBot editor
- Expanded RosterBot compact shifts now show the full roster-book job description when available.
- Added Full / Compact editor layouts to PayBot, with Compact designed for quick phone use.
- Compact PayBot rows show the essentials at a glance and expand into the full editing controls.
Combined beta v0.7Compact roster view
- Added Calendar / Compact view switching to RosterBot.
- Compact view is designed for phones, keeps sign-on and sign-off together, and expands for more detail.
- Phones default to Compact on first use; the chosen view is remembered.
Combined beta v0.6Faster time entry + day-by-day PDT
- Added a +8h button beside every editable shift so sign-off can be filled instantly.
- Current-scheme PDT can now be selected day by day instead of for the whole fortnight.
- PDT days automatically use A704 for weekday hours and A705 for weekend hours.
- Kept legacy appointed PDT handling separate.
Combined beta v0.5Autosave, backup and polish
- Added local autosave plus export/import backup controls.
- Updated Cyan / Green to the clearer early PayBot palette.
- Matched the Annual Leave colour in the legend and roster display.
- Cleaned up PayBot wording and clarified WEUNRPEN.
v1.9Railway colour erasCurrent
- Kept Cyan / Green as the default and Mono as Design 2.
- Added VR Blue & Gold (1937–1981).
- Added V/Line Orange (1983–1994), V/Line Red & Blue (2000–2006) and V/Line Purple (2014–Present).
- Retired Purple Hell and the previous Heritage V/Line theme.
v1.8iPhone calendar export + changelog
- Added separate Add to Calendar and Share / Save actions for each .ics file.
- Added Share / Save all plus a ZIP download containing all prepared calendar files.
- Added this in-app changelog so users can see what has changed between versions.
v1.7Theme refresh
- Cyan / Green became the default theme.
- Added Heritage V/Line colours.
- Renamed the original purple theme to Purple Hell.
v1.6Flexible calendar exports + annual leave
- Added alternating Week A / Week B .ics files.
- Added optional separate OR and Annual Leave .ics files.
- Added user-entered Annual Leave weeks to the web roster and calendar.
- Calendar event titles now begin with sign-on time, e.g. 11:40 - SP038 - A7.
v1.5Feedback
- Added the feedback form with optional diagnostics and Formspree delivery.
v1.4Mobile layout
- Improved iPhone sizing for the header and date controls.
- Made all seven roster days fit on a phone screen without horizontal scrolling.
v1.3Accurate sign-off times
- Added roster-book matching by shift number, weekday and sign-on time.
- Added accurate shift finish times, including non-8-hour and overnight shifts.
- Added 8-hour Spare handling and retained shift-book details for calendar descriptions.
v1.2RosterBot + themes
- Renamed the project to RosterBot 🤖.
- Added switchable visual themes while keeping roster functionality separate from styling.
v1.1Standalone build
- Moved the app, roster data and styling into one standalone HTML file to fix local loading issues.
v1.0First working roster generator
- A/B/C/D/Flex rotations, date-based roster display, permanent swaps and .ics export.