Skip to content
Choose your marketSelected market: United States

Deloitte Virtual Internship / Task 05

An original Ape Intern practical · Task 05

Operations workbench delivery proposal

Turn the preceding evidence into a scoped, estimated and testable delivery proposal.

Start with the completed outputs, then use the materials to deliver your own work.

Read complete output first

Materials

learner/materials/stakeholder-brief.md Read the full fileDownload file

Workbench stakeholder brief

Operations lead: Start each morning with orders that are already overdue and still undelivered, then inspect the hub and route. Historical late deliveries support the review but should not hide the active queue. Filter by hub, service and cohort, open an order's event timeline, and show the review cutoff and last successful data update.

Hub lead: Do not rank staff or hubs using overall rates with different service mixes. Southbay express has too little data for a stable comparison. A route note is an investigation lead, not proof of an employee's responsibility.

Security lead: Operators may read only their assigned hubs. Exports require supervisor or service permissions, checked on the server for every request together with session validity. Use the existing corporate identity service and do not add a password store. Choosing a hub in the UI does not grant access.

Delivery lead: Phase one is a read-only workbench, order evidence timeline and controlled export design. Refunds, dispatch writes and customer notifications are excluded. Integration depends on client identity, gateway and order interfaces. Estimate effort, define acceptance, failure handling and rollback. No budget, contractual response SLA, concurrency target or launch date has been agreed; list them as decisions to confirm.

