skilldrop-cli 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +2 -0
  2. package/catalogue.json +18 -2
  3. package/model-routing.json +16 -0
  4. package/package.json +1 -1
  5. package/packs/event-planner/pack.json +61 -0
  6. package/packs/event-planner/skills/run-of-show/SKILL.md +141 -0
  7. package/packs/event-planner/skills/run-of-show/evals/eval_queries.json +30 -0
  8. package/packs/event-planner/skills/run-of-show/evals/evals.json +103 -0
  9. package/packs/event-planner/skills/run-of-show/evals/files/1/agenda.md +16 -0
  10. package/packs/event-planner/skills/run-of-show/evals/files/2/schedule.csv +8 -0
  11. package/packs/event-planner/skills/run-of-show/evals/files/3/notes.txt +3 -0
  12. package/packs/event-planner/skills/run-of-show/evals/files/4/sessions_export.csv +25 -0
  13. package/packs/event-planner/skills/run-of-show/evals/files/4/venue_and_crew.txt +27 -0
  14. package/packs/event-planner/skills/run-of-show/evals/files/5/runsheet_v4.csv +28 -0
  15. package/packs/event-planner/skills/run-of-show/evals/files/5/venue_and_suppliers.txt +22 -0
  16. package/packs/event-planner/skills/run-of-show/evals/files/6/acts_from_booker.csv +26 -0
  17. package/packs/event-planner/skills/run-of-show/evals/files/6/venue_rooms_and_crew.txt +14 -0
  18. package/packs/event-planner/skills/run-of-show/evals/files/7/runsheet_draft_v4.csv +25 -0
  19. package/packs/event-planner/skills/run-of-show/evals/files/7/venue_and_fixed_times.txt +24 -0
  20. package/packs/event-planner/skills/run-of-show/examples/product-launch.md +77 -0
  21. package/packs/event-planner/skills/run-of-show/examples/product-launch.svg +58 -0
  22. package/packs/event-planner/skills/run-of-show/manifest.json +44 -0
  23. package/packs/event-planner/skills/run-of-show/scripts/show_check.py +295 -0
  24. package/packs/event-planner/skills/run-of-show/templates/show.json +15 -0
  25. package/packs/event-planner/skills/seating-plan/SKILL.md +152 -0
  26. package/packs/event-planner/skills/seating-plan/evals/eval_queries.json +30 -0
  27. package/packs/event-planner/skills/seating-plan/evals/evals.json +134 -0
  28. package/packs/event-planner/skills/seating-plan/evals/files/1/guests.csv +31 -0
  29. package/packs/event-planner/skills/seating-plan/evals/files/2/table-plan.txt +8 -0
  30. package/packs/event-planner/skills/seating-plan/evals/files/3/brief.txt +4 -0
  31. package/packs/event-planner/skills/seating-plan/evals/files/3/guests.csv +49 -0
  32. package/packs/event-planner/skills/seating-plan/evals/files/4/rsvp_export.csv +127 -0
  33. package/packs/event-planner/skills/seating-plan/evals/files/4/seating_notes.txt +21 -0
  34. package/packs/event-planner/skills/seating-plan/evals/files/5/organiser_notes.txt +10 -0
  35. package/packs/event-planner/skills/seating-plan/evals/files/5/registrations.csv +93 -0
  36. package/packs/event-planner/skills/seating-plan/evals/files/5/table_plan_v3.csv +94 -0
  37. package/packs/event-planner/skills/seating-plan/evals/files/6/bridgets_notes.txt +30 -0
  38. package/packs/event-planner/skills/seating-plan/evals/files/6/ticket_export.csv +117 -0
  39. package/packs/event-planner/skills/seating-plan/evals/files/6/venue_floorplan_notes.txt +14 -0
  40. package/packs/event-planner/skills/seating-plan/evals/files/7/keep_apart_CONFIDENTIAL.txt +9 -0
  41. package/packs/event-planner/skills/seating-plan/evals/files/7/prom_seating_v3.csv +101 -0
  42. package/packs/event-planner/skills/seating-plan/evals/files/7/ticket_list.csv +101 -0
  43. package/packs/event-planner/skills/seating-plan/evals/files/7/venue_info.txt +16 -0
  44. package/packs/event-planner/skills/seating-plan/evals/files/8/registrations_export.csv +147 -0
  45. package/packs/event-planner/skills/seating-plan/evals/files/8/room_layout.md +22 -0
  46. package/packs/event-planner/skills/seating-plan/evals/files/8/seating_requests.txt +31 -0
  47. package/packs/event-planner/skills/seating-plan/evals/files/9/guest_list.csv +84 -0
  48. package/packs/event-planner/skills/seating-plan/evals/files/9/notes.txt +16 -0
  49. package/packs/event-planner/skills/seating-plan/evals/files/9/table_plan.csv +85 -0
  50. package/packs/event-planner/skills/seating-plan/examples/wedding-dinner.md +61 -0
  51. package/packs/event-planner/skills/seating-plan/examples/wedding-dinner.svg +39 -0
  52. package/packs/event-planner/skills/seating-plan/manifest.json +44 -0
  53. package/packs/event-planner/skills/seating-plan/scripts/seating_check.py +324 -0
  54. package/packs/event-planner/skills/seating-plan/templates/seating.json +28 -0
  55. package/packs/experience-design/pack.json +5 -0
  56. package/packs/experience-design/skills/locale-check/SKILL.md +139 -0
  57. package/packs/experience-design/skills/locale-check/evals/eval_queries.json +38 -0
  58. package/packs/experience-design/skills/locale-check/evals/evals.json +104 -0
  59. package/packs/experience-design/skills/locale-check/evals/files/1/budget.json +1 -0
  60. package/packs/experience-design/skills/locale-check/evals/files/1/locales/ar.json +16 -0
  61. package/packs/experience-design/skills/locale-check/evals/files/1/locales/de.json +12 -0
  62. package/packs/experience-design/skills/locale-check/evals/files/1/locales/en.json +12 -0
  63. package/packs/experience-design/skills/locale-check/evals/files/1/locales/pl.json +12 -0
  64. package/packs/experience-design/skills/locale-check/evals/files/2/app/src/main/res/values/strings.xml +12 -0
  65. package/packs/experience-design/skills/locale-check/evals/files/2/app/src/main/res/values-es/strings.xml +11 -0
  66. package/packs/experience-design/skills/locale-check/evals/files/2/app/src/main/res/values-fr/strings.xml +12 -0
  67. package/packs/experience-design/skills/locale-check/evals/files/3/po/ja.po +20 -0
  68. package/packs/experience-design/skills/locale-check/evals/files/3/po/messages.pot +23 -0
  69. package/packs/experience-design/skills/locale-check/evals/files/3/po/ru.po +22 -0
  70. package/packs/experience-design/skills/locale-check/evals/files/4/budgets.json +15 -0
  71. package/packs/experience-design/skills/locale-check/evals/files/4/locales/ar.json +265 -0
  72. package/packs/experience-design/skills/locale-check/evals/files/4/locales/de.json +265 -0
  73. package/packs/experience-design/skills/locale-check/evals/files/4/locales/en.json +265 -0
  74. package/packs/experience-design/skills/locale-check/evals/files/4/locales/fr.json +265 -0
  75. package/packs/experience-design/skills/locale-check/evals/files/4/locales/pl.json +265 -0
  76. package/packs/experience-design/skills/locale-check/evals/files/5/app/src/main/res/values/strings.xml +77 -0
  77. package/packs/experience-design/skills/locale-check/evals/files/5/app/src/main/res/values-es/strings.xml +63 -0
  78. package/packs/experience-design/skills/locale-check/evals/files/5/app/src/main/res/values-ja/strings.xml +61 -0
  79. package/packs/experience-design/skills/locale-check/evals/files/6/po/cs.po +605 -0
  80. package/packs/experience-design/skills/locale-check/evals/files/6/po/marlin.pot +602 -0
  81. package/packs/experience-design/skills/locale-check/evals/files/6/po/pt_BR.po +602 -0
  82. package/packs/experience-design/skills/locale-check/evals/files/6/po/ru.po +608 -0
  83. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/en.lproj/Localizable.strings +160 -0
  84. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/en.lproj/Localizable.stringsdict +70 -0
  85. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/he.lproj/Localizable.strings +157 -0
  86. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/he.lproj/Localizable.stringsdict +86 -0
  87. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/it.lproj/Localizable.strings +160 -0
  88. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/it.lproj/Localizable.stringsdict +68 -0
  89. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/ko.lproj/Localizable.strings +160 -0
  90. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/ko.lproj/Localizable.stringsdict +62 -0
  91. package/packs/experience-design/skills/locale-check/examples/settings-release.md +107 -0
  92. package/packs/experience-design/skills/locale-check/manifest.json +45 -0
  93. package/packs/experience-design/skills/locale-check/scripts/locale_check.py +1105 -0
  94. package/packs/operations-manager/pack.json +60 -0
  95. package/packs/operations-manager/skills/shift-roster/SKILL.md +166 -0
  96. package/packs/operations-manager/skills/shift-roster/evals/eval_queries.json +38 -0
  97. package/packs/operations-manager/skills/shift-roster/evals/evals.json +135 -0
  98. package/packs/operations-manager/skills/shift-roster/evals/files/1/shifts.csv +3 -0
  99. package/packs/operations-manager/skills/shift-roster/evals/files/1/staff.csv +8 -0
  100. package/packs/operations-manager/skills/shift-roster/evals/files/2/rota.csv +22 -0
  101. package/packs/operations-manager/skills/shift-roster/evals/files/2/staff.csv +6 -0
  102. package/packs/operations-manager/skills/shift-roster/evals/files/3/team.md +14 -0
  103. package/packs/operations-manager/skills/shift-roster/evals/files/4/availability_export_wk47.csv +23 -0
  104. package/packs/operations-manager/skills/shift-roster/evals/files/4/rota_notes.txt +20 -0
  105. package/packs/operations-manager/skills/shift-roster/evals/files/5/rota_draft_16-29nov.csv +107 -0
  106. package/packs/operations-manager/skills/shift-roster/evals/files/5/staff_list.csv +17 -0
  107. package/packs/operations-manager/skills/shift-roster/evals/files/6/availability_notes.txt +24 -0
  108. package/packs/operations-manager/skills/shift-roster/evals/files/6/peoplehub_staff_export.csv +14 -0
  109. package/packs/operations-manager/skills/shift-roster/evals/files/6/rota_template.csv +25 -0
  110. package/packs/operations-manager/skills/shift-roster/evals/files/7/leave_and_availability.txt +18 -0
  111. package/packs/operations-manager/skills/shift-roster/evals/files/7/rota_wc_30nov.csv +47 -0
  112. package/packs/operations-manager/skills/shift-roster/evals/files/7/staff_list.csv +15 -0
  113. package/packs/operations-manager/skills/shift-roster/evals/files/8/availability_form_responses.csv +22 -0
  114. package/packs/operations-manager/skills/shift-roster/evals/files/8/cover_requirements.csv +15 -0
  115. package/packs/operations-manager/skills/shift-roster/evals/files/8/staff_export.csv +29 -0
  116. package/packs/operations-manager/skills/shift-roster/evals/files/9/leave_and_restrictions.txt +16 -0
  117. package/packs/operations-manager/skills/shift-roster/evals/files/9/rota_export_07-13Dec.csv +85 -0
  118. package/packs/operations-manager/skills/shift-roster/evals/files/9/staff_list.csv +27 -0
  119. package/packs/operations-manager/skills/shift-roster/examples/cafe-week.md +72 -0
  120. package/packs/operations-manager/skills/shift-roster/examples/cafe-week.svg +123 -0
  121. package/packs/operations-manager/skills/shift-roster/manifest.json +34 -0
  122. package/packs/operations-manager/skills/shift-roster/scripts/roster_check.py +633 -0
  123. package/packs/operations-manager/skills/shift-roster/templates/roster.json +22 -0
