{"ns":"freight","title":"Tidemark Logistics","version":"1.1","summary":"Tidemark Logistics is a freight shipment console. Dispatchers sign in, browse and search shipments with status tabs and exception flags, open a detail page (route map, hub-local timeline, parcel weights, customs documents), cancel shipments, book new ones through a four-step wizard with service quotes and optional insurance, and print a shipping label. The console clock is fixed at 19 Oct 2026.","problem":"Dispatchers need to trust the tracking data they act on: which shipments are late or held, what a parcel is charged for, and what a booking will cost.","personas":[{"name":"Dispatcher","need":"Find a shipment fast, see whether it is late or held and resolve customs holds."},{"name":"Shipper","need":"Book a shipment and know the price, ETA and insurance before confirming."},{"name":"Integration client","need":"Sign in with a service key instead of a person."}],"goals":["Weights, dimensional weight and prices are computed with one documented formula.","Exceptions and Late flags appear only when they are actually open.","The timeline always reads newest first, in each hub's local time.","A booking cannot be made with invalid parties, parcels or insurance values."],"features":[{"id":"AUT","title":"Sign-in","summary":"Email and password, or an API key.","reqs":[{"id":"FR-AUT-01","weight":"Must","text":"Valid credentials open the Shipments page and show the signed-in identity in the sidebar.","accept":["Heading \"Sign in to Tidemark\" with Email, Password and Sign in","Sidebar shows \"Mara Ellison\" and \"Dispatcher\""]},{"id":"FR-AUT-02","weight":"Should","text":"Wrong credentials and blank submissions are refused without leaving the sign-in page.","accept":["\"Email or password is incorrect\"","\"Enter your work email and password\""]},{"id":"FR-AUT-03","weight":"Could","text":"\"Use an API key instead\" signs in with a valid key and rejects an unknown one.","accept":["\"That API key was not recognised\"","Valid key: sidebar shows \"API client\" and \"Service key\""]},{"id":"FR-AUT-04","weight":"Could","text":"Sign out returns to the sign-in page and Back does not reveal shipments."}]},{"id":"LST","title":"Shipments list","summary":"Tabs, search, sort and pagination over 30 seeded shipments.","reqs":[{"id":"FR-LST-01","weight":"Must","text":"The list opens on All with exact tab counts and a ten-row first page.","accept":["All 30, Booked 3, In transit 12, At customs 3, Out for delivery 3, Delivered 7, Cancelled 2, Exceptions 6","\"Page 1 of 3\"; columns Tracking, Route, Service, Status, ETA, Weight; first row TMK-480601 (ETA 13 Oct 2026)"]},{"id":"FR-LST-02","weight":"Should","text":"A status tab narrows the table to that status.","accept":["Delivered: seven rows, all \"Delivered\", one page","Cancelled: TMK-480466 and TMK-480656"]},{"id":"FR-LST-03","weight":"Must","text":"The Exceptions tab lists exactly the shipments with an open exception, each with its reason.","accept":["TMK-480377, TMK-480444, TMK-480523, TMK-480589, TMK-480623, TMK-480678","TMK-480377 flag: \"Held at customs: Commercial invoice missing\""]},{"id":"FR-LST-04","weight":"Should","text":"Search matches tracking number or consignee, case-insensitively; no match shows an empty state.","accept":["\"480377\" returns only TMK-480377 (At customs)","\"oakmere\" returns TMK-480477 and TMK-480612 (Oakmere Stores)","\"zzz-none\": \"No shipments match your search\"; clearing the box restores ten rows"]},{"id":"FR-LST-05","weight":"Could","text":"The ETA header toggles ascending (default) and descending order.","accept":["Ascending first row TMK-480601 (13 Oct 2026)","Descending first row TMK-480433 (30 Oct 2026)"]},{"id":"FR-LST-06","weight":"Could","text":"Pagination moves across three pages with Previous and Next disabled at the ends."},{"id":"FR-LST-07","weight":"Should","text":"A shipment shows \"Late\" only when its ETA is before today and it is not delivered.","accept":["TMK-480444 (ETA 17 Oct) is Late","TMK-480589 (ETA 19 Oct, due today) is not Late"]}]},{"id":"DET","title":"Shipment detail","summary":"Summary, route map and timeline.","reqs":[{"id":"FR-DET-01","weight":"Must","text":"The detail page shows status, service, ETA, parties and a route map listing every hub with the current position marked.","accept":["TMK-480411: In transit, Standard, ETA 21 Oct 2026, Keiran to Brannhaven","Hubs in order KEI, QIN, SUN, HAL, ZEN, TAV, MRS, KLM, BRH; marker between ZEN and TAV"]},{"id":"FR-DET-02","weight":"Must","text":"The timeline lists events newest first.","accept":["TMK-480411 first entry \"Departed Zenith Dry Port\" (16 Oct), last \"Shipment booked\" (11 Oct)"]},{"id":"FR-DET-03","weight":"Should","text":"Each event shows the local time at its hub with the UTC offset.","accept":["\"Departed Zenith Dry Port\": 16 Oct, 14:00 UTC+03:00","\"Shipment booked\": 11 Oct, 15:00 UTC+09:00"]}]},{"id":"WGT","title":"Weights","summary":"kg/lb display and dimensional charging.","reqs":[{"id":"FR-WGT-01","weight":"Must","text":"The unit toggle converts kg to lb with 1 kg = 2.2046 lb, rounded (not truncated) to one decimal.","accept":["TMK-480411 kg: 12.5, 8.0, 2.4; total 22.9","lb: 27.6, 17.6, 5.3; total 50.5"]},{"id":"FR-WGT-02","weight":"Must","text":"Dimensional weight is length x width x height (cm) / 5000; each parcel is charged at the greater of actual and dimensional weight, and the shipment shows the chargeable total.","accept":["60x40x30 = 14.4 kg; 70x70x25 = 24.5 kg; 100x50x40 = 40.0 kg","Chargeable weight 78.9 kg; volumetric parcels tagged \"Volumetric\""]}]},{"id":"CUS","title":"Customs documents and exceptions","summary":"Checklist, holds and exception lifecycle.","reqs":[{"id":"FR-CUS-01","weight":"Should","text":"The checklist separates required and optional documents with a received count and shows the exception banner.","accept":["TMK-480377: \"2 of 3 required documents received\"; Commercial invoice unchecked, Packing list and Certificate of origin checked, Dangerous goods declaration (optional) unchecked","Banner \"Held at customs: Commercial invoice missing\""]},{"id":"FR-CUS-02","weight":"Must","text":"Receiving the last required document clears the hold, logs an event and removes the shipment from Exceptions.","accept":["\"3 of 3 required documents received\"; banner gone","Newest timeline entry \"Customs documents received, clearance resumed\"","Exceptions tab shows five rows"]},{"id":"FR-CUS-03","weight":"Must","text":"A delivered shipment carries no open exception and is excluded from the Exceptions tab; its past delay remains in the timeline.","accept":["TMK-480211: Delivered, no banner, timeline still lists \"Delayed: Storm closed the berth for 14 hours\"","Exceptions tab shows six rows without TMK-480211"]},{"id":"FR-CUS-04","weight":"Should","text":"Documents of a delivered shipment are locked.","accept":["Checkboxes disabled; \"Documents are locked once a shipment is delivered\""]}]},{"id":"CAN","title":"Cancellation","summary":"Cancel a shipment that has not been delivered.","reqs":[{"id":"FR-CAN-01","weight":"Must","text":"Cancelling asks for confirmation, then sets the status to Cancelled, logs the event and updates the tab counts.","accept":["Dialog with \"Keep shipment\" and \"Yes, cancel shipment\"","Status \"Cancelled\"; newest entry \"Shipment cancelled by shipper\"; Cancel button gone","TMK-480305: tabs Cancelled 3, In transit 11"]},{"id":"FR-CAN-02","weight":"Should","text":"\"Keep shipment\" closes the dialog and leaves the status unchanged."},{"id":"FR-CAN-03","weight":"Should","text":"A delivered shipment has no Cancel button."}]},{"id":"WIZ","title":"New shipment wizard","summary":"Four steps: sender, recipient, parcels, service.","reqs":[{"id":"FR-WIZ-01","weight":"Must","text":"A shipment can be booked end to end; it appears as Booked with the quoted ETA and a new tracking number.","accept":["Sender Brannhaven Port to recipient Halvard Terminal, one 5 kg 40x30x20 cm parcel, Standard","TMK-480901: Booked, route BRH, KLM, MRS, TAV, ZEN, HAL, ETA 23 Oct 2026, one entry \"Shipment booked\"","List shows All 31, Booked 4"]},{"id":"FR-WIZ-02","weight":"Should","text":"Each step blocks Continue and names the missing field.","accept":["\"Sender: name must be 2 to 60 characters\"","\"Sender: street address is required\""]},{"id":"FR-WIZ-03","weight":"Should","text":"Origin and destination hubs must differ.","accept":["\"Origin and destination hubs must differ\"; no shipment created"]},{"id":"FR-WIZ-04","weight":"Should","text":"A parcel may weigh at most 70 kg.","accept":["70 kg accepted","71 kg: \"Parcel 1: weight exceeds the 70 kg limit\""]},{"id":"FR-WIZ-05","weight":"Should","text":"Economy is unavailable when any parcel exceeds 30 kg.","accept":["35 kg parcel: Economy disabled with \"Parcel 1 is over 30 kg; Economy accepts up to 30 kg per parcel\"; Standard and Express selectable"]}]},{"id":"QUO","title":"Quotes and insurance","summary":"Price per service with fuel surcharge and optional insurance.","reqs":[{"id":"FR-QUO-01","weight":"Must","text":"Each service shows an ETA and a total of freight plus an 8% fuel surcharge on freight.","accept":["5 kg 40x30x20 cm: Economy ETA 26 Oct, Standard 23 Oct, Express 21 Oct 2026","Standard: Freight $36.00, Fuel surcharge (8%) $2.88, Total $38.88"]},{"id":"FR-QUO-02","weight":"Must","text":"Insurance costs 1.5% of the declared value and is added to every total after the surcharge.","accept":["Declared value 1500: insurance $22.50","Totals Economy $48.42, Standard $61.38, Express $88.38"]},{"id":"FR-QUO-03","weight":"Must","text":"The declared value must be between $1 and $50,000; outside that range no insured quote is produced.","accept":["60000 and 0: \"Declared value must be between $1 and $50,000\"","50000 accepted; insurance row $750.00"]}]},{"id":"LBL","title":"Shipping label","summary":"Printable label for a shipment.","reqs":[{"id":"FR-LBL-01","weight":"Could","text":"The label shows tracking, routing, service, parcel count, weight in both units, ETA and a barcode number.","accept":["TMK-480411: \"KEI > BRH\", Standard, 3 parcels, 22.9 kg (50.5 lb), ETA 21 Oct 2026","Barcode number 9248041103"]}]}],"nfr":[{"id":"NFR-01","weight":"Should","text":"Data is held per browser tab; \"Reset demo data\" (confirmed with \"Yes, reset data\") restores the 30 seeded shipments.","accept":["After cancelling TMK-480305 and resetting: All 30 and TMK-480305 In transit"]}],"glossary":[{"term":"Chargeable weight","meaning":"Per parcel, the greater of actual weight and dimensional weight; summed for the shipment."},{"term":"Dimensional weight","meaning":"Length x width x height in cm divided by 5000, in kg."},{"term":"Exception","meaning":"An open problem on an undelivered shipment, such as a customs hold."}],"outOfScope":["Real carrier integrations","Payments","Printing hardware"]}