learner/checkpoints/security-findings.csv Read the full fileDownload file
request_idatusersessionfindingstatusrowsbytes
Q00582026-09-10T09:41:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00592026-09-10T09:42:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00602026-09-10T09:43:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00612026-09-10T09:44:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00622026-09-10T09:45:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00632026-09-10T09:46:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00692026-09-10T11:15:00Zop-2expired-2expired_or_missing_session2005010000
learner/checkpoints/standardized-comparison.csv Read the full fileDownload file
hubstandardized_late_ratestatus
Eastgate0.49024Comparable
Harbour0.689189Comparable
SouthbayMore data needed
Westhill0.386363Comparable
learner/checkpoints/order-review.csv Read the full fileDownload file
order_idhubserviceroutecreated_atdue_atcohortlate_minutesoverdue_minutes
O0001HarbourstandardR112026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0002HarbourstandardR122026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late500
O0003HarbourstandardR112026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0004HarbourstandardR122026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0005HarbourstandardR112026-09-05T10:00:00Z2026-09-06T10:00:00Zdelivered_late500
O0006HarbourstandardR122026-09-06T11:00:00Z2026-09-07T11:00:00Zon_time00
O0007HarbourstandardR112026-09-07T12:00:00Z2026-09-08T12:00:00Zon_time00
O0008HarbourstandardR122026-09-08T13:00:00Z2026-09-09T13:00:00Zdelivered_late500
O0009HarbourstandardR112026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0010HarbourstandardR122026-09-10T07:00:00Z2026-09-11T07:00:00Zon_time00
O0011HarbourstandardR112026-09-11T08:00:00Z2026-09-12T08:00:00Zdelivered_late500
O0012HarbourstandardR122026-09-12T09:00:00Z2026-09-13T09:00:00Zon_time00
O0013HarbourstandardR112026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0014HarbourstandardR122026-09-01T11:00:00Z2026-09-02T11:00:00Zdelivered_late500
O0015HarbourstandardR112026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0016HarbourstandardR122026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0017HarbourstandardR112026-09-04T06:00:00Z2026-09-05T06:00:00Zdelivered_late500
O0018HarbourstandardR122026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0019HarbourstandardR112026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0020HarbourstandardR122026-09-07T09:00:00Z2026-09-08T09:00:00Zdelivered_late500
O0021HarbourstandardR112026-09-08T10:00:00Z2026-09-09T10:00:00Zon_time00
O0022HarbourstandardR122026-09-09T11:00:00Z2026-09-10T11:00:00Zon_time00
O0023HarbourstandardR112026-09-10T12:00:00Z2026-09-11T12:00:00Zdelivered_late500
O0024HarbourstandardR122026-09-11T13:00:00Z2026-09-12T13:00:00Zon_time00
O0025HarbourstandardR112026-09-12T06:00:00Z2026-09-13T06:00:00Zon_time00
O0026HarbourstandardR122026-09-13T07:00:00Z2026-09-14T07:00:00Zdelivered_late500
O0027HarbourstandardR112026-09-01T08:00:00Z2026-09-02T08:00:00Zon_time00
O0028HarbourstandardR122026-09-02T09:00:00Z2026-09-03T09:00:00Zon_time00
O0029HarbourstandardR112026-09-03T10:00:00Z2026-09-04T10:00:00Zdelivered_late500
O0030HarbourstandardR122026-09-04T11:00:00Z2026-09-05T11:00:00Zcancelled00
O0031HarbourstandardR112026-09-05T12:00:00Z2026-09-06T12:00:00Zon_time00
O0032HarbourstandardR122026-09-06T13:00:00Z2026-09-07T13:00:00Zdelivered_late500
O0033HarbourstandardR112026-09-07T06:00:00Z2026-09-08T06:00:00Zon_time00
O0034HarbourstandardR122026-09-08T07:00:00Z2026-09-09T07:00:00Zon_time00
O0035HarbourstandardR112026-09-09T08:00:00Z2026-09-10T08:00:00Zoverdue_open06720
O0036HarbourstandardR122026-09-10T09:00:00Z2026-09-11T09:00:00Zon_time00
O0037HarbourstandardR112026-09-11T10:00:00Z2026-09-12T10:00:00Zon_time00
O0038HarbourstandardR122026-09-12T11:00:00Z2026-09-13T11:00:00Zdelivered_late500
O0039HarbourstandardR112026-09-13T12:00:00Z2026-09-14T12:00:00Zon_time00
O0040HarbourstandardR122026-09-14T21:00:00Z2026-09-15T21:00:00Znot_mature00
O0041HarbourexpressR112026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0042HarbourexpressR122026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late500
O0043HarbourexpressR112026-09-03T08:00:00Z2026-09-03T16:00:00Zdelivered_late500
O0044HarbourexpressR122026-09-04T09:00:00Z2026-09-04T17:00:00Zdelivered_late500
O0045HarbourexpressR112026-09-05T10:00:00Z2026-09-05T18:00:00Zdelivered_late500
O0046HarbourexpressR122026-09-06T11:00:00Z2026-09-06T19:00:00Zdelivered_late500
O0047HarbourexpressR112026-09-07T12:00:00Z2026-09-07T20:00:00Zdelivered_late500
O0048HarbourexpressR122026-09-08T13:00:00Z2026-09-08T21:00:00Zdelivered_late500
O0049HarbourexpressR112026-09-09T06:00:00Z2026-09-09T14:00:00Zdelivered_late500
O0050HarbourexpressR122026-09-10T07:00:00Z2026-09-10T15:00:00Zdelivered_late500
O0051HarbourexpressR112026-09-11T08:00:00Z2026-09-11T16:00:00Zdelivered_late500
O0052HarbourexpressR122026-09-12T09:00:00Z2026-09-12T17:00:00Zdelivered_late500
O0053HarbourexpressR112026-09-13T10:00:00Z2026-09-13T18:00:00Zdelivered_late500
O0054HarbourexpressR122026-09-01T11:00:00Z2026-09-01T19:00:00Zdelivered_late500
O0055HarbourexpressR112026-09-02T12:00:00Z2026-09-02T20:00:00Zdelivered_late500
O0056HarbourexpressR122026-09-03T13:00:00Z2026-09-03T21:00:00Zdelivered_late500
O0057HarbourexpressR112026-09-04T06:00:00Z2026-09-04T14:00:00Zdelivered_late500
O0058HarbourexpressR122026-09-05T07:00:00Z2026-09-05T15:00:00Zoverdue_open013500
O0059HarbourexpressR112026-09-06T08:00:00Z2026-09-06T16:00:00Zdelivered_late500
O0060HarbourexpressR122026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
O0061EastgatestandardR212026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0062EastgatestandardR222026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late700
O0063EastgatestandardR212026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0064EastgatestandardR222026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0065EastgatestandardR212026-09-05T10:00:00Z2026-09-06T10:00:00Zon_time00
O0066EastgatestandardR222026-09-06T11:00:00Z2026-09-07T11:00:00Zdelivered_late700
O0067EastgatestandardR212026-09-07T12:00:00Z2026-09-08T12:00:00Zon_time00
O0068EastgatestandardR222026-09-08T13:00:00Z2026-09-09T13:00:00Zon_time00
O0069EastgatestandardR212026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0070EastgatestandardR222026-09-10T07:00:00Z2026-09-11T07:00:00Zdelivered_late700
O0071EastgatestandardR212026-09-11T08:00:00Z2026-09-12T08:00:00Zon_time00
O0072EastgatestandardR222026-09-12T09:00:00Z2026-09-13T09:00:00Zon_time00
O0073EastgatestandardR212026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0074EastgatestandardR222026-09-01T11:00:00Z2026-09-02T11:00:00Zdelivered_late700
O0075EastgatestandardR212026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0076EastgatestandardR222026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0077EastgatestandardR212026-09-04T06:00:00Z2026-09-05T06:00:00Zon_time00
O0078EastgatestandardR222026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0079EastgatestandardR212026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0080EastgatestandardR222026-09-14T21:00:00Z2026-09-15T21:00:00Znot_mature00
O0081EastgateexpressR212026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0082EastgateexpressR222026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late700
O0083EastgateexpressR212026-09-03T08:00:00Z2026-09-03T16:00:00Zon_time00
O0084EastgateexpressR222026-09-04T09:00:00Z2026-09-04T17:00:00Zdelivered_late700
O0085EastgateexpressR212026-09-05T10:00:00Z2026-09-05T18:00:00Zdelivered_late700
O0086EastgateexpressR222026-09-06T11:00:00Z2026-09-06T19:00:00Zon_time00
O0087EastgateexpressR212026-09-07T12:00:00Z2026-09-07T20:00:00Zdelivered_late700
O0088EastgateexpressR222026-09-08T13:00:00Z2026-09-08T21:00:00Zdelivered_late700
O0089EastgateexpressR212026-09-09T06:00:00Z2026-09-09T14:00:00Zon_time00
O0090EastgateexpressR222026-09-10T07:00:00Z2026-09-10T15:00:00Zdelivered_late700
O0091EastgateexpressR212026-09-11T08:00:00Z2026-09-11T16:00:00Zdelivered_late700
O0092EastgateexpressR222026-09-12T09:00:00Z2026-09-12T17:00:00Zon_time00
O0093EastgateexpressR212026-09-13T10:00:00Z2026-09-13T18:00:00Zdelivered_late700
O0094EastgateexpressR222026-09-01T11:00:00Z2026-09-01T19:00:00Zdelivered_late700
O0095EastgateexpressR212026-09-02T12:00:00Z2026-09-02T20:00:00Zon_time00
O0096EastgateexpressR222026-09-03T13:00:00Z2026-09-03T21:00:00Zdelivered_late700
O0097EastgateexpressR212026-09-04T06:00:00Z2026-09-04T14:00:00Zdelivered_late700
O0098EastgateexpressR222026-09-05T07:00:00Z2026-09-05T15:00:00Zoverdue_open013500
O0099EastgateexpressR212026-09-06T08:00:00Z2026-09-06T16:00:00Zdelivered_late700
O0100EastgateexpressR222026-09-07T09:00:00Z2026-09-07T17:00:00Zdelivered_late700
O0101EastgateexpressR212026-09-08T10:00:00Z2026-09-08T18:00:00Zon_time00
O0102EastgateexpressR222026-09-09T11:00:00Z2026-09-09T19:00:00Zdelivered_late700
O0103EastgateexpressR212026-09-10T12:00:00Z2026-09-10T20:00:00Zdelivered_late700
O0104EastgateexpressR222026-09-11T13:00:00Z2026-09-11T21:00:00Zon_time00
O0105EastgateexpressR212026-09-12T06:00:00Z2026-09-12T14:00:00Zdelivered_late700
O0106EastgateexpressR222026-09-13T07:00:00Z2026-09-13T15:00:00Zdelivered_late700
O0107EastgateexpressR212026-09-01T08:00:00Z2026-09-01T16:00:00Zon_time00
O0108EastgateexpressR222026-09-02T09:00:00Z2026-09-02T17:00:00Zdelivered_late700
O0109EastgateexpressR212026-09-03T10:00:00Z2026-09-03T18:00:00Zdelivered_late700
O0110EastgateexpressR222026-09-04T11:00:00Z2026-09-04T19:00:00Zcancelled00
O0111EastgateexpressR212026-09-05T12:00:00Z2026-09-05T20:00:00Zdelivered_late700
O0112EastgateexpressR222026-09-06T13:00:00Z2026-09-06T21:00:00Zdelivered_late700
O0113EastgateexpressR212026-09-07T06:00:00Z2026-09-07T14:00:00Zon_time00
O0114EastgateexpressR222026-09-08T07:00:00Z2026-09-08T15:00:00Zdelivered_late700
O0115EastgateexpressR212026-09-09T08:00:00Z2026-09-09T16:00:00Zoverdue_open07680
O0116EastgateexpressR222026-09-10T09:00:00Z2026-09-10T17:00:00Zon_time00
O0117EastgateexpressR212026-09-11T10:00:00Z2026-09-11T18:00:00Zdelivered_late700
O0118EastgateexpressR222026-09-12T11:00:00Z2026-09-12T19:00:00Zdelivered_late700
O0119EastgateexpressR212026-09-13T12:00:00Z2026-09-13T20:00:00Zon_time00
O0120EastgateexpressR222026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
O0121WesthillstandardR312026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0122WesthillstandardR322026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late900
O0123WesthillstandardR312026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0124WesthillstandardR322026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0125WesthillstandardR312026-09-05T10:00:00Z2026-09-06T10:00:00Zon_time00
O0126WesthillstandardR322026-09-06T11:00:00Z2026-09-07T11:00:00Zon_time00
O0127WesthillstandardR312026-09-07T12:00:00Z2026-09-08T12:00:00Zdelivered_late900
O0128WesthillstandardR322026-09-08T13:00:00Z2026-09-09T13:00:00Zon_time00
O0129WesthillstandardR312026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0130WesthillstandardR322026-09-10T07:00:00Z2026-09-11T07:00:00Zon_time00
O0131WesthillstandardR312026-09-11T08:00:00Z2026-09-12T08:00:00Zon_time00
O0132WesthillstandardR322026-09-12T09:00:00Z2026-09-13T09:00:00Zdelivered_late900
O0133WesthillstandardR312026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0134WesthillstandardR322026-09-01T11:00:00Z2026-09-02T11:00:00Zon_time00
O0135WesthillstandardR312026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0136WesthillstandardR322026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0137WesthillstandardR312026-09-04T06:00:00Z2026-09-05T06:00:00Zdelivered_late900
O0138WesthillstandardR322026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0139WesthillstandardR312026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0140WesthillstandardR322026-09-07T09:00:00Z2026-09-08T09:00:00Zon_time00
O0141WesthillstandardR312026-09-08T10:00:00Z2026-09-09T10:00:00Zon_time00
O0142WesthillstandardR322026-09-09T11:00:00Z2026-09-10T11:00:00Zdelivered_late900
O0143WesthillstandardR312026-09-10T12:00:00Z2026-09-11T12:00:00Zon_time00
O0144WesthillstandardR322026-09-11T13:00:00Z2026-09-12T13:00:00Zon_time00
O0145WesthillstandardR312026-09-12T06:00:00Z2026-09-13T06:00:00Zon_time00
O0146WesthillstandardR322026-09-13T07:00:00Z2026-09-14T07:00:00Zon_time00
O0147WesthillstandardR312026-09-01T08:00:00Z2026-09-02T08:00:00Zdelivered_late900
O0148WesthillstandardR322026-09-02T09:00:00Z2026-09-03T09:00:00Zon_time00
O0149WesthillstandardR312026-09-03T10:00:00Z2026-09-04T10:00:00Zon_time00
O0150WesthillstandardR322026-09-04T11:00:00Z2026-09-05T11:00:00Zcancelled00
O0151WesthillstandardR312026-09-05T12:00:00Z2026-09-06T12:00:00Zon_time00
O0152WesthillstandardR322026-09-06T13:00:00Z2026-09-07T13:00:00Zdelivered_late900
O0153WesthillstandardR312026-09-07T06:00:00Z2026-09-08T06:00:00Zon_time00
O0154WesthillstandardR322026-09-08T07:00:00Z2026-09-09T07:00:00Zon_time00
O0155WesthillstandardR312026-09-09T08:00:00Z2026-09-10T08:00:00Zoverdue_open06720
O0156WesthillstandardR322026-09-14T21:00:00Z2026-09-15T21:00:00Znot_mature00
O0157WesthillexpressR312026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0158WesthillexpressR322026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late900
O0159WesthillexpressR312026-09-03T08:00:00Z2026-09-03T16:00:00Zon_time00
O0160WesthillexpressR322026-09-04T09:00:00Z2026-09-04T17:00:00Zon_time00
O0161WesthillexpressR312026-09-05T10:00:00Z2026-09-05T18:00:00Zdelivered_late900
O0162WesthillexpressR322026-09-06T11:00:00Z2026-09-06T19:00:00Zdelivered_late900
O0163WesthillexpressR312026-09-07T12:00:00Z2026-09-07T20:00:00Zon_time00
O0164WesthillexpressR322026-09-08T13:00:00Z2026-09-08T21:00:00Zon_time00
O0165WesthillexpressR312026-09-09T06:00:00Z2026-09-09T14:00:00Zdelivered_late900
O0166WesthillexpressR322026-09-10T07:00:00Z2026-09-10T15:00:00Zdelivered_late900
O0167WesthillexpressR312026-09-11T08:00:00Z2026-09-11T16:00:00Zon_time00
O0168WesthillexpressR322026-09-12T09:00:00Z2026-09-12T17:00:00Zon_time00
O0169WesthillexpressR312026-09-13T10:00:00Z2026-09-13T18:00:00Zdelivered_late900
O0170WesthillexpressR322026-09-01T11:00:00Z2026-09-01T19:00:00Zdelivered_late900
O0171WesthillexpressR312026-09-02T12:00:00Z2026-09-02T20:00:00Zon_time00
O0172WesthillexpressR322026-09-03T13:00:00Z2026-09-03T21:00:00Zon_time00
O0173WesthillexpressR312026-09-04T06:00:00Z2026-09-04T14:00:00Zdelivered_late900
O0174WesthillexpressR322026-09-05T07:00:00Z2026-09-05T15:00:00Zoverdue_open013500
O0175WesthillexpressR312026-09-06T08:00:00Z2026-09-06T16:00:00Zon_time00
O0176WesthillexpressR322026-09-07T09:00:00Z2026-09-07T17:00:00Zon_time00
O0177WesthillexpressR312026-09-08T10:00:00Z2026-09-08T18:00:00Zdelivered_late900
O0178WesthillexpressR322026-09-09T11:00:00Z2026-09-09T19:00:00Zdelivered_late900
O0179WesthillexpressR312026-09-10T12:00:00Z2026-09-10T20:00:00Zon_time00
O0180WesthillexpressR322026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
O0181SouthbaystandardR412026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0182SouthbaystandardR422026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late1100
O0183SouthbaystandardR412026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0184SouthbaystandardR422026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0185SouthbaystandardR412026-09-05T10:00:00Z2026-09-06T10:00:00Zon_time00
O0186SouthbaystandardR422026-09-06T11:00:00Z2026-09-07T11:00:00Zon_time00
O0187SouthbaystandardR412026-09-07T12:00:00Z2026-09-08T12:00:00Zon_time00
O0188SouthbaystandardR422026-09-08T13:00:00Z2026-09-09T13:00:00Zdelivered_late1100
O0189SouthbaystandardR412026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0190SouthbaystandardR422026-09-10T07:00:00Z2026-09-11T07:00:00Zon_time00
O0191SouthbaystandardR412026-09-11T08:00:00Z2026-09-12T08:00:00Zon_time00
O0192SouthbaystandardR422026-09-12T09:00:00Z2026-09-13T09:00:00Zon_time00
O0193SouthbaystandardR412026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0194SouthbaystandardR422026-09-01T11:00:00Z2026-09-02T11:00:00Zdelivered_late1100
O0195SouthbaystandardR412026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0196SouthbaystandardR422026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0197SouthbaystandardR412026-09-04T06:00:00Z2026-09-05T06:00:00Zon_time00
O0198SouthbaystandardR422026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0199SouthbaystandardR412026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0200SouthbaystandardR422026-09-07T09:00:00Z2026-09-08T09:00:00Zdelivered_late1100
O0201SouthbaystandardR412026-09-08T10:00:00Z2026-09-09T10:00:00Zon_time00
O0202SouthbaystandardR422026-09-09T11:00:00Z2026-09-10T11:00:00Zon_time00
O0203SouthbaystandardR412026-09-10T12:00:00Z2026-09-11T12:00:00Zon_time00
O0204SouthbaystandardR422026-09-11T13:00:00Z2026-09-12T13:00:00Zon_time00
O0205SouthbaystandardR412026-09-12T06:00:00Z2026-09-13T06:00:00Zon_time00
O0206SouthbaystandardR422026-09-13T07:00:00Z2026-09-14T07:00:00Zdelivered_late1100
O0207SouthbaystandardR412026-09-01T08:00:00Z2026-09-02T08:00:00Zon_time00
O0208SouthbaystandardR422026-09-02T09:00:00Z2026-09-03T09:00:00Zon_time00
O0209SouthbaystandardR412026-09-03T10:00:00Z2026-09-04T10:00:00Zon_time00
O0210SouthbaystandardR422026-09-14T21:00:00Z2026-09-15T21:00:00Zcancelled00
O0211SouthbayexpressR412026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0212SouthbayexpressR422026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late1100
O0213SouthbayexpressR412026-09-03T08:00:00Z2026-09-03T16:00:00Zon_time00
O0214SouthbayexpressR422026-09-04T09:00:00Z2026-09-04T17:00:00Zon_time00
O0215SouthbayexpressR412026-09-05T10:00:00Z2026-09-05T18:00:00Zon_time00
O0216SouthbayexpressR422026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
learner/checkpoints/hub-metrics.csv Read the full fileDownload file
hubtotaleligiblelatelate_rateon_timedelivered_lateoverdue_opencancellednot_maturedelivered_late_minutesopen_overdue_minutes
Eastgate6055310.5636362428332196033720
Harbour6055320.5818182329332145032760
Southbay363270.2187525613166012540
Westhill6055200.3636363517332153032760
learner/checkpoints/service-review.csv Read the full fileDownload file
hubserviceeligiblelatelate_ratetargetgap_ppreview
Eastgateexpress37260.7027030.160.27Priority review
Eastgatestandard1850.2777780.117.778Priority review
Harbourexpress18181.00.190.0Priority review
Harbourstandard37140.3783780.127.838Priority review
Southbayexpress410.250.115.0More data needed
Southbaystandard2860.2142860.111.429Review needed
Westhillexpress22110.50.140.0Priority review
Westhillstandard3390.2727270.117.273Priority review
learner/materials/access-policy.json Read the full fileDownload file
{
  "session_ttl_minutes": 30,
  "export_roles": [
    "supervisor",
    "service"
  ],
  "operator_hub": {
    "op-1": "Harbour",
    "op-2": "Eastgate",
    "op-3": "Westhill",
    "op-4": "Southbay",
    "op-7": "Harbour"
  },
  "network_note": "Access is through a corporate VPN gateway. Documentation IP addresses do not establish location or personal identity.",
  "service_accounts": [
    "svc-archive"
  ]
}