@@ -0,0 +1,60 @@
1
+ {
2
+ "description": "Staff rotas from who is available, what each shift needs and the working-time rules: a week or fortnight built and drawn as a grid, shown only once a script has checked every shift's cover and skills, and every person's hours, rest between shifts and days in a row.",
3
+ "display_name": "Operations manager",
4
+ "keywords": [
5
+ "rota",
6
+ "roster",
7
+ "schedule",
8
+ "shifts",
9
+ "staffing",
10
+ "workforce",
11
+ "coverage",
12
+ "working time"
13
+ ],
14
+ "links": {
15
+ "documentation": "https://sananthanarayan.github.io/skilldrop/packs/operations-manager/"
16
+ },
17
+ "maintainers": [
18
+ {
19
+ "name": "sananthanarayan"
20
+ }
21
+ ],
22
+ "first-value": {
23
+ "audience-posture": "non-technical",
24
+ "prerequisites": [
25
+ "Who works for you, what they can do, and when they can't work",
26
+ "The shifts you need covered, with how many people of each kind",
27
+ "Python 3 on the machine, which the rota check and week drawing run on"
28
+ ],
29
+ "starter-task": "Get next week's rota, with every shift covered and nobody short of rest",
30
+ "starter-prompt": "Make next week's rota for the café, Monday to Saturday. Every day: an opening shift 06:30–14:30 and a closing shift 14:00–21:00, each needing one keyholder and one barista. Staff: Amira (keyholder, barista, max 40 h), Ben (barista, max 24 h, not Wednesdays), Chloe (keyholder, barista, max 32 h), Dev (keyholder, barista, max 40 h), Ema (barista, max 24 h, not Mondays or Tuesdays), Fay (barista, max 32 h). At least 11 hours between shifts, nobody more than 5 days in a row.",
31
+ "verification": "shift-roster leads with the rota as a table of days by people, says which shifts it couldn't fill and why, lists the rules it assumed, and saves a week grid drawn from a check that found every shift covered and no rest, hours or consecutive-day rule broken.",
32
+ "recovery": "If shift-roster does not activate, ask for it by name (\"use shift-roster\"). If it says a week can't be covered, it names the smallest change that would; give it that change or say which rule may bend."
33
+ },
34
+ "requires": [
35
+ "core"
36
+ ],
37
+ "journey": {
38
+ "when": "You need next week's rota, or want to know whether the one you drew breaks any rule.",
39
+ "you_bring": [
40
+ "your staff, with what each can do and their hours",
41
+ "when each person can't work",
42
+ "the shifts, with times and how many of each role they need",
43
+ "your rules: rest between shifts, days in a row, hours in a day"
44
+ ],
45
+ "steps": [
46
+ {
47
+ "skill": "shift-roster",
48
+ "you_do": "Give it the staff, the shifts and the rules, or a rota you've already drawn.",
49
+ "you_get": "A rota that passes every rule, as a table and a week grid, or the problems in yours with the fix for each.",
50
+ "decide": "Publish the rota, or say which preference to trade (a person's day off, a rule that may bend)."
51
+ },
52
+ {
53
+ "skill": "shift-roster",
54
+ "you_do": "Tell it what changed: someone off sick, a swap two people asked for.",
55
+ "you_get": "The rota re-checked with the change, and who can cover any shift it leaves short."
56
+ }
57
+ ],
58
+ "you_end_with": "A rota you can publish, checked shift by shift and person by person."
59
+ }
60
+ }
@@ -0,0 +1,166 @@
1
+ ---
2
+ name: shift-roster
3
+ description: Build a staff rota for a week or a fortnight from who is available, what each shift needs and the working-time rules, and check it with a script before anyone sees it — every shift covered with the right skills, nobody double-booked, over their hours, short of rest between shifts or past the consecutive-day limit — drawn as a week grid. Use when a manager asks to "make the rota", "build next week's schedule", "who should work which shift", "check this rota", "fill these shifts", or has staff availability and shift needs for a shop, restaurant, clinic, warehouse or call centre.
4
+ ---
5
+
6
+ # shift-roster
7
+
8
+ A rota a manager can publish: every shift covered by people with the skills it needs, and no
9
+ one double-booked, over their hours, short of rest or past their days in a row. The agent
10
+ does the scheduling (who takes which shift, and what's fair). A script checks every rule
11
+ for every person and every shift, and draws the week. A rota that looks fine can still hide
12
+ a closing shift followed by an opening one eight hours later, and the check stops it reaching
13
+ the team.
14
+
15
+ ## How to respond
16
+
17
+ **These rules come before the steps and outrank them:**
18
+
19
+ - **No rule is broken quietly.** A rota either passes the check, or the reply says which
20
+ shift can't be covered and what is in the way. Never publish a rota that breaks rest,
21
+ hours, availability or skill cover because it was the closest you got.
22
+ - **Answer the manager, in a manager's words.** Lead with the rota or the answer. Never
23
+ mention the check's script, a JSON file, this skill's name or a path inside its folder.
24
+ Say "checked: every shift covered, no rest or hours rule broken", not what ran. A passing
25
+ check is the floor, not the reply.
26
+ - **Their file comes back in exactly its own shape.** A file the person gave returns with the
27
+ same columns, column order, headers and row order, and only the cells that must change
28
+ changed, ready to post or import. Every change is listed in the reply: the row, what
29
+ changed and why. Add a change column only when they ask for one. Given a pasted table,
30
+ reply with a table. Write every deliverable the request names, such as a sheet per team.
31
+ - **The reply's facts come from the checked rota.** Every hour count, night count, run of
32
+ days and change you write is read from the check's per-person summary and its comparison
33
+ with their original, run on the final rota. Never from memory of an earlier draft.
34
+ - **Working files stay out of sight.** The check's input and any intermediate file go in a
35
+ temporary folder outside the working directory, or are deleted before you reply. Draw the
36
+ week grid only when a drawing is asked for, or as the one extra file named in one line.
37
+ Never leave anything running in the background; wait for it.
38
+ - **Carry every field through.** Every column or note the person gave about a person or a
39
+ shift appears in the deliverable, and each conflict between them is flagged.
40
+ - **Soft notes are rules.** "Don't give her more than she needs", "keep him off nights if you
41
+ can": build them in, and say which you couldn't meet.
42
+ - **Fixing their rota means minimal changes.** Change only what breaks a rule, list each
43
+ change with the rule, and keep everything else as they placed it. Read an ambiguous rule
44
+ the way the person most likely meant it, state the reading, and don't reshuffle on an
45
+ unlikely one.
46
+
47
+ 1. **Gather what the rota needs.** Take it from the conversation or the files named: a CSV, a
48
+ spreadsheet export, a table, notes.
49
+ - **Staff:** name, skills or roles, maximum and contracted hours, times they can't work.
50
+ - **Shifts:** day or date, start and end (a shift ending after midnight is fine), and how many
51
+ people of each skill it needs.
52
+ - **Rules:** minimum rest between shifts, most days in a row, most hours in a day.
53
+
54
+ A missing rule becomes a stated assumption with a common default: 11 hours' rest, 6 days in
55
+ a row, 12 hours in a day. Ask at most two questions, and only for staff or shifts that are
56
+ missing altogether.
57
+
58
+ 2. **Write the roster** in the shape of [`templates/roster.json`](templates/roster.json):
59
+ `staff`, `shifts` with `needs` as `{skill: count}`, `assignments` from shift to staff ids,
60
+ and `rules`. Give a person a fixed role on a shift with `{"id": "ben", "as": "till"}`;
61
+ otherwise people are matched to needs, one need each. Save it in a temporary folder, not
62
+ the working directory.
63
+
64
+ 3. **Build one rota, hardest shifts first.** Fill the shifts with the fewest qualified people
65
+ first: nights, keyholder shifts, weekends. Then fill the rest from whoever has the most
66
+ hours left before their contracted total. Spread nights and weekends evenly across the
67
+ people who can work them, and keep a person's shifts in a block, not scattered. Fixing
68
+ their rota, start from theirs and change only what the check reports.
69
+
70
+ 4. **Check it, and fix every failure before showing anything.**
71
+
72
+ ```bash
73
+ # Claude Code
74
+ python3 "${CLAUDE_SKILL_DIR}/scripts/roster_check.py" "$TMPDIR/roster.json"
75
+ # Other IDEs (from the skill folder); add --svg only when a drawing is wanted
76
+ python3 scripts/roster_check.py /tmp/rota/roster.json --svg rota-week-of-2026-11-09.svg
77
+ ```
78
+
79
+ Exit 0 means no failures, 1 means a failure, and 2 means the input can't be read. Fix only
80
+ what it reports, and rerun, **at most five rounds**. Never search every arrangement by
81
+ hand. If it still fails after five, go to step 5 with the best rota so far. The check
82
+ fails on:
83
+ - a shift short of a skill it needs;
84
+ - someone on two overlapping shifts, or working while unavailable;
85
+ - someone over their weekly or daily maximum;
86
+ - rest below the minimum, including across midnight and across the weekend;
87
+ - too many days in a row;
88
+ - a role filled by someone without the skill.
89
+
90
+ It warns on hours far from contracted, uneven nights or weekends, and a short shift that
91
+ qualified people are free to take (it names them). A warning can stand only with a reason.
92
+ On the final rota, run it once more with `--summary`, and with `--compare original.json`
93
+ when fixing theirs. The reply quotes those two outputs.
94
+ A drawing, when wanted, goes in the working directory under a plain name, never inside
95
+ this skill's folder.
96
+
97
+ 5. **When no rota passes, deliver the best one, say why, and the smallest change that would fix it.** Name the
98
+ constraint: ✅ *"Tuesday night needs two people with stock, and only Chloe and Dev have it;
99
+ Dev is on Tuesday's late shift, so his rest would be 6 hours. One more person trained on
100
+ stock, or moving Tuesday's late shift to Wednesday, fixes it."* — ❌ a rota with Dev on
101
+ both, unflagged. Offer the closest rota only clearly labelled with the one rule it breaks.
102
+
103
+ 6. **Reply in this order:**
104
+ 1. **The rota,** as a table: days across and people down (or shifts down for a big team),
105
+ each cell the shift's times and role.
106
+ 2. **One line on the check:** every shift covered, and no rest, hours, availability or
107
+ days-in-a-row rule broken. Or the failures, one line each.
108
+ 3. **Shifts it couldn't fill,** with why and who could take them.
109
+ 4. **Hours per person** against contracted, from the summary, and anything uneven, with the reason.
110
+ Fixing theirs: **the changes**, one line each (row, what changed, why), from the comparison.
111
+ 5. **The rules assumed,** each with its value, for the manager to change.
112
+ 6. **The files:** the rota in the person's format, and the drawing if one was made.
113
+
114
+ **Non-interactive runs** (subagent, CI, headless): missing rules become `[assumption]`
115
+ lines with the defaults above, and a person with no stated maximum gets no weekly cap but is
116
+ flagged in the reply. With no staff or no shifts at all, emit
117
+ `BLOCKED: need the staff (with skills and availability) and the shifts to cover`.
118
+
119
+ ## Useful references in this skill
120
+
121
+ - [`templates/roster.json`](templates/roster.json) — the input shape: four staff, three shifts including one overnight, an absence and a fixed role
122
+ - [`scripts/roster_check.py`](scripts/roster_check.py) — cover by skill, overlaps, availability, weekly and daily hours, rest across midnight, days in a row, fairness; `--summary` per person and per shift, `--compare` against their original; draws the week grid
123
+ - [`examples/cafe-week.md`](examples/cafe-week.md) — worked example: a café week where the first draft gave a closer an 8-hour turnaround, and the rota that fixed it
124
+
125
+ ## Quality bar
126
+
127
+ - **The check passes before the rota is shown,** or the reply names the shift that can't be covered and the constraint in the way.
128
+ - **Every shift has the skills it needs,** each person filling one need.
129
+ - **No one is short of rest, over their hours, on while unavailable or past their days in a row.**
130
+ - **Nights and weekends are spread across the people who can work them,** or the reply says why not.
131
+ - **The reply leads with the rota as a table,** in plain words, with no mention of scripts, files inside the skill or the skill itself.
132
+ - **Every assumed rule is stated with its value.**
133
+ - **Their file comes back in its exact columns and row order,** with every change listed in the reply, not in the file.
134
+ - **Every number and change in the reply matches the checked rota,** read from the summary and the comparison.
135
+ - **Their notes are honoured,** and their own rota changes only where a rule forces it.
136
+ - **No working file is left in their folder,** and nothing is left running.
137
+
138
+ ## When to use this skill
139
+
140
+ - ✅ Next week's or fortnight's rota from availability and shift needs
141
+ - ✅ Checking a rota someone drew in a spreadsheet before it's published
142
+ - ✅ Re-planning after a sickness, a swap request or a new starter
143
+ - ✅ "Can we cover the weekend with the people we have?"
144
+
145
+ ## When NOT to use this skill
146
+
147
+ - ❌ Working out how many staff a site needs from footfall or demand: that's a forecast, done before the rota
148
+ - ❌ Payroll, overtime pay or holiday accrual calculations
149
+ - ❌ Employment-law advice: the check applies the rules it's given, and doesn't decide what the law requires
150
+ - ❌ Project task scheduling across weeks, where people aren't on shifts
151
+
152
+ ## Anti-patterns to avoid
153
+
154
+ - ❌ **A rota with a closer back on the opening shift.** 22:00 to 06:30 is eight and a half hours. The check catches it; eyeballing a grid doesn't.
155
+ - ❌ **Counting heads instead of skills.** Three people on a shift that needs a keyholder is short if none of them holds keys.
156
+ - ❌ **Filling the easy shifts first.** The night and the keyholder shifts are the ones that run out of people.
157
+ - ❌ **Giving the same two people every weekend** because they said yes last time.
158
+ - ❌ **Bending a rule and not saying so.** A rota that breaks rest "just this once" is the one that gets challenged.
159
+ - ❌ **A rota in a new format the manager has to copy back.** They gave a CSV; they get the CSV, in its own columns.
160
+ - ❌ **An extra "change" column in their file.** It breaks the import they print or upload from; the changes go in the reply.
161
+ - ❌ **Notes written from memory.** "Tom is off Monday" when the rota has him on: read it from the summary.
162
+ - ❌ **Searching every arrangement by hand.** Build one, check, fix what fails, five rounds at most.
163
+ - ❌ **Reshuffling their rota** to fix three problems. Fix the three, and list them.
164
+ - ❌ **Ignoring "don't put her on more than she needs".** A note is a rule.
165
+ - ❌ **A JSON file and a drawing nobody asked for** left beside their files.
166
+ - ❌ **"The script says…"** The manager wants the rota and what's wrong with it, not how it was checked.
@@ -0,0 +1,38 @@
1
+ [
2
+ {
3
+ "query": "make next week's rota for the shop, here's who's available",
4
+ "should_trigger": true
5
+ },
6
+ {
7
+ "query": "check this staff rota before I publish it",
8
+ "should_trigger": true
9
+ },
10
+ {
11
+ "query": "who should work which shift this weekend? we need two baristas and a keyholder each day",
12
+ "should_trigger": true
13
+ },
14
+ {
15
+ "query": "fill these night shifts for the warehouse team without breaking the 11-hour rest rule",
16
+ "should_trigger": true
17
+ },
18
+ {
19
+ "query": "build a fortnight schedule for our clinic nurses",
20
+ "should_trigger": true
21
+ },
22
+ {
23
+ "query": "write the weekly status update for the ops team",
24
+ "should_trigger": false
25
+ },
26
+ {
27
+ "query": "model how much our cloud capacity will cost next quarter",
28
+ "should_trigger": false
29
+ },
30
+ {
31
+ "query": "write a job ad for a shift supervisor",
32
+ "should_trigger": false
33
+ },
34
+ {
35
+ "query": "plan the sprint and assign stories to engineers",
36
+ "should_trigger": false
37
+ }
38
+ ]
@@ -0,0 +1,135 @@
1
+ {
2
+ "skill_name": "shift-roster",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "Can you make next week's rota for the ward? Staff and their limits are in staff.csv and the shifts we need covered are in shifts.csv. Use our usual rule of at least 11 hours between shifts.",
7
+ "assertions": [
8
+ "Leads with the rota as a readable table of days and people (or shifts), not with a description of how it was made",
9
+ "Every Day and Evening shift on all seven days has one nurse and one healthcare assistant, or the reply names the shift it couldn't cover and why",
10
+ "Nobody is rostered on a day they can't work (Kwame at weekends, Lin on Monday, Owen on Thursday, Sofia on Wednesday, Priti on Friday evening)",
11
+ "No one gets less than 11 hours between an Evening shift ending at 22:00 and a Day shift starting at 07:30 the next morning",
12
+ "Nobody is over their maximum hours, and hours per person are shown against contracted hours",
13
+ "States any rule it assumed that the request didn't give, such as the days-in-a-row limit, with its value",
14
+ "Saves the week drawing in the working directory, not inside the skill's folder",
15
+ "Does not mention a script, a JSON file or the skill's name in the reply"
16
+ ]
17
+ },
18
+ {
19
+ "id": 2,
20
+ "prompt": "Here's this week's pharmacy rota (rota.csv) and the team (staff.csv). Before I send it out, can you check it? Don't change it, just tell me what's wrong.",
21
+ "assertions": [
22
+ "Flags every short rest, 8 hours each: Priya Shah from Tuesday's late to Wednesday's early and from Thursday's late to Friday's early, and Tom Okafor from Wednesday's late to Thursday's early",
23
+ "Flags Tom Okafor on two overlapping Thursday shifts (Early 06:00-14:00 and Mid 10:00-18:00), and 40 hours against his 30-hour maximum",
24
+ "Flags Sam Reid filling the pharmacist role on Friday's early shift without being a pharmacist, leaving the shift without one",
25
+ "Gives each problem one line with a suggested fix, such as Nadia Haddad, who is free, taking Friday's early pharmacist shift",
26
+ "Does not rewrite or return a changed rota, since the person asked only for a check",
27
+ "Does not invent rules, staff or shifts that aren't in the files",
28
+ "Does not mention a script, a JSON file or the skill's name in the reply"
29
+ ]
30
+ },
31
+ {
32
+ "id": 3,
33
+ "prompt": "Rota the night team for next week from team.md. Non-interactive, no follow-up questions.",
34
+ "assertions": [
35
+ "Works out that two forklift drivers on five nights is 80 forklift hours, and Gus (40) and Hana (32) can give only 72",
36
+ "Says plainly that the week can't be fully covered with the forklift need, rather than publishing a rota that breaks a rule",
37
+ "Names the smallest change that would fix it, such as one more forklift-trained person or one night with a single driver agreed",
38
+ "Covers every picker need on all five nights",
39
+ "Gives the closest rota only if it is clearly marked with the one night that is short",
40
+ "Keeps everyone within 5 nights in a row and their maximum hours",
41
+ "Does not invent extra staff or change anyone's maximum hours"
42
+ ]
43
+ },
44
+ {
45
+ "id": 4,
46
+ "held_out": "2026-11-06",
47
+ "prompt": "Can you do next week's rota for the restaurant? Week of Mon 16 Nov. Availability export from the staff app is availability_export_wk47.csv (22 of us) and my notes, rules and the stuff carried over from last week are in rota_notes.txt. Shifts I need covering:\n\nShift | Times | Mon | Tue | Wed | Thu | Fri | Sat | Sun\nAM Kitchen | 08:00-16:00 | 2 | 2 | 2 | 2 | 2 | 2 | 2\nPM Kitchen | 15:00-23:00 | 2 | 2 | 2 | 2 | 3 | 3 | 3\nAM Floor | 10:00-16:00 | 2 | 2 | 2 | 2 | 3 | 3 | 3\nPM Floor | 16:00-23:30 | 3 | 3 | 3 | 3 | 4 | 4 | 4\nBar | 17:00-00:00 | 1 | 1 | 1 | 1 | 2 | 2 | 1\n\nNeed it by tonight so I can post it, I'm on the pass all afternoon so won't be checking messages.",
48
+ "assertions": [
49
+ "Builds the rota, runs the roster check script on it, and presents a rota only after a run with no failures",
50
+ "Fills all 35 shifts at the headcounts in the table (81 person-shifts in total), with only chefs in the kitchen shifts and only bar-trained staff (Rory Byrne, Mei Tan, Priya Nair, Alex Duarte, Grace Holloway) on the bar",
51
+ "Has a keyholder on every 08:00 AM Kitchen and every Bar shift: Marta Kowalczyk opens Monday (Joel Adeyemi would be on his 6th day in a row), Joel opens Saturday and Sunday (Marta is on holiday), Rory closes Monday and Tuesday (Grace unavailable) and Grace closes Wednesday (Rory unavailable); Dani Okafor is never put on the bar",
52
+ "Applies last week's carry-over: Joel and Imani Clarke are not rostered on Monday (it would be a 6th consecutive day), and neither Priya (closed the bar at midnight Sunday, 10 h rest) nor Luca Ferri (PM Floor to 23:30 Sunday, 10.5 h rest) is on Monday's 10:00 AM Floor",
53
+ "Leaves nobody with less than 11 hours between shifts within the week: no PM Floor (ends 23:30) or Bar (ends 00:00) followed by a next-day AM Floor (10:00), and no PM Kitchen (ends 23:00) followed by a next-day AM Kitchen (08:00)",
54
+ "Keeps everyone within their max hours, one shift a day, and no more than 5 days in a row, and never on a day marked Unavailable, Holiday or outside an AM-only / PM-only limit; Ellis Grant (17) gets only AM Floor shifts and at most two of them (16 h max), and Sana Iqbal at most two (16 h max)",
55
+ "Shows the result as a week grid (people or shifts by day, Mon 16 to Sun 22) with each person's weekly hours",
56
+ "Does not invent staff, agency cover, extra shifts or rules that are not in the export, the notes or the prompt"
57
+ ]
58
+ },
59
+ {
60
+ "id": 5,
61
+ "held_out": "2026-11-06",
62
+ "prompt": "Can you check my rota for the 16th to the 29th before I send it out? It's rota_draft_16-29nov.csv (saved from my spreadsheet) and staff_list.csv has everyone's licences, contracts and leave. Rules: at least 11 hours between shifts, max 6 days in a row, nobody over their contracted hours in a week (weeks are Mon-Sun), 48 max by law. Every Early and every Late needs at least one FLT driver and one first aider on it, and so does the Sunday Early - the Saturday Mid doesn't need either. Headcounts are weekday Early 5, Late 4, Saturday Early 3 and Mid 2, Sunday Early 3. Everyone was off on Sunday the 15th for stocktake. Fix whatever you can and tell me what you can't.",
63
+ "assertions": [
64
+ "Runs the roster check script on the draft as supplied and reports what it fails before changing anything",
65
+ "Finds Owen Price double-booked on Sat 21/11, on both the Early (06:00-14:00) and the Mid (10:00-18:00)",
66
+ "Finds Ben Ashworth on the Late on Tue 24/11 (ends 22:00) and the Early on Wed 25/11 (starts 06:00): 8 hours' rest against the 11-hour rule",
67
+ "Finds Yasmin Khoury on 32 hours in week 2 (Mon 23 Early, Tue 24 Late, Wed 25 Late, Fri 27 Early) against her 24-hour contract",
68
+ "Says the Sun 29/11 Early has no FLT driver and none can be rostered: all four licence holders are out (Wojciech Nowak and Callum Reid on holiday, Abena Mensah does no Sundays, Delphine Moreau at a wedding); it leaves this as an open gap for the manager to decide (for example outside cover or moving the work) rather than rostering a licence holder who is on leave or calling it fixed",
69
+ "Does not flag correct entries as errors: Megan Doyle's six days in a row (Thu 19 to Tue 24) are within the limit, Late Friday into Mid Saturday (12 hours, Megan on 20-21/11 and Harpreet Gill on 27-28/11) is legal, and people at exactly their contracted hours are not over",
70
+ "Fixes the three fixable problems with named replacements who are available, keep each shift's headcount and FLT/first-aid cover, and break no other rule, then re-runs the check so only the Sunday 29 FLT gap remains",
71
+ "Does not invent staff, agency workers, licences or leave that are not in the two files"
72
+ ]
73
+ },
74
+ {
75
+ "id": 6,
76
+ "held_out": "2026-11-07",
77
+ "prompt": "I run the claims helpline at Quillmoor Mutual and need the rota for the fortnight Mon 16 to Sun 29 Nov. The staff list is our PeopleHub export (peoplehub_staff_export.csv), availability is everything people have sent me (availability_notes.txt), and the shifts with what each one needs are in rota_template.csv. Rules: at least 11 hours between one shift ending and the next starting, nobody more than 5 days in a row, nobody over their contracted hours in a Mon-Sun week (no overtime budget this month), and one shift a day. Bethan, Tom and Lewis all worked Sat 14 and Sun 15 Nov (they were off Fri 13th), so count those days. Send me back the sheet filled in, plus a grid for each week with one row per person and their hours, that I can pin up in the office.",
78
+ "assertions": [
79
+ "Fills all 24 shifts in rota_template.csv to the headcount asked (3 on each weekday Early and Late, 2 on each Saturday and Sunday, 68 places in all), and every shift has at least one team leader on it (Bethan Morgan, Dariusz Kowal or Amara Osei)",
80
+ "Every weekday Late and both Saturday shifts have at least one Welsh speaker (Bethan Morgan, Rhys Llewellyn or Catrin Hughes)",
81
+ "Keeps to the availability notes: Jade Whitlock only on Earlies or Sundays, Catrin Hughes never on a Tuesday or Thursday, Lewis Grant only on Friday Lates and weekends, Megan Doyle not on 25-27 Nov, Kwame Mensah never on a Sunday, Priya Nair not on a Monday Late, Rhys Llewellyn not on the Wed 18 Nov Early, Sofia Marchetti not on Fri 20 Nov, Amara Osei never on a Wednesday, and Dariusz Kowal never on a Wednesday Late",
82
+ "Nobody does a Late (ends 21:30) followed by the next day's Early (starts 07:30), which would leave only 10 hours' rest, and nobody has two shifts on one day",
83
+ "Nobody goes over their contracted hours in either Mon-Sun week (for example Amara Osei, Catrin Hughes and Jade Whitlock 24h at most, Lewis Grant 16h at most, Priya Nair 32h at most), and the weekly hours on the grid match the shifts given",
84
+ "Nobody works more than 5 days in a row, counting 14-15 Nov for Bethan Morgan, Tom Ashdown and Lewis Grant (so none of them works every day from Mon 16 to Thu 19 Nov) and counting across the weekend between the two weeks",
85
+ "Returns rota_template.csv filled in with its columns unchanged, plus a grid for each week with one row per person and their weekly hours",
86
+ "Does not roster Gareth Penry, who is a Welsh-speaking team leader but is marked as a Leaver (31/10/2026) in the export, and does not invent staff, agency cover or overtime that is not in the input"
87
+ ]
88
+ },
89
+ {
90
+ "id": 7,
91
+ "held_out": "2026-11-07",
92
+ "prompt": "Here's next week's rota for Harbourside clinic (w/c 30 Nov), rota_wc_30nov.csv, straight out of our rota tool, with the staff list and my leave notes. Can you check it before I send it out? Rules: 11 hours off between shifts, no more than 5 days in a row, nobody over their contracted hours, nobody in two places at once, and Saturday minor injuries must have a prescriber on. Fix what you can and send me back the sheet in the same format, plus a list of who I need to tell about a change. If something can't be fixed, tell me straight.",
93
+ "assertions": [
94
+ "Flags that Ola Adebayo is down for both the Wed 2 Dec Early HCA shift (07:30-15:30) and the Wed phlebotomy clinic (08:00-12:00), and fixes it by giving the clinic to someone with phlebotomy who is free that morning (Nadia Fern, who does only the phlebotomy clinic and has hours to spare, fits)",
95
+ "Flags that Gwen Pryce has the Thu 3 Dec Late (ends 21:00) and then the Fri 4 Dec Early (starts 07:30), only 10.5 hours' rest, and fixes it without creating a new breach (for example Joel Ambrose or Lena Varga takes the Thursday Late, or Gwen and Marek Novak swap Friday shifts)",
96
+ "Flags that Hannah Brook is rostered 32 hours (Early Reception Mon to Thu) on a 24-hour contract, and moves one of those shifts to a receptionist who has spare hours and enough rest (Callum Reid on Thursday or Priti Desai on Monday or Tuesday work; Priti on Thursday does not, as she is on the Wednesday Late)",
97
+ "Flags that the Sat 5 Dec Minor Injuries prescriber slot has Fran Teale, who is not a prescriber, and says it cannot be filled from this staff list: the only prescribers are Joel Ambrose (Mon-Fri contract) and Lena Varga (on leave 4-6 Dec). It is left as a gap for the manager to decide on, not shown as fixed",
98
+ "Raises no false alarms: Gwen Pryce's five days in a row at exactly 40 hours, Aisha Rahman's Thursday Late followed by the Friday 08:00 phlebotomy clinic (exactly 11 hours), and Marek Novak's Friday Late followed by Saturday are all reported as fine or not raised",
99
+ "Returns rota_wc_30nov.csv in the same columns with only the rows that need to change altered and the changes marked, plus a list of who to tell, covering each person whose shifts changed",
100
+ "The returned rota, checked again, has no double-bookings, no rest gaps under 11 hours, nobody over contract and nobody past 5 days in a row, and the Saturday prescriber gap is the only problem left",
101
+ "Does not invent a bank or locum prescriber, or any member of staff who is not in staff_list.csv"
102
+ ]
103
+ },
104
+ {
105
+ "id": 8,
106
+ "held_out": "2026-11-07",
107
+ "prompt": "I run Brackenmoor Leisure Centre and I need the staff rota for the fortnight Mon 23 Nov to Sun 6 Dec 2026. Attached: staff_export.csv (everyone, contracted hours and current quals, from the HR system), availability_form_responses.csv (what people put on the availability form) and cover_requirements.csv (how many people each area needs on each shift and what they must hold). Rules: nobody goes over their contracted hours in either week (Mon-Sun) - there's no overtime budget, count the full shift length; one shift per person per day; at least 11 hours off between one shift ending and the next starting; no more than 6 days in a row. Please build the full two weeks and lay it out so I can pin it up in the staff room.",
108
+ "assertions": [
109
+ "Fills all 170 shift places implied by cover_requirements.csv for the fortnight (e.g. 3 lifeguards on every weekday early and late, 4 on every weekend AM and PM, 3 swim teachers on both Saturdays) with no place left empty",
110
+ "Every duty manager shift goes to one of the five staff holding the Duty Manager qualification (Fenella Orchard, Kwame Asante-Byrne, Marisol Penhale, Rhiannon Tull, Tadeusz Wren), every pool lifeguard place to an NPLQ holder, and every swim-lesson place to a Swim Teacher L2 holder",
111
+ "Nobody exceeds their contracted hours in either week: for example, the 16-hour casual lifeguards (Rory Venn, Theo Blackwood, Owen Garside) and Ifeoma Barrett (10 hours) stay at or under their totals",
112
+ "Nobody works a weekday Late lifeguard shift (ends 22:15) followed by a weekday Early (starts 06:00 or 06:15) the next day, and nobody goes from a Friday late (ends 22:00 or 22:15) to a Saturday AM shift (at most 9.75 hours' rest), since both break the 11-hour rest rule",
113
+ "Respects the availability form: no Rhiannon Tull shifts 30 Nov - 2 Dec, no Callum Feeney shifts 4 - 6 Dec, no weekday shifts starting before 15:00 for the casual lifeguards, Nikhil Rao only on Tuesdays, Thursdays and Saturdays, and no Sunday shifts for Fenella Orchard or Siobhan Daley",
114
+ "Nobody is given two shifts on the same day or more than 6 consecutive days",
115
+ "Presents the result as a week-by-week grid (one for each week) of staff against days that can be pinned up, and reports a check of the finished rota against the rules rather than just asserting it is fine",
116
+ "Does not invent staff, agency or relief workers not in staff_export.csv, and does not give anyone a qualification they do not hold in the export"
117
+ ]
118
+ },
119
+ {
120
+ "id": 9,
121
+ "held_out": "2026-11-07",
122
+ "prompt": "I'm the deputy manager at Quillmere House care home. Here's my draft rota for w/c 7 Dec (rota_export_07-13Dec.csv, exported from our rostering system), plus staff_list.csv and leave_and_restrictions.txt. Rules: every shift has a medication-trained senior, nobody over their contracted hours, one shift per person per day, 11 hours off between shifts, max 6 days in a row. Can you check it and fix whatever's wrong, then send the file back in the same layout so I can upload it straight back into the system tonight.",
123
+ "assertions": [
124
+ "Catches that Bronwen Tilsley is booked on both the Tue 08 Dec Early and the Late shift the same day (they overlap 14:00-14:30) and gives one of the two rows to someone else",
125
+ "Catches that Ravi Chaudhry works Fri 11 Dec Late (finishes 21:30) and then Sat 12 Dec Early (starts 07:00) - only 9.5 hours' rest - and fixes it",
126
+ "Catches that the Senior Carer on Thu 10 Dec Late is Bilal Qureshi, a Care Assistant who is not medication trained, and replaces them with a medication-trained senior",
127
+ "Catches that Patrice Delacroix is rostered for 25.5 hours against a 22.5-hour contract and brings them back within it",
128
+ "Flags the Sunday 13 Dec Night senior slot as one that cannot be covered from the staff list: Adaeze Moorcroft is on approved leave, Philippa Strand and Godfrey Achterberg are days only, Rosalind Ebo can't do Sunday nights, Declan Furness is on leave and Yasmin Okonedo-Hart can't do Sundays - and it does not leave Adaeze on it or put a non-medication-trained carer in the senior role",
129
+ "Every replacement it makes is itself legal: qualified, available per leave_and_restrictions.txt, within contracted hours, with 11 hours' rest either side and no second shift that day",
130
+ "Returns the rota in the same columns and row layout as rota_export_07-13Dec.csv (Date, Day, Shift, Start, End, Role, Staff ID, Staff Name), changing only the rows that needed fixing and listing each change",
131
+ "Does not invent agency or bank staff, names or staff IDs that are not in staff_list.csv to fill the Sunday night gap"
132
+ ]
133
+ }
134
+ ]
135
+ }
@@ -0,0 +1,3 @@
1
+ shift,days,start,end,needs
2
+ Day,Mon-Sun,07:30,15:30,1 nurse + 1 healthcare assistant
3
+ Evening,Mon-Sun,15:00,22:00,1 nurse + 1 healthcare assistant
@@ -0,0 +1,8 @@
1
+ name,role,max_hours,contracted_hours,cannot_work
2
+ Rosa Diaz,nurse,37.5,37.5,
3
+ Kwame Asante,nurse,37.5,30,Sat; Sun
4
+ Lin Chen,nurse,30,22.5,Mon
5
+ Marta Silva,healthcare assistant,37.5,37.5,
6
+ Owen Price,healthcare assistant,24,22.5,Thu
7
+ Priti Nair,nurse; healthcare assistant,37.5,30,Fri night
8
+ Sofia Ruiz,healthcare assistant,30,24,Wed
@@ -0,0 +1,22 @@
1
+ day,shift,start,end,staff,role
2
+ Mon,Early,06:00,14:00,Nadia Haddad,pharmacist
3
+ Mon,Early,06:00,14:00,Tom Okafor,till
4
+ Mon,Late,14:00,22:00,Joel Park,pharmacist
5
+ Mon,Late,14:00,22:00,Priya Shah,dispenser
6
+ Tue,Early,06:00,14:00,Nadia Haddad,pharmacist
7
+ Tue,Early,06:00,14:00,Sam Reid,till
8
+ Tue,Late,14:00,22:00,Joel Park,pharmacist
9
+ Tue,Late,14:00,22:00,Priya Shah,dispenser
10
+ Wed,Early,06:00,14:00,Nadia Haddad,pharmacist
11
+ Wed,Early,06:00,14:00,Priya Shah,dispenser
12
+ Wed,Late,14:00,22:00,Joel Park,pharmacist
13
+ Wed,Late,14:00,22:00,Tom Okafor,till
14
+ Thu,Early,06:00,14:00,Nadia Haddad,pharmacist
15
+ Thu,Early,06:00,14:00,Tom Okafor,till
16
+ Thu,Mid,10:00,18:00,Tom Okafor,till
17
+ Thu,Late,14:00,22:00,Joel Park,pharmacist
18
+ Thu,Late,14:00,22:00,Priya Shah,dispenser
19
+ Fri,Early,06:00,14:00,Sam Reid,pharmacist
20
+ Fri,Early,06:00,14:00,Priya Shah,dispenser
21
+ Fri,Late,14:00,22:00,Joel Park,pharmacist
22
+ Fri,Late,14:00,22:00,Tom Okafor,till
@@ -0,0 +1,6 @@
1
+ name,skills,max_hours_per_week
2
+ Priya Shah,dispenser; till,40
3
+ Tom Okafor,till,30
4
+ Sam Reid,till,25
5
+ Nadia Haddad,pharmacist; dispenser,40
6
+ Joel Park,pharmacist,40
@@ -0,0 +1,14 @@
1
+ # Night team, Crossway distribution centre
2
+
3
+ Nights run Monday to Friday, 22:00 to 06:00. Every night needs two forklift drivers and three pickers.
4
+
5
+ | Name | Can do | Max hours a week |
6
+ |---|---|---|
7
+ | Gus Moreno | forklift, picking | 40 |
8
+ | Hana Ito | forklift, picking | 32 |
9
+ | Ivo Petrov | picking | 40 |
10
+ | Jade Brooks | picking | 40 |
11
+ | Kofi Mensah | picking | 40 |
12
+ | Lara Novak | picking | 24 |
13
+
14
+ Rules: 11 hours between shifts, no more than 5 nights in a row.
@@ -0,0 +1,23 @@
1
+ Employee,Position,Keyholder,Max hrs/wk,Mon 16/11,Tue 17/11,Wed 18/11,Thu 19/11,Fri 20/11,Sat 21/11,Sun 22/11,Comments
2
+ Marta Kowalczyk,Chef,Y,40,Available,Available,Available,Available,Available,Holiday,Holiday,Hol Sat-Sun approved
3
+ Joel Adeyemi,Chef,Y,40,Available,Available,Available,Available,Available,Available,Available,
4
+ Ravi Pillai,Chef,N,40,Available,Available,Available,Available,Available,Available,Available,
5
+ Siobhan Clery,Chef,N,32,AM only,Available,Available,Available,Unavailable,Available,Available,
6
+ Tomas Herrera,Chef,N,40,Available,Available,Available,Available,Available,Available,Available,
7
+ Hannah Voss,Chef,N,24,Available,Available,Available,Holiday,Holiday,Available,Available,
8
+ Kenji Mori,Chef,N,32,Available,PM only,Available,Available,Available,Unavailable,Available,
9
+ Bea Lindgren,Chef,N,16,Unavailable,Unavailable,Unavailable,Unavailable,Unavailable,Available,Available,"weekends only, uni"
10
+ Priya Nair,Server / Bar,N,32,Available,Available,Available,Available,PM only,Available,Available,
11
+ Dani Okafor,Server,Y,40,Available,Available,Available,Available,Available,Available,Available,Floor supervisor
12
+ Ellis Grant,Server,N,16,Unavailable,Unavailable,Unavailable,Unavailable,PM only,Available,Available,Age 17
13
+ Sana Iqbal,Server,N,16,AM only,Unavailable,AM only,Unavailable,AM only,Unavailable,Unavailable,school hours only
14
+ Luca Ferri,Server,N,40,Available,Unavailable,Available,Available,Available,Available,Available,
15
+ Ffion Rhys,Server,N,32,Unavailable,Available,Available,Available,Available,Available,AM only,
16
+ Max Albrecht,Server,N,24,Unavailable,PM only,Unavailable,PM only,Available,Available,Unavailable,
17
+ Zoe Achebe,Server,N,30,Available,Available,Unavailable,AM only,Available,Available,Available,
18
+ Oskar Nilsen,Server,N,20,PM only,PM only,Unavailable,PM only,Available,Unavailable,Unavailable,
19
+ Imani Clarke,Server,N,40,Available,Available,Available,Available,Available,PM only,Available,
20
+ Rory Byrne,Bartender,Y,40,Available,Available,Unavailable,Available,Available,Available,Available,
21
+ Mei Tan,Bartender,N,32,Unavailable,Unavailable,Available,Available,Available,Available,Available,
22
+ Alex Duarte,Server / Bar,N,24,Available,Available,Available,Unavailable,Available,Available,Available,
23
+ Grace Holloway,Server / Bar,Y,45,Unavailable,Unavailable,Available,Available,Available,Available,Available,GM
@@ -0,0 +1,20 @@
1
+ rota notes - wk47 (16-22 nov)
2
+
3
+ rules as always:
4
+ - 11 hrs off minimum between finishing one shift and starting the next. this includes last sunday!
5
+ - nobody does more than 5 days in a row (counting last week too)
6
+ - nobody over the max hrs in the export. hours = shift length, we dont take breaks off
7
+ - one shift per person per day
8
+ - Ellis is 17 so nothing that finishes after 22:00 (law)
9
+ - need a keyholder on the 08:00 kitchen shift to open up, and a keyholder on the bar to lock up at midnight.
10
+ keyholders are in the export. Dani is a keyholder but isnt bar trained so cant do the bar.
11
+ - chefs only in the kitchen, bar only bar trained people. servers on floor. Server/Bar people can do either.
12
+
13
+ from last week (wk46) - things that carry over:
14
+ - Joel did Wed Thu Fri Sat Sun last week (PM kitchen sun, finished 23:00)
15
+ - Imani did Wed-Sun last week too, AM floor sun (done 16:00)
16
+ - Luca did thu-sun, PM floor sun till 23:30
17
+ - Priya + Rory closed the bar sun night (midnight). Priya did fri sat sun.
18
+ - Rory did sat + sun only
19
+
20
+ dont put grace on more than she needs, she has the ops review thurs (shes marked available tho)
@@ -0,0 +1,107 @@
1
+ Week,Date,Day,Shift,Start,Finish,Staff
2
+ Wk 1,16/11/2026,Mon,Early,06:00,14:00,Wojciech Nowak
3
+ Wk 1,16/11/2026,Mon,Early,06:00,14:00,Callum Reid
4
+ Wk 1,16/11/2026,Mon,Early,06:00,14:00,Harpreet Gill
5
+ Wk 1,16/11/2026,Mon,Early,06:00,14:00,Tariq Haddad
6
+ Wk 1,16/11/2026,Mon,Early,06:00,14:00,Stefan Ilic
7
+ Wk 1,16/11/2026,Mon,Late,14:00,22:00,Abena Mensah
8
+ Wk 1,16/11/2026,Mon,Late,14:00,22:00,Ben Ashworth
9
+ Wk 1,16/11/2026,Mon,Late,14:00,22:00,Kwame Asante
10
+ Wk 1,16/11/2026,Mon,Late,14:00,22:00,Jonah Feld
11
+ Wk 1,17/11/2026,Tue,Early,06:00,14:00,Callum Reid
12
+ Wk 1,17/11/2026,Tue,Early,06:00,14:00,Delphine Moreau
13
+ Wk 1,17/11/2026,Tue,Early,06:00,14:00,Harpreet Gill
14
+ Wk 1,17/11/2026,Tue,Early,06:00,14:00,Tariq Haddad
15
+ Wk 1,17/11/2026,Tue,Early,06:00,14:00,Stefan Ilic
16
+ Wk 1,17/11/2026,Tue,Late,14:00,22:00,Wojciech Nowak
17
+ Wk 1,17/11/2026,Tue,Late,14:00,22:00,Ben Ashworth
18
+ Wk 1,17/11/2026,Tue,Late,14:00,22:00,Nadia Petrova
19
+ Wk 1,17/11/2026,Tue,Late,14:00,22:00,Jonah Feld
20
+ Wk 1,18/11/2026,Wed,Early,06:00,14:00,Abena Mensah
21
+ Wk 1,18/11/2026,Wed,Early,06:00,14:00,Tariq Haddad
22
+ Wk 1,18/11/2026,Wed,Early,06:00,14:00,Stefan Ilic
23
+ Wk 1,18/11/2026,Wed,Early,06:00,14:00,Yasmin Khoury
24
+ Wk 1,18/11/2026,Wed,Early,06:00,14:00,Kwame Asante
25
+ Wk 1,18/11/2026,Wed,Late,14:00,22:00,Wojciech Nowak
26
+ Wk 1,18/11/2026,Wed,Late,14:00,22:00,Owen Price
27
+ Wk 1,18/11/2026,Wed,Late,14:00,22:00,Ben Ashworth
28
+ Wk 1,18/11/2026,Wed,Late,14:00,22:00,Jonah Feld
29
+ Wk 1,19/11/2026,Thu,Early,06:00,14:00,Delphine Moreau
30
+ Wk 1,19/11/2026,Thu,Early,06:00,14:00,Harpreet Gill
31
+ Wk 1,19/11/2026,Thu,Early,06:00,14:00,Tariq Haddad
32
+ Wk 1,19/11/2026,Thu,Early,06:00,14:00,Stefan Ilic
33
+ Wk 1,19/11/2026,Thu,Early,06:00,14:00,Kwame Asante
34
+ Wk 1,19/11/2026,Thu,Late,14:00,22:00,Wojciech Nowak
35
+ Wk 1,19/11/2026,Thu,Late,14:00,22:00,Abena Mensah
36
+ Wk 1,19/11/2026,Thu,Late,14:00,22:00,Megan Doyle
37
+ Wk 1,19/11/2026,Thu,Late,14:00,22:00,Jonah Feld
38
+ Wk 1,20/11/2026,Fri,Early,06:00,14:00,Delphine Moreau
39
+ Wk 1,20/11/2026,Fri,Early,06:00,14:00,Owen Price
40
+ Wk 1,20/11/2026,Fri,Early,06:00,14:00,Lucia Romano
41
+ Wk 1,20/11/2026,Fri,Early,06:00,14:00,Stefan Ilic
42
+ Wk 1,20/11/2026,Fri,Early,06:00,14:00,Ben Ashworth
43
+ Wk 1,20/11/2026,Fri,Late,14:00,22:00,Callum Reid
44
+ Wk 1,20/11/2026,Fri,Late,14:00,22:00,Harpreet Gill
45
+ Wk 1,20/11/2026,Fri,Late,14:00,22:00,Megan Doyle
46
+ Wk 1,20/11/2026,Fri,Late,14:00,22:00,Jonah Feld
47
+ Wk 1,21/11/2026,Sat,Early,06:00,14:00,Wojciech Nowak
48
+ Wk 1,21/11/2026,Sat,Early,06:00,14:00,Abena Mensah
49
+ Wk 1,21/11/2026,Sat,Early,06:00,14:00,Owen Price
50
+ Wk 1,21/11/2026,Sat,Mid,10:00,18:00,Owen Price
51
+ Wk 1,21/11/2026,Sat,Mid,10:00,18:00,Megan Doyle
52
+ Wk 1,22/11/2026,Sun,Early,08:00,14:00,Delphine Moreau
53
+ Wk 1,22/11/2026,Sun,Early,08:00,14:00,Lucia Romano
54
+ Wk 1,22/11/2026,Sun,Early,08:00,14:00,Megan Doyle
55
+ Wk 2,23/11/2026,Mon,Early,06:00,14:00,Callum Reid
56
+ Wk 2,23/11/2026,Mon,Early,06:00,14:00,Lucia Romano
57
+ Wk 2,23/11/2026,Mon,Early,06:00,14:00,Megan Doyle
58
+ Wk 2,23/11/2026,Mon,Early,06:00,14:00,Yasmin Khoury
59
+ Wk 2,23/11/2026,Mon,Early,06:00,14:00,Ben Ashworth
60
+ Wk 2,23/11/2026,Mon,Late,14:00,22:00,Abena Mensah
61
+ Wk 2,23/11/2026,Mon,Late,14:00,22:00,Owen Price
62
+ Wk 2,23/11/2026,Mon,Late,14:00,22:00,Kwame Asante
63
+ Wk 2,23/11/2026,Mon,Late,14:00,22:00,Jonah Feld
64
+ Wk 2,24/11/2026,Tue,Early,06:00,14:00,Callum Reid
65
+ Wk 2,24/11/2026,Tue,Early,06:00,14:00,Lucia Romano
66
+ Wk 2,24/11/2026,Tue,Early,06:00,14:00,Tariq Haddad
67
+ Wk 2,24/11/2026,Tue,Early,06:00,14:00,Megan Doyle
68
+ Wk 2,24/11/2026,Tue,Early,06:00,14:00,Nadia Petrova
69
+ Wk 2,24/11/2026,Tue,Late,14:00,22:00,Delphine Moreau
70
+ Wk 2,24/11/2026,Tue,Late,14:00,22:00,Owen Price
71
+ Wk 2,24/11/2026,Tue,Late,14:00,22:00,Yasmin Khoury
72
+ Wk 2,24/11/2026,Tue,Late,14:00,22:00,Ben Ashworth
73
+ Wk 2,25/11/2026,Wed,Early,06:00,14:00,Callum Reid
74
+ Wk 2,25/11/2026,Wed,Early,06:00,14:00,Harpreet Gill
75
+ Wk 2,25/11/2026,Wed,Early,06:00,14:00,Stefan Ilic
76
+ Wk 2,25/11/2026,Wed,Early,06:00,14:00,Ben Ashworth
77
+ Wk 2,25/11/2026,Wed,Early,06:00,14:00,Kwame Asante
78
+ Wk 2,25/11/2026,Wed,Late,14:00,22:00,Delphine Moreau
79
+ Wk 2,25/11/2026,Wed,Late,14:00,22:00,Owen Price
80
+ Wk 2,25/11/2026,Wed,Late,14:00,22:00,Yasmin Khoury
81
+ Wk 2,25/11/2026,Wed,Late,14:00,22:00,Jonah Feld
82
+ Wk 2,26/11/2026,Thu,Early,06:00,14:00,Abena Mensah
83
+ Wk 2,26/11/2026,Thu,Early,06:00,14:00,Megan Doyle
84
+ Wk 2,26/11/2026,Thu,Early,06:00,14:00,Ben Ashworth
85
+ Wk 2,26/11/2026,Thu,Early,06:00,14:00,Kwame Asante
86
+ Wk 2,26/11/2026,Thu,Early,06:00,14:00,Rhian Morgan
87
+ Wk 2,26/11/2026,Thu,Late,14:00,22:00,Callum Reid
88
+ Wk 2,26/11/2026,Thu,Late,14:00,22:00,Owen Price
89
+ Wk 2,26/11/2026,Thu,Late,14:00,22:00,Tariq Haddad
90
+ Wk 2,26/11/2026,Thu,Late,14:00,22:00,Stefan Ilic
91
+ Wk 2,27/11/2026,Fri,Early,06:00,14:00,Abena Mensah
92
+ Wk 2,27/11/2026,Fri,Early,06:00,14:00,Lucia Romano
93
+ Wk 2,27/11/2026,Fri,Early,06:00,14:00,Yasmin Khoury
94
+ Wk 2,27/11/2026,Fri,Early,06:00,14:00,Ben Ashworth
95
+ Wk 2,27/11/2026,Fri,Early,06:00,14:00,Nadia Petrova
96
+ Wk 2,27/11/2026,Fri,Late,14:00,22:00,Delphine Moreau
97
+ Wk 2,27/11/2026,Fri,Late,14:00,22:00,Harpreet Gill
98
+ Wk 2,27/11/2026,Fri,Late,14:00,22:00,Megan Doyle
99
+ Wk 2,27/11/2026,Fri,Late,14:00,22:00,Jonah Feld
100
+ Wk 2,28/11/2026,Sat,Early,06:00,14:00,Abena Mensah
101
+ Wk 2,28/11/2026,Sat,Early,06:00,14:00,Owen Price
102
+ Wk 2,28/11/2026,Sat,Early,06:00,14:00,Lucia Romano
103
+ Wk 2,28/11/2026,Sat,Mid,10:00,18:00,Harpreet Gill
104
+ Wk 2,28/11/2026,Sat,Mid,10:00,18:00,Stefan Ilic
105
+ Wk 2,29/11/2026,Sun,Early,08:00,14:00,Harpreet Gill
106
+ Wk 2,29/11/2026,Sun,Early,08:00,14:00,Nadia Petrova
107
+ Wk 2,29/11/2026,Sun,Early,08:00,14:00,Kwame Asante