================================================================================ T1 Every endpoint a screen calls actually exists ================================================================================ Counter billing — 16 distinct endpoints PASS counter-billing-live.html makes at least one API call PASS POST /auth/login exists in the router PASS GET /bills/detail exists in the router PASS POST /credit-notes exists in the router PASS GET /auth/me exists in the router PASS GET /catalogue/search exists in the router PASS POST /crosssell/suggest exists in the router PASS POST /crosssell/accepted exists in the router PASS POST /loyalty/quote exists in the router PASS POST /loyalty/redeem exists in the router PASS POST /bills/cancel exists in the router PASS GET /customers/search exists in the router PASS GET /doctors exists in the router PASS POST /doctors exists in the router PASS POST /auth/logout exists in the router PASS POST /bills exists in the router PASS POST /print/bill exists in the router Rider app — 4 distinct endpoints PASS rider-app-live.html makes at least one API call PASS POST /auth/login exists in the router PASS GET /delivery/stops exists in the router PASS POST /delivery/delivered exists in the router PASS POST /delivery/failed exists in the router Partner console — 5 distinct endpoints PASS partner-console-live.html makes at least one API call PASS POST /partner/login exists in the router PASS GET /partner/stores exists in the router PASS GET /partner/store-health exists in the router PASS GET /partner/earnings exists in the router PASS POST /partner/pause-updates exists in the router Owner dashboard — 6 distinct endpoints PASS owner-dashboard-live.html makes at least one API call PASS POST /auth/login exists in the router PASS GET /dashboard/stores exists in the router PASS GET /dashboard exists in the router PASS GET /crosssell/performance exists in the router PASS GET /messaging/spend exists in the router PASS POST /messaging/suspend exists in the router Setup wizard — 7 distinct endpoints PASS setup-wizard-live.html makes at least one API call PASS POST /setup/opening-stock exists in the router PASS POST /auth/login exists in the router PASS GET /setup/status exists in the router PASS POST /setup/store exists in the router PASS POST /setup/counter exists in the router PASS POST /setup/catalogue exists in the router PASS POST /setup/go-live exists in the router Purchase entry — 4 distinct endpoints PASS purchase-entry-live.html makes at least one API call PASS POST /auth/login exists in the router PASS GET /auth/me exists in the router PASS POST /purchases/parse exists in the router PASS POST /purchases exists in the router Reports — 3 distinct endpoints PASS reports-live.html makes at least one API call PASS POST /auth/login exists in the router PASS GET /auth/me exists in the router PASS POST /reports/export exists in the router Buying — 10 distinct endpoints PASS buying-live.html makes at least one API call PASS POST /auth/login exists in the router PASS GET /auth/me exists in the router PASS GET /reorder/worklist exists in the router PASS GET /returnable exists in the router PASS GET /suppliers exists in the router PASS POST /debit-notes exists in the router PASS POST /reorder/send exists in the router PASS POST /reorder/cancel exists in the router PASS GET /reorder/order exists in the router PASS POST /reorder/receive exists in the router Credit — 14 distinct endpoints PASS credit-live.html makes at least one API call PASS POST /auth/login exists in the router PASS GET /auth/me exists in the router PASS GET /reports/ageing exists in the router PASS GET /customers/credit exists in the router PASS GET /customers/statement exists in the router PASS GET /loyalty/balance exists in the router PASS GET /loyalty/statement exists in the router PASS GET /consent exists in the router PASS POST /consent exists in the router PASS POST /consent/erase exists in the router PASS POST /receipts exists in the router PASS POST /receipts/clear exists in the router PASS POST /receipts/bounce exists in the router PASS GET /customers/search exists in the router Accounts — 8 distinct endpoints PASS accounts-live.html makes at least one API call PASS POST /auth/login exists in the router PASS GET /auth/me exists in the router PASS GET /accounts/trial-balance exists in the router PASS POST /bank/import exists in the router PASS GET /bank/reconcile exists in the router PASS POST /bank/post-entries exists in the router PASS GET /gst/reconcile-2b exists in the router PASS GET /accounts/profit-loss exists in the router Order console — 11 distinct endpoints PASS order-console-live.html makes at least one API call PASS POST /auth/login exists in the router PASS GET /auth/me exists in the router PASS GET /orders exists in the router PASS GET /orders/detail exists in the router PASS POST /orders/fulfil exists in the router PASS POST /delivery/assign exists in the router PASS POST /delivery/settle exists in the router PASS POST /orders/verify-rx exists in the router PASS POST /orders/reject exists in the router PASS POST /orders/accept exists in the router PASS POST /orders/payment exists in the router ================================================================================ T2 And the screen's users can actually reach it ================================================================================ PASS POST /auth/login is open to any signed-in user PASS GET /bills/detail is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /credit-notes is guarded on the screen for roles the router refuses BILLER told who to fetch, not shown a 403 PASS GET /auth/me is open to any signed-in user PASS GET /catalogue/search is reachable by the roles that use it OWNER, MANAGER, BILLER, PHARMACIST PASS POST /crosssell/suggest is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /crosssell/accepted is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /loyalty/quote is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /loyalty/redeem is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /bills/cancel is guarded on the screen for roles the router refuses BILLER told who to fetch, not shown a 403 PASS GET /customers/search is reachable by the roles that use it OWNER, MANAGER, BILLER PASS GET /doctors is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /doctors is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /auth/logout is open to any signed-in user PASS POST /bills is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /print/bill is reachable by the roles that use it OWNER, MANAGER, BILLER PASS GET /delivery/stops is reachable by the roles that use it DELIVERY, OWNER, MANAGER PASS POST /delivery/delivered is reachable by the roles that use it DELIVERY, OWNER, MANAGER PASS POST /delivery/failed is reachable by the roles that use it DELIVERY, OWNER, MANAGER PASS POST /partner/login is open to any signed-in user PASS GET /partner/stores is reachable by the roles that use it PARTNER_OWNER, PARTNER_STAFF PASS GET /partner/store-health is reachable by the roles that use it PARTNER_OWNER, PARTNER_STAFF PASS GET /partner/earnings is reachable by the roles that use it PARTNER_OWNER, PARTNER_STAFF PASS POST /partner/pause-updates is reachable by the roles that use it PARTNER_OWNER PASS GET /dashboard/stores is reachable by the roles that use it OWNER PASS GET /dashboard is reachable by the roles that use it OWNER PASS GET /crosssell/performance is reachable by the roles that use it OWNER PASS GET /messaging/spend is reachable by the roles that use it OWNER, MANAGER PASS POST /messaging/suspend is reachable by the roles that use it OWNER PASS POST /setup/opening-stock is reachable by the roles that use it OWNER, MANAGER PASS GET /setup/status is reachable by the roles that use it OWNER, MANAGER PASS POST /setup/store is reachable by the roles that use it OWNER PASS POST /setup/counter is reachable by the roles that use it OWNER PASS POST /setup/catalogue is reachable by the roles that use it OWNER, MANAGER PASS POST /setup/go-live is reachable by the roles that use it OWNER PASS POST /purchases/parse is reachable by the roles that use it OWNER, MANAGER PASS POST /purchases is reachable by the roles that use it OWNER, MANAGER PASS POST /reports/export is reachable by the roles that use it OWNER, MANAGER PASS GET /reorder/worklist is reachable by the roles that use it OWNER, MANAGER PASS GET /returnable is reachable by the roles that use it OWNER, MANAGER PASS GET /suppliers is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /debit-notes is reachable by the roles that use it OWNER, MANAGER PASS POST /reorder/send is reachable by the roles that use it OWNER, MANAGER PASS POST /reorder/cancel is reachable by the roles that use it OWNER, MANAGER PASS GET /reorder/order is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /reorder/receive is reachable by the roles that use it OWNER, MANAGER, BILLER PASS GET /reports/ageing is reachable by the roles that use it OWNER, MANAGER PASS GET /customers/credit is reachable by the roles that use it OWNER, MANAGER, BILLER PASS GET /customers/statement is reachable by the roles that use it OWNER, MANAGER, BILLER PASS GET /loyalty/balance is reachable by the roles that use it OWNER, MANAGER, BILLER PASS GET /loyalty/statement is reachable by the roles that use it OWNER, MANAGER, BILLER PASS GET /consent is reachable by the roles that use it OWNER, MANAGER PASS POST /consent is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /consent/erase is reachable by the roles that use it OWNER, MANAGER PASS POST /receipts is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /receipts/clear is reachable by the roles that use it OWNER, MANAGER PASS POST /receipts/bounce is reachable by the roles that use it OWNER, MANAGER PASS GET /accounts/trial-balance is reachable by the roles that use it OWNER PASS POST /bank/import is reachable by the roles that use it OWNER PASS GET /bank/reconcile is reachable by the roles that use it OWNER PASS POST /bank/post-entries is reachable by the roles that use it OWNER PASS GET /gst/reconcile-2b is reachable by the roles that use it OWNER PASS GET /accounts/profit-loss is reachable by the roles that use it OWNER PASS GET /orders is reachable by the roles that use it OWNER, MANAGER, PHARMACIST PASS GET /orders/detail is reachable by the roles that use it OWNER, MANAGER, PHARMACIST PASS POST /orders/fulfil is reachable by the roles that use it OWNER, MANAGER, BILLER PASS POST /delivery/assign is reachable by the roles that use it OWNER, MANAGER PASS POST /delivery/settle is reachable by the roles that use it OWNER, MANAGER PASS POST /orders/verify-rx is reachable by the roles that use it PHARMACIST, OWNER PASS POST /orders/reject is reachable by the roles that use it OWNER, MANAGER PASS POST /orders/accept is reachable by the roles that use it OWNER, MANAGER PASS POST /orders/payment is reachable by the roles that use it OWNER, MANAGER ================================================================================ T3 The screen behaves like a counter tool, not a web page ================================================================================ PASS credentials are sent with every request the session cookie must travel or nothing works PASS CSRF token is attached to writes PASS in-flight searches are aborted so a fast typist never sees results for what he typed two letters ago PASS a failed fetch is shown, not swallowed the biller learns the node is down from the screen, not from a missing slip PASS 401 sends the biller back to sign in PASS engine refusals go to the hint line, not a dialog a modal at a busy counter is worse than the problem it reports PASS the counter offers suggestions as the basket builds PASS a suggestion never delays a line going in the counter has a 50ms budget and this is not part of it PASS an accepted suggestion is recorded otherwise the commission ledger and the reporting disagree PASS points are quoted against the ELIGIBLE basket only points earned on shampoo can never pay for a prescription PASS and redeeming has its own key, not an existing one F7 was already Delete line — colliding with muscle memory is worse than no feature PASS the strips sit below the basket a suggestion that pushes the lines down gets in the way of the work PASS the counter can take a return PASS but a biller is told to fetch the manager, not refused handing money back is the one counter action with no audit trail on the customer's side PASS and it returns to the batch the item came from crediting the wrong batch corrupts the shelf count and the recall trail PASS it never offers more than is left a second partial return must not exceed the first PASS a prescription line is flagged, not silently returned medicine going back on the shelf is a pharmacist's decision PASS and F5 does not collide with an existing key F1-F4 and F6-F9 were already bound PASS THE SCREEN ACTUALLY ASKS FOR THE SLIP it used to say "sent to the printer" while requesting nothing PASS and says so differently when printing fails a biller who thinks the sale failed will ring it up twice PASS the server's bill number is authoritative the screen never invents a number of its own PASS no localStorage or sessionStorage session state belongs on the server where it can be revoked PASS search latency is visible to whoever is watching the 50 ms budget stays measured in the field, not just in a test ================================================================================ T4 The order console, specifically ================================================================================ PASS the order console is present PASS the waiting time comes from the SERVER, not a local timer a shop PC three minutes fast would show every chit as late PASS the queue refreshes, so another counter answering first is seen two counters can be looking at the same chit PASS the server total replaces whatever the screen showed the screen must never be the authority on what a customer pays PASS money on screen is labelled indicative the engine recomputes it on accept PASS engine refusals do not become dialogs prompt() for a quantity is fine; alert() for an error is not PASS the prescription gate is surfaced, not hidden PASS the console can advance an accepted order without it an accepted order simply stops, and nothing on screen says why PASS cash on delivery is offered as its own action a shop waiting on KYC can still trade today PASS an action the role cannot perform is HIDDEN, not offered a button that always errors is worse than no button PASS and the reason is given if it is reached anyway staff can act on it instead of retrying ================================================================================ T5 The consumer and rider screens ================================================================================ PASS the storefront is present PASS the consumer pass is a header, never a cookie it must not be sent automatically alongside a staff session PASS the pass is never persisted a patient's phone is shared, borrowed and lost PASS the server's message is shown, not reinvented 429s already say how long to wait; refusals already say what is unavailable PASS no stock counts are displayed the order-request model never promises availability PASS the rider app is present PASS THE RIDER APP NEVER HOLDS THE OTP the code is checked on the server; a lost phone is just a lost phone PASS the cash figure comes from the server a reinstalled phone must not disagree with the counter about money PASS and it is stated to be counted against his name PASS no offline queue that could double-deliver an action the server never saw must not look done on the phone ================================================================================ T6 The partner console cannot reach a chemist's data ================================================================================ PASS the partner console is present PASS the console never calls /bills PASS the console never calls /reports/sale-register PASS the console never calls /orders PASS the console never calls /catalogue/search PASS the console never calls /dashboard PASS the console never calls /receipts PASS every partner route is restricted to partner roles 5 routes, none reachable by store staff PASS and no staff route lists a partner role the separation runs both ways PASS the console says what it cannot show a partner reading the screen should understand the limit, not discover it ================================================================================ T7 The owner dashboard ================================================================================ PASS the owner dashboard is present PASS money at risk is rendered ABOVE takings an owner already knows what he sold; this is the money leaving quietly PASS every risk figure carries its definition a number without one gets argued with instead of acted on PASS and an action, not just an amount a figure with nothing attached is looked at and left PASS stock is stated to be valued at cost MRP valuation would flatter the number by a third PASS the store filter offers only what the server returned there is no field through which another owner's store id could be typed ================================================================================ T8 The setup wizard cannot tick its own boxes ================================================================================ PASS the setup wizard is present PASS progress is re-read from the server after every action the wizard holds no idea what step it is on — it asks PASS it keeps no local notion of completion a click-driven wizard cannot show a step that regressed PASS the go-live button is disabled from SERVER state not from whether the user reached the last screen PASS and the server's refusal is shown verbatim it lists exactly what is missing; a summary would lose that PASS the checklist explains why each step matters a step nobody understands is a step somebody skips PASS the partner is told what to verify before leaving PASS the step count comes from the server, not the copy a storefront shop has one more step; hard-coding "six" is wrong for half of them PASS the conditional messaging step has its own explanation approval takes days, so the wizard says so where it will be read ================================================================================ T9 EVERY CLASS A ROUTE USES IS LOADED BY THE BOOTSTRAP ================================================================================ routes construct 27 classes; bootstrap loads 21 file(s) PASS there are library files to scan 30 module(s) PASS every class the routes construct is loaded SuggestionEngine, ApiException, BillingEngine, Numbering, CreditControl, LoyaltyEngine… ================================================================================ T10 Purchase entry, and how much of the API a shop can reach ================================================================================ PASS the purchase screen is present PASS it reads the e-invoice through the server parsing in the browser would put the standard in two places PASS the confirm list comes from the SERVER, not the screen if the standard ever carries MRP, the server stops asking and this follows PASS saving is blocked while anything is outstanding the engine refuses too; this just says so before the round trip PASS and it tells the buyer why MRP is being asked for otherwise it reads as the software being obtuse 94 human-facing routes · 93 reachable from a screen · 1 not PASS the screen coverage is measured, not assumed 99% reachable — the rest are built, tested, and have no way in PASS the reports screen is present PASS the screen declares a role list per report 9 reports in the menu PASS EVERY REPORT IS OFFERED ONLY TO ROLES THE ROUTER ALLOWS 9 reports, menu and router agree PASS and the export button is hidden from roles that cannot export the same rule the menu follows: never offer what the router refuses PASS it exports XLSX, never CSV a 19-digit batch number becomes 4.512E+18 in a spreadsheet and the digits are gone PASS and a report it cannot export says so plainly better than a button that fails PASS the buying screen is present PASS it closes the loop: worklist, send, receive, cancel PASS EVERY SUGGESTION SHOWS ITS REASON "buy 4 packs" is a number to argue with; "12 days left, 9 day lead time" is one to act on PASS the list leads with what runs out first a buyer with ten minutes needs Thursday, not the largest numbers PASS receiving fetches the real lines guessing line numbers is how a delivery is booked against the wrong item PASS and short delivery is treated as normal a distributor short-ships constantly PASS near-expiry stock can be sent back a chemist who misses the distributor's window eats the loss PASS and expired stock is shown but not claimable what has been lost is a management fact too PASS a return never claims more than is on the shelf claiming stock you do not hold is a credit note the distributor reverses PASS and the debit note names a SUPPLIER, not an invoice an expiry return is batches going back to whoever supplied them PASS cancelling asks why the next buyer needs to know why this was not chased 4 route(s) a partner can reach: GET /partner/stores GET /partner/store-health GET /partner/earnings POST /partner/pause-updates PASS a partner reaches only partner-scoped routes anything outside /partner/ is a route nobody designed for them PASS AND NO PARTNER ROUTE READS A PATIENT COLUMN counts and dates only — never who, what or how much PASS THE RIDER IS TOLD WHEN A STOP NEEDS A COLD BOX item.is_cold_chain was read by nothing — not ordering, not packing, not the rider PASS and it is on the stop LIST, not only the detail at the door insulin already warm cannot be fixed by noticing on the doorstep PASS THE OWNER SEES HIS OWN SHOP'S HEALTH the partner console showed this and the owner saw none of it PASS and a stale backup says what to do about it a backup nobody has restored is not a backup PASS the owner can see messaging spend the route existed with no screen — a control that cannot be reached PASS AND CAN STOP IT FROM THE PAGE HE HAS OPEN an owner watching spend climb needs a button, not a support call PASS stopping warns that online orders stop too stopping to save money and finding nobody can order is the button letting him down PASS and it says queued messages are kept suspension defers; it does not discard PASS the two caps are explained as separate a marketing cap must never block a login code PASS the credit screen is present PASS it covers taking, clearing and bouncing PASS MONEY AT RISK LEADS, not total receivable total receivable looks healthy right up until it is not PASS the list is sorted oldest first, not largest first the oldest debt is the one turning into a bad debt PASS an uncleared cheque is shown as a cheque, never as cash the shop is holding paper until the bank says otherwise PASS and bouncing says the debt has come back the number on screen is about to go up; nobody should have to work out why PASS and it can produce the statement, not just the balance a balance without the transactions behind it is a number to be disputed PASS the credit decision is shown before the arithmetic "can he buy" is the question; the numbers are the argument for the answer PASS the accounts screen is present PASS it covers bank, GSTR-2B and the books PASS THE TAB ORDER IS THE ORDER OF THE WORK a profit figure read before the bank is reconciled is a guess PASS and the trial balance is last, where nobody looks unless worried PASS an unbalanced ledger is shouted on EVERY tab a shop trading on broken books should not have to go looking for that PASS bank differences are classified, not counted three classes of difference mean three different actions PASS and posting is named as the only part that writes looking is safe; posting is not ================================================================================ T10b THE PRINT SPEC AND THE BUILD STILL AGREE ================================================================================ PASS the print spec is in the tree PASS there are screens to scan 15 screen(s) PASS NO SCREEN CALLS window.print() 15 screens checked PASS every endpoint the spec names is served 8 endpoint(s) agree ================================================================================ T11 The router still says who may do what ================================================================================ ROUTE WHO -------------------------------------------------------------------------- POST /auth/login (public) POST /auth/logout (any signed-in user) GET /auth/me (any signed-in user) GET /catalogue/search OWNER, MANAGER, BILLER, PHARMACIST POST /crosssell/suggest OWNER, MANAGER, BILLER POST /crosssell/accepted OWNER, MANAGER, BILLER GET /crosssell/performance OWNER POST /bills OWNER, MANAGER, BILLER GET /bills OWNER, MANAGER, BILLER GET /bills/detail OWNER, MANAGER, BILLER POST /bills/cancel OWNER, MANAGER POST /purchases/parse OWNER, MANAGER POST /purchases OWNER, MANAGER GET /purchases OWNER, MANAGER POST /credit-notes OWNER, MANAGER GET /suppliers OWNER, MANAGER, BILLER POST /consent OWNER, MANAGER, BILLER GET /consent OWNER, MANAGER POST /consent/erase OWNER, MANAGER GET /doctors OWNER, MANAGER, BILLER POST /doctors OWNER, MANAGER, BILLER GET /payables OWNER, MANAGER GET /payables/invoices OWNER, MANAGER POST /payables/pay OWNER POST /payables/bounce OWNER, MANAGER POST /payables/clear OWNER, MANAGER GET /day/expected OWNER, MANAGER, BILLER POST /day/close OWNER, MANAGER GET /stock/count-sheet OWNER, MANAGER POST /stock/adjust OWNER, MANAGER GET /returnable OWNER, MANAGER POST /debit-notes OWNER, MANAGER GET /reorder/worklist OWNER, MANAGER GET /reorder/order OWNER, MANAGER, BILLER POST /reorder/send OWNER, MANAGER POST /reorder/receive OWNER, MANAGER, BILLER POST /reorder/cancel OWNER, MANAGER POST /reports/export OWNER, MANAGER GET /reports/daily OWNER, MANAGER GET /reports/gst OWNER GET /reports/stock OWNER, MANAGER, BILLER GET /reports/schedule-register OWNER, MANAGER, PHARMACIST GET /reports/item-sales OWNER, MANAGER GET /reports/collections OWNER, MANAGER GET /accounts/trial-balance OWNER GET /accounts/profit-loss OWNER GET /accounts/chart OWNER POST /bank/import OWNER GET /bank/reconcile OWNER POST /bank/post-entries OWNER GET /gst/reconcile-2b OWNER GET /customers/statement OWNER, MANAGER, BILLER GET /customers/credit OWNER, MANAGER, BILLER GET /customers/search OWNER, MANAGER, BILLER POST /receipts/bounce OWNER, MANAGER POST /receipts/clear OWNER, MANAGER POST /receipts OWNER, MANAGER, BILLER GET /loyalty/balance OWNER, MANAGER, BILLER POST /loyalty/quote OWNER, MANAGER, BILLER POST /loyalty/redeem OWNER, MANAGER, BILLER GET /loyalty/statement OWNER, MANAGER, BILLER GET /orders OWNER, MANAGER, PHARMACIST GET /orders/detail OWNER, MANAGER, PHARMACIST POST /orders/accept OWNER, MANAGER POST /orders/reject OWNER, MANAGER POST /orders/payment OWNER, MANAGER POST /orders/fulfil OWNER, MANAGER, BILLER POST /orders/verify-rx PHARMACIST, OWNER GET /delivery/stops DELIVERY, OWNER, MANAGER POST /delivery/assign OWNER, MANAGER POST /delivery/delivered DELIVERY, OWNER, MANAGER POST /delivery/failed DELIVERY, OWNER, MANAGER POST /delivery/settle OWNER, MANAGER GET /reports/sale-register OWNER, MANAGER GET /reports/expiry OWNER, MANAGER, BILLER GET /reports/ageing OWNER, MANAGER GET /dashboard OWNER GET /dashboard/stores OWNER GET /messaging/spend OWNER, MANAGER POST /messaging/suspend OWNER GET /setup/status OWNER, MANAGER POST /setup/store OWNER POST /setup/counter OWNER POST /setup/catalogue OWNER, MANAGER POST /setup/opening-stock OWNER, MANAGER POST /setup/go-live OWNER POST /hooks/provider (public) POST /hooks/settlement (public) POST /hooks/inbound (public) POST /sync/events token:NODE POST /sync/master token:NODE POST /print/job token:HELPER POST /print/bill OWNER, MANAGER, BILLER POST /print/ack token:HELPER GET /public/store (public) GET /public/catalogue (public) POST /public/otp/request (public) POST /public/otp/verify (public) POST /partner/login (public) GET /partner/stores PARTNER_OWNER, PARTNER_STAFF GET /partner/store-health PARTNER_OWNER, PARTNER_STAFF GET /partner/earnings PARTNER_OWNER, PARTNER_STAFF POST /partner/pause-updates PARTNER_OWNER POST /public/order (public) GET /public/track (public) PASS every route declares its access 105 routes, none undeclared PASS no route is open to everything by accident ================================================================================ RESULT ================================================================================ 297 passed, 0 failed