Steps

  1. Extract stakeholder requirements and connect them to the findings in tasks two, three and four. Define users, primary decisions and explicit phase-one exclusions.
  1. Design hub summary → order list → event timeline. Implement hub, service and cohort filters, evidence expansion and an empty-results reset.
  1. Specify pagination, filters, as_of, dataset version, authorization and 401/403/503 behavior. Corporate authentication is a dependency; hiding a control is not server authorization.
  1. Map R1–R6 to UI behavior, APIs and acceptance cases. Include future events, cancellation, insufficient samples, no results, expired sessions and data delay.
  1. Break down design, data, frontend, API, integration, testing and handover effort. Reconcile person-hours to weekly capacity and make client access and approval dependencies explicit.
  1. Deliver proposal.md, api-contract.json and requirements-traceability.csv with the usable workbench. Include architecture, acceptance, milestones, support, rollback and open decisions.

Complete outputs

Cold-chain operations workbench delivery proposal

1. Purpose, users and scope

Operations staff need to act on undelivered overdue orders and trace the underlying evidence. Hub leads need service-stratified metrics. Security staff need dependable session and export controls. Phase one delivers a read-only workbench, metrics API, order timeline and controlled export design. Refunds, dispatch writes, customer notifications and employee rankings are excluded.

R1: filter by hub, service and cohort, prioritizing overdue_open. R2: open complete order evidence with the review cutoff; future events cannot alter a historical metric. R3: exclude cancelled and not-mature orders from the mature denominator. R4: show stratified rates and sample limitations. R5: enforce role, hub and session permissions on the server. R6: provide loading, no-results, errors, freshness and recovery states.

2. Information structure and interaction

Start with cutoff, mature count, late count and open overdue count, followed by hub rates and the order queue. Combine the three filters with AND. Keep the result count and displayed orders in sync. Expand an order to show created, picked_up, delivered or cancelled events, including whether an event is later than the cutoff. No matches displays a clear message and a reset action.

The completed reference workbench supports all 216 orders and their full timelines. For production integration, prevent duplicate requests during loading; update the last-success timestamp on completion. On 503, retain the last successful version with a visible error. On session expiry, clear sensitive views and return to corporate login. The reference interaction does not implement a production identity service or export permission system; those are acceptance items below.

3. Architecture and data flow

Feed A/B → schema validation and conflict quarantine → immutable canonical event store → order view aggregated at as_of → intranet read-only API → workbench. The orders master supplies route and due_at; visible events determine status. Store dataset_version, ingested_at and source_line for reconciliation and replay. A failed incoming batch must not replace the previous reconciled snapshot.

The corporate identity service issues sessions. The gateway validates sessions and each API checks role plus hub scope. A requested hub is not authorization. Operators access only assigned hubs. Supervisors and batch-scoped service accounts can export within their grants. No application password store is added. Export audit records request_id, user, scope, rows, bytes and dataset_version, without secrets.

4. API contract

GET /v1/orders?hub=&service=&cohort=&as_of=&cursor=&limit=50 returns items, next_cursor, total, as_of, dataset_version and updated_at. Limit is 1–100. Use a stable server cursor and the same snapshot for a page sequence to avoid missing or duplicate orders. Invalid filters return 400; a valid empty query returns 200 with an empty items list.

GET /v1/orders/{order_id}/events?as_of= returns ordered events and visible_at_cutoff. Check access before returning content. Missing orders return 404 and forbidden access returns 403. GET /v1/metrics returns mature and late counts, hub/service strata and insufficient-sample states for the same snapshot.

POST /v1/exports requires supervisor or service permission. The body includes scope, as_of, dataset_version and request_key. Accept a job with 202 and job_id, then authorize the completed download against the same scope. Operators receive 403. Deduplicate request_key on the server and audit each export batch.

Errors are 400 for input, 401 for missing/expired session, 403 for permission, 404 for absent resources, 409 for snapshot mismatch, 429 for throttling and 503 for source failure. Include request_id and a safe explanation without credentials.

5. Acceptance and traceability

R1: Harbour + express + overdue_open shows one matching order, O0058, and resetting restores 216. R2: every timeline matches the canonical records and future delivery does not alter the historical cohort. R3: 216 = 12 cancelled + 7 not_mature + 107 on_time + 80 delivered_late + 10 overdue_open, with mature 197 and late 90. R4: Southbay express n=4 requires more data and has no standardized hub value; check 5/15-point boundaries. R5: operator export 403, expired session 401 and authorized supervisor export 202; selecting another hub still returns 403 for an operator. R6: test empty results, loading, 503 retained snapshots, 429 retry and successful recovery timestamps.

requirements-traceability.csv links every requirement to an API and a test. Reference UI and algorithm checks verify the learning output. Production permissions, network failures, pagination and load acceptance require the integrated backend; a working static page is not that evidence.

6. Effort and milestones

WorkstreamPerson-hoursAcceptance gate
Requirements, metric rules and interaction design16R1–R6, identity and source contracts agreed
Ingestion, aggregation and snapshots28Reconciliation, replay and future-event tests
Frontend and accessibility24Filters, timelines, empty results and keyboard use
API, permissions and export audit24Session, scope and export checks
Identity/gateway integration and release readiness16Client interfaces, rollback and monitoring
Integration, security and user acceptance tests24All requirements pass and findings are resolved
Runbook and handover8Operations and recovery rehearsal
Total140Dependent on access and approvals

Plan one engineer at 35 delivery hours per week for four working weeks. Week 1: design 16 + data 19. Week 2: data 9 + frontend 24 + API 2. Week 3: API 22 + integration 13. Week 4: integration 3 + testing 24 + handover 8. Each week totals 35, and the workstreams total 140. Client approval and access waiting time are outside this effort. Delayed security review moves calendar milestones rather than removing tests. Capacity and skills are planning assumptions to confirm, not an agreed production launch or price.

7. Operations, support and rollback

Monitor quarantine rates, snapshot age, API errors, access denials and export volumes. Support tickets include hub impact, request_id, data version and reproduction steps. A technical duty owner triages access failures and an operations owner confirms business impact. Support hours, response targets, retention and charges require agreement before launch.

Rollback reads to the last reconciled snapshot while retaining source and quarantine records. Retain access checks even if an API version is reverted. After recovery, recompute the 197/90 controls for the reference snapshot, compare versions and obtain operations sign-off. Rehearse backup and restore before release.

8. Dependencies and decisions

The client provides identity protocols, role/hub grants, gateway access, source interfaces and retention requirements. Confirm concurrency, arrival delay, refresh interval, export limits, audit retention and support coverage in week one. Record-based acceptance here does not establish production traffic capacity or an improvement in actual fulfilment outcomes.

Download fileOpen complete workbench

Reference answers

instructor/answers/api-contract.json Read the full fileDownload file
{
  "version": "1.0",
  "as_of": "2026-09-15T00:00:00Z",
  "dataset_version": "coldchain-v1",
  "routes": [
    {
      "method": "GET",
      "path": "/v1/orders",
      "query": [
        "hub",
        "service",
        "cohort",
        "as_of",
        "cursor",
        "limit"
      ],
      "limit": {
        "min": 1,
        "max": 100
      },
      "response": [
        "items",
        "total",
        "next_cursor",
        "as_of",
        "dataset_version",
        "updated_at"
      ],
      "errors": [
        400,
        401,
        403,
        409,
        429,
        503
      ]
    },
    {
      "method": "GET",
      "path": "/v1/orders/{order_id}/events",
      "response": [
        "events",
        "visible_at_cutoff"
      ],
      "errors": [
        401,
        403,
        404,
        503
      ]
    },
    {
      "method": "GET",
      "path": "/v1/metrics",
      "response": [
        "eligible",
        "late",
        "by_hub",
        "by_service",
        "sample_status"
      ],
      "errors": [
        400,
        401,
        403,
        409,
        503
      ]
    },
    {
      "method": "POST",
      "path": "/v1/exports",
      "roles": [
        "supervisor",
        "service"
      ],
      "body": [
        "scope",
        "as_of",
        "dataset_version",
        "request_key"
      ],
      "accepted_status": 202,
      "errors": [
        400,
        401,
        403,
        409,
        429,
        503
      ]
    }
  ]
}
instructor/answers/requirements-traceability.csv Read the full fileDownload file
requirementoutcomeendpointtestverification
R1Combined filters and open-overdue priorityGET /v1/ordersHarbour + express + overdue_open gives O0058; reset to 216Reference interaction available; production pagination requires integration
R2Event traceability and historical cutoffGET /v1/orders/{id}/eventsFuture delivery cannot change the historical cohortTimeline and algorithm tests
R3Mature-order metric denominatorGET /v1/metrics197 mature, 90 lateComplete recalculation and independent counts
R4Small samples and service mixGET /v1/metricsSouthbay express n=4; standardized hub rate missingCalculation and boundary tests
R5Authorization and session expiryPOST /v1/exportsoperator 403; expired session 401; authorized export 202Contract and investigation tests; production backend integration required
R6Empty results and error recoveryAll APIsReset empty results; retain snapshot on 503; retry 429Empty-state interaction available; network cases require integration
Complete reference implementation Read the full fileDownload file
"""Reference implementation for the Ape Intern cold-chain operations lab."""
import csv,json
from collections import defaultdict,Counter
from datetime import datetime,timezone
from pathlib import Path
from urllib.parse import urlparse,parse_qs
UTC=timezone.utc
KINDS={'OPEN':'created','COLLECT':'picked_up','DROP':'delivered','VOID':'cancelled'}
HUBS={'Harbour','Eastgate','Westhill','Southbay'}
def parse_time(value):
    t=datetime.fromisoformat(value.replace('Z','+00:00'))
    if t.tzinfo is None:raise ValueError('timezone_required')
    return t.astimezone(UTC)
def iso(t):return t.isoformat(timespec='seconds').replace('+00:00','Z')
def readcsv(p):
    with Path(p).open(encoding='utf-8-sig',newline='') as f:return list(csv.DictReader(f))
def writecsv(p,rows,fields=None):
    rows=list(rows)
    with Path(p).open('w',encoding='utf-8-sig',newline='') as f:
        w=csv.DictWriter(f,fieldnames=fields or list(rows[0]));w.writeheader();w.writerows(rows)
def dump(p,value):Path(p).write_text(json.dumps(value,ensure_ascii=False,indent=2)+'\n')
def _normalize(record,source):
    if source=='A':
        e=dict(event_id=record['event_id'],order_id=record['order_ref'],hub=record['hub'],service=record['service'],kind=record['event'],happened_at=iso(parse_time(record['event_time'])))
    else:
        ms=record['at_ms']
        if type(ms) is not int:raise ValueError('epoch_must_be_integer')
        e=dict(event_id=record['id'],order_id=record['shipment']['number'],hub=record['shipment']['station'],service=record['shipment']['product'],kind=KINDS[record['action']],happened_at=iso(datetime.fromtimestamp(ms/1000,UTC)))
    if e['kind'] not in KINDS.values():raise ValueError('unsupported_event')
    if e['hub'] not in HUBS or e['service'] not in {'standard','express'}:raise ValueError('unknown_dimension')
    if not e['event_id'] or not e['order_id']:raise ValueError('empty_key')
    return e

def normalize(record,source):
    try:return _normalize(record,source)
    except (KeyError,TypeError,OverflowError) as error:raise ValueError(str(error).strip("'")) from error

def ingest(data):
    grouped=defaultdict(list);rejected=[];duplicates=[]
    for source,name in [('A','dispatch-a.jsonl'),('B','courier-b.jsonl')]:
        for line,text in enumerate((data/name).read_text().splitlines(),1):
            loc={'source':name,'line':line}
            try:
                event=normalize(json.loads(text),source);grouped[event['event_id']].append((event,loc))
            except (ValueError,KeyError,TypeError,OverflowError) as ex:
                rejected.append(dict(loc,reason=str(ex).strip("'")))
    accepted=[]
    for eid,items in grouped.items():
        distinct={json.dumps(e,sort_keys=True,ensure_ascii=False) for e,loc in items}
        if len(distinct)>1:
            rejected.extend(dict(loc,reason='immutable_id_conflict') for e,loc in items);continue
        accepted.append(items[0][0])
        duplicates.extend(dict(loc,event_id=eid,reason='exact_replay') for e,loc in items[1:])
    accepted.sort(key=lambda e:(e['happened_at'],e['event_id']))
    return accepted,rejected,duplicates

def classify_order(order,events,cutoff):
    # Only facts available at cutoff can influence a retrospective result.
    visible=[e for e in events if parse_time(e['happened_at'])<=cutoff]
    visible.sort(key=lambda e:parse_time(e['happened_at']))
    delivered=[parse_time(e['happened_at']) for e in visible if e['kind']=='delivered']
    cancelled=any(e['kind']=='cancelled' for e in visible)
    due=parse_time(order['due_at'])
    if cancelled:state='cancelled'
    elif due>cutoff:state='not_mature'
    elif not delivered:state='overdue_open'
    elif min(delivered)>due:state='delivered_late'
    else:state='on_time'
    delay=round((min(delivered)-due).total_seconds()/60) if state=='delivered_late' else 0
    overdue=round((cutoff-due).total_seconds()/60) if state=='overdue_open' else 0
    return dict(order,cohort=state,late_minutes=delay,overdue_minutes=overdue)

def aggregate(rows,keys):
    groups=defaultdict(list)
    for row in rows:groups[tuple(row[k] for k in keys)].append(row)
    result=[]
    for dims,records in sorted(groups.items()):
        counts=Counter(r['cohort'] for r in records)
        eligible=sum(counts[x] for x in ['on_time','delivered_late','overdue_open'])
        late=counts['delivered_late']+counts['overdue_open']
        result.append(dict(zip(keys,dims),total=len(records),eligible=eligible,late=late,late_rate=round(late/eligible,6) if eligible else None,on_time=counts['on_time'],delivered_late=counts['delivered_late'],overdue_open=counts['overdue_open'],cancelled=counts['cancelled'],not_mature=counts['not_mature'],delivered_late_minutes=sum(r['late_minutes'] for r in records),open_overdue_minutes=sum(r['overdue_minutes'] for r in records)))
    return result

def service_band(rate,n,rules):
    if n<rules['min_sample']:return 'More data needed'
    gap=(rate-rules['late_target'])*100
    if gap>rules['priority_gap_pp']:return 'Priority review'
    if gap>rules['review_gap_pp']:return 'Review needed'
    return 'Within threshold'
def fairness(hub_tiers,rules):
    rows=[]
    for x in hub_tiers:
        rate=x['late_rate'];rows.append(dict(hub=x['hub'],service=x['service'],eligible=x['eligible'],late=x['late'],late_rate=rate,target=rules['late_target'],gap_pp=round((rate-rules['late_target'])*100,3) if rate is not None else None,review=service_band(rate,x['eligible'],rules)))
    standardized=[]
    for hub in sorted(HUBS):
        parts=[r for r in rows if r['hub']==hub]
        enough=len(parts)==2 and all(r['eligible']>=rules['min_sample'] for r in parts)
        value=sum(r['late_rate']*rules[r['service']+'_weight'] for r in parts) if enough else None
        standardized.append(dict(hub=hub,standardized_late_rate=round(value,6) if value is not None else None,status='Comparable' if enough else 'More data needed'))
    return rows,standardized

def investigate(logs,policy):
    logins={};findings=[]
    for row in sorted(logs,key=lambda r:(r['at'],r['request_id'])):
        t=parse_time(row['at']);status=int(row['status']);route=urlparse(row['path']);query=parse_qs(route.query)
        if route.path=='/login' and status==200:logins[(row['user'],row['session'])]=t;continue
        if status!=200:continue
        types=[]
        if route.path=='/export' and row['role'] not in policy['export_roles']:types.append('unauthorised_export')
        hub=query.get('hub',[''])[0]
        if row['role']=='operator' and hub and hub!=policy['operator_hub'].get(row['user']):types.append('hub_scope_violation')
        login=logins.get((row['user'],row['session']))
        if login is None or (t-login).total_seconds()>policy['session_ttl_minutes']*60:types.append('expired_or_missing_session')
        if types:findings.append(dict(request_id=row['request_id'],at=row['at'],user=row['user'],session=row['session'],finding=';'.join(types),status=status,rows=int(row['rows']),bytes=int(row['bytes'])))
    return findings

def solve(data,out):
    data=Path(data);out=Path(out);out.mkdir(parents=True,exist_ok=True)
    events,rejects,dups=ingest(data)
    (out/'canonical-events.jsonl').write_text(''.join(json.dumps(e,ensure_ascii=False)+'\n' for e in events))
    writecsv(out/'rejected.csv',rejects);writecsv(out/'duplicates.csv',dups)
    rules=json.loads((data/'rules.json').read_text());cutoff=parse_time(rules['cutoff'])
    by_order=defaultdict(list)
    for e in events:by_order[e['order_id']].append(e)
    orders=readcsv(data/'orders.csv')
    records=[classify_order(o,by_order[o['order_id']],cutoff) for o in orders]
    writecsv(out/'order-review.csv',records)
    hubs=aggregate(records,['hub']);tiers=aggregate(records,['hub','service']);routes=aggregate(records,['route'])
    writecsv(out/'hub-metrics.csv',hubs);writecsv(out/'route-metrics.csv',routes)
    bands,std=fairness(tiers,rules)
    writecsv(out/'service-review.csv',bands);writecsv(out/'standardized-comparison.csv',std)
    findings=investigate(readcsv(data/'access-log.csv'),json.loads((data/'access-policy.json').read_text()))
    writecsv(out/'security-findings.csv',findings)
    summary=dict(orders=len(orders),accepted_events=len(events),rejected=len(rejects),duplicates=len(dups),cohorts=dict(Counter(r['cohort'] for r in records)),hubs=hubs,service_review=bands,standardized=std,security=dict(flagged_requests=len(findings),potential_export_rows=sum(f['rows'] for f in findings if 'unauthorised_export' in f['finding']),potential_export_bytes=sum(f['bytes'] for f in findings if 'unauthorised_export' in f['finding']),findings=findings))
    dump(out/'results.json',summary)
    return summary
if __name__=='__main__':
    import sys
    print(json.dumps(solve(sys.argv[1],sys.argv[2]),ensure_ascii=False,indent=2))

Each task is worth 20 points. Reach at least 14 and correct all critical rule errors before the next review. Editing raw inputs, silently dropping records, including not-yet-due orders in the denominator, counting 401 attempts as disclosure, ranking an insufficient sample or treating a UI filter as authorization requires correction and re-testing.

  • Evidence-to-requirement traceability: 5
  • Architecture and authorization boundaries: 5
  • Consistent estimates and dependencies: 5
  • Complete proposal and usable output: 5