Every screen, every role, every rule — and a photograph of each one, taken from the running application rather than drawn for the document.
rusukh_demoThis is not a written description of the software. Every screenshot below was taken by a script that signed in as a real seeded user, navigated to a real URL, and photographed whatever came back. The red outline in each image was drawn by that same script around the element the caption refers to, so the caption cannot drift away from the picture.
The whole document regenerates from three commands:
npx playwright test -c e2e/evidence/evidence.config.ts
DB_DATABASE=rusukh_demo php artisan handbook:export-reference
node e2e/evidence/build-handbook.mjs
handbook:export-reference, which reads them out of the database. Change a threshold
and regenerate, and this document changes with it.
Everything here was photographed against rusukh_demo, built from an
empty database by the documented migrate:fresh --seed and verified before use. That
choice is deliberate and worth explaining, because it is the difference between evidence and
decoration.
The everyday development database looks identical on screen and is not honest: it was seeded before the stage-gate work landed, so it carries 286 gate rows with zero evidence rows behind them. The gate board renders green, and the first attempt to actually advance a garment is refused — because the evaluator recomputes each gate from its evidence every time it is asked and never trusts the stored flag. A handbook illustrated from that database would be showing you a board that does not mean what it appears to mean.
The number that separates the two: 151 stage gates standing on 569 evidence rows, all 151 of which re-evaluate as genuinely passing. That check is part of the release procedure in 04-TESTING-AND-VERIFICATION.md §7.
The dashboards below show real computed figures — pipeline value, QC pass rate, delivery success. A freshly seeded installation will not. Every dashboard tile reads "awaiting data" under a banner saying the figures are not being computed yet, and that is correct rather than broken: the KPI engine writes a snapshot on a nightly schedule, at 01:00, and a database created this afternoon has not had one yet. The application deliberately shows an em dash rather than a zero, because a fabricated zero on a quality metric would read as an accusation.
These screenshots were taken after running that job by hand against the demo database, so the
handbook shows what the panel looks like in use rather than on its first day. Two things
follow for a real deployment. The scheduler entry must be installed — one
* * * * * php artisan schedule:run line — and a queue worker must be
running, because schedule:run only places these jobs on the
maintenance queue. Without a worker the dashboards stay empty forever and nothing
reports an error. See
03-PRODUCTION-DEPLOYMENT.md §4.
| Table | Rows |
|---|---|
users | 16 |
customers | 8 |
orders | 114 |
order_items | 142 |
stage_gates | 151 |
stage_gate_evidence | 569 |
approval_requests | 12 |
payments | 6 |
shipments | 6 |
delivery_attempts | 5 |
alteration_jobs | 5 |
commissions | 14 |
journal_entries | 2 |
Two separate front doors, two separate guards. Staff and customers do not share a login, a session, or a permission set, and no staff account can act as a customer — a point §3 returns to, because it surprises people.
| Who | Address | Lands on |
|---|---|---|
| Staff | /login | /admin/dashboard |
| Customers | /customer/login | /account |
| Customer self-registration | /customer/register | /account after email verification |
| Password reset (customer) | /customer/forgot-password | emailed link |
These are the accounts a fresh migrate:fresh --seed creates, and the accounts every
screenshot in this document was taken with. All thirteen share one password on a seeded
installation.
Change every one of these before the system carries real work. They exist so a new installation can be explored and demonstrated immediately; they are published in this document and in the repository, so they are not secrets and must never be treated as any.
| Role | Permissions | Seeded email | Seeded password |
|---|---|---|---|
super_admin |
272 | root@rusukh.pk |
Rusukh#Staff2026 |
management |
270 | tariq.jamil@rusukh.pk |
Rusukh#Staff2026 |
customer_service |
88 | nadia.iqbal@rusukh.pk |
Rusukh#Staff2026 |
operations_coordinator |
48 | rehan.aziz@rusukh.pk |
Rusukh#Staff2026 |
measurement_rep |
48 | imran.sheikh@rusukh.pk |
Rusukh#Staff2026 |
finance |
106 | shahid.kamal@rusukh.pk |
Rusukh#Staff2026 |
inventory_procurement |
46 | zubair.lakhani@rusukh.pk |
Rusukh#Staff2026 |
production_manager |
58 | arif.sattar@rusukh.pk |
Rusukh#Staff2026 |
cutter |
17 | yousuf.dawood@rusukh.pk |
Rusukh#Staff2026 |
tailor |
18 | salim.khatri@rusukh.pk |
Rusukh#Staff2026 |
qc_officer |
31 | naveed.anwar@rusukh.pk |
Rusukh#Staff2026 |
finishing_packing |
18 | junaid.habib@rusukh.pk |
Rusukh#Staff2026 |
rider |
22 | kashif.ali@rusukh.pk |
Rusukh#Staff2026 |
customer |
16 | — |
— |
All customer logins share the password Rusukh#Client2026.
ahmed.raza@gmail.combilal.siddiqui@gmail.comfaisal.malik@gmail.com
Seeded accounts are not enrolled. finance and super_admin are the two
roles the middleware treats as requiring it, so signing in as either lands on the enrolment screen
at /admin/identity/security/two-factor rather than the dashboard. That is the guard
working, not a failed login — the session is valid either way, and navigating to the dashboard
works normally.
Rusukh has 14 roles and 288 named permissions. A role is a bundle of permissions; a user holds a role. Nothing in the application asks "is this person an admin" — every gate asks for a specific named permission, which is why the sidebar a role sees and the routes it may open are the same list.
Each permission is named <area>.<thing>.<verb>. The families:
| Family | Permissions |
|---|---|
production.* | 39 |
crm.* | 32 |
orders.* | 26 |
finance.* | 21 |
identity.* | 21 |
inventory.* | 19 |
audit.* | 18 |
account.* | 16 |
shipping.* | 15 |
catalog.* | 14 |
commission.* | 12 |
payments.* | 12 |
measurements.* | 9 |
approvals.* | 8 |
analytics.* | 7 |
core.* | 6 |
system.* | 6 |
notifications.* | 4 |
gates.* | 2 |
team.* | 1 |
super_admin holds 272
of the 288 permissions. The
16 it does not hold are
the account.* family — the customer portal's own permissions.
A super administrator cannot act as a customer. They cannot approve a specification on a patron's behalf, submit measurements as them, or pay their invoice from inside their account. Those acts have to come from the customer, which is what makes a customer approval worth anything when a dispute turns up later.
3 staff roles hold fewer than twenty permissions each, and that is the design rather than an incomplete setup: a cutter has 17; a tailor has 18; a finishing_packing has 18. Each can do their station and see what they need to do it, and nothing else. The evidence for that claim is in the next section — including one screenshot of the refusal itself, because a hidden link and a blocked route are very different things and only one of them is security.
The navigation is generated from the signed-in user's own permissions, so a photograph of it is a photograph of that role's reach. Thirteen roles, thirteen sidebars, all taken in the same session against the same database.
The last figure in this section is the important one. Everything above it shows what a role is offered; that one shows what happens when somebody ignores the offer and types the URL.
Signed in as root@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as tariq.jamil@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as nadia.iqbal@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as rehan.aziz@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as imran.sheikh@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as kashif.ali@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as shahid.kamal@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as zubair.lakhani@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as arif.sattar@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as yousuf.dawood@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as salim.khatri@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as naveed.anwar@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
Signed in as junaid.habib@rusukh.pk. The outlined navigation is generated from this role's own permissions, so everything absent from it is genuinely unreachable, not merely unlinked — the screen sweep in section 3 proves each of those routes is refused rather than hidden.
The URL was typed in full rather than clicked, bypassing the navigation entirely. The server answered 403. This is the check that matters: the sidebar screenshots above show what each role is offered, and this shows that the offer is also the limit.
Rusukh has two kinds of approval and they are not variations on each other. Customer approvals are the patron agreeing to something about their own order. Internal approvals are a second member of staff signing for a decision the first one is not permitted to take alone. Both are enforced in the application, not in a policy document: the act is refused until the approval exists.
These are the points at which the patron, and only the patron, decides. Each one blocks the work that comes after it; C1–C3 in particular hold the cutting desk, because cut cloth cannot be uncut.
| Code | What is being approved | Requested by | Threshold | SLA |
|---|---|---|---|---|
C1_FABRIC_COLOUR |
Fabric & Colour Approval The customer must approve the fabric and colour before it is cut. |
measurement_rep |
always | 24 h |
C2_STYLE_QUANTITY |
Style & Number of Suits The customer must confirm the style and how many suits are being ordered. |
measurement_rep |
always | 24 h |
C3_MEASUREMENTS_FIT |
Measurements or Reference Fit The customer must sign off the measurements, or the reference garment fit, before cutting. |
measurement_rep |
always | 24 h |
C4_PRICE_CHARGES |
Price & Charges The customer must approve the quoted price and any listed charges before the order is confirmed. |
customer_service |
always | 12 h |
C5_DELIVERY_DATE |
Delivery Date The customer must agree the promised delivery date. |
customer_service |
always | 12 h |
C6_DESIGN_CHANGE |
Design Changes Control rule U2: any unapproved design change invalidates the prior approval and must be re-confirmed. |
measurement_rep |
always | 24 h |
C7_ADDITIONAL_COST |
Additional Cost No extra cost may be added to an order without customer approval. |
customer_service |
always | 12 h |
Two different things are both numbered G1–G13, and it is worth separating them once.
The thirteen stage gates are the order's own checkpoints — G7 is "cutting
complete", G9 is "QC approved" — and they are what the gate register in
§7 lists. The approval codes below are a separate
scheme from SOP §78: G3_FABRIC_CUTTING is the authorisation to start
cutting, not the stage gate that records it as finished.
Where this document says a customer approval "holds G3", it means the approval code — the customer has not yet signed the specification, so cutting cannot be released.
Each of these names an approver role, a money threshold where one applies, and a service level. Below the threshold the act proceeds untouched — a control that fires on ordinary work is one people learn to route around, so a Rs 500 purchase order does not wait for anybody.
| Code | What it governs | Approver | Threshold | SLA |
|---|---|---|---|---|
G1_QUOTATION_DISCOUNT |
Large Discount Authorisation A discount beyond the standard band requires management sign-off before it is applied. |
management |
Rs 5,000 | 4 h |
G13_PERIOD_LOCK_OVERRIDE |
Financial Period Lock Override Reopening or adjusting a closed accounting period is a Super Root exception, logged with full audit. |
super_admin |
always | 24 h |
G2_FABRIC_PURCHASE |
Fabric Purchase Authorisation A fabric purchase order beyond the standard value requires management authorisation. |
management |
Rs 20,000 | 8 h |
G3_FABRIC_CUTTING |
Fabric Cutting Release Control rule U2: cutting may not proceed while a customer approval or specification question is open. |
production_manager |
always | 2 h |
G4_URGENT_ORDER |
Urgent-Order Acceptance Accepting an order outside the normal production calendar requires management approval before it is confirmed. |
management |
always | 1 h |
G5_FABRIC_QC_DEVIATION |
Fabric QC Deviation Clearance A minor fabric defect found at inspection may be cleared for use rather than rejected, on production sign-off. |
production_manager |
always | 2 h |
G6_REFUND_APPROVAL |
Refund Approval A refund beyond the standard threshold requires finance sign-off before it is processed. |
finance |
Rs 3,000 | 8 h |
G7_FREE_ALTERATION_EXCEPTION |
Free Alteration Outside Policy An alteration offered free of charge outside the standard policy (not a Rusukh-error correction) requires sign-off. |
production_manager |
always | 4 h |
G8_DISPATCH_WITH_BALANCE |
Dispatch With Outstanding Payment Control rule: dispatching before the balance is fully collected is an exception, not a default, and needs finance sign-off. |
finance |
always | 1 h |
G9_ORDER_CLOSURE_EXCEPTION |
Order Closure Exception Closing an order with an unresolved payment or alteration requires management approval. |
management |
always | 8 h |
remake |
Remake Authorisation SOP §43/§60: root cause first, then a management approval before a fresh garment is cut. Matches the required_role Production's RequestRemakeAction already stamps directly. |
management |
always | 48 h |
Where you will see these. Every raised request lands in the Approval Centre at
/admin/approvals/desk, photographed in §7. Every decision on
one is written to the audit trail at /admin/audit/activity, photographed at the end
of that same section — a signature nobody can look up later is not a control.
This is a real order, created during the capture run, through the same four-step wizard an operator uses. Nothing here is a mock-up; the order number in the final figure was issued by the application while these pictures were being taken.
The fourth figure is the refusal, and it is deliberately included. A handbook that only shows the clean path teaches nothing about the day the form says no.
Customer Service opens Orders → New Order. Nothing can be entered before a customer is chosen, because every downstream record — measurements, quotation, commission, invoice — hangs off that identity.
Cloth & Stitching, stitching only, or cloth only. This choice decides which stages the order will have to pass through later: a cloth-only order never reaches the cutting desk.
Fabric, cut and customisation per garment. An order may hold several items and each is priced separately — fabric and stitching are stored as distinct amounts, which is what lets a stitching-only order exist at all.
Review was pressed with no garment added. The wizard does not advance and says why, inline. Every step of this wizard validates on the server, so the same refusal happens whether the browser is cooperating or not.
The last screen before the order exists. Totals shown here are computed server-side in integer paisa; no amount on this page was calculated in the browser.
This order was created by this capture run, in the browser, through the same wizard an operator uses. The RSK- number and the URL are the real ones the application issued; orders are keyed by UUID, which is why the address bar shows one.
From the board an order lands on to the ledger entry it eventually becomes. Each station below is photographed in its real seeded state — work genuinely sitting in it — rather than driven forward by the capture script.
Why these are not one continuous click-through. Advancing a single garment through all thirteen stage gates from a browser is a working day of clicking, and a capture run that mutated its way through production could not be re-run. What is shown instead is each station as it looks with real work in it, on a database whose gates were verified to re-evaluate as passing rather than merely stored as green. The click-through proof that each transition works is the automated suite — 2744 backend tests and 262 browser tests, summarised in §11.
Every live order and the stage it is sitting at. This is the screen production planning runs from; the status column is the order header status, distinct from each garment item's own stage. Opened as production_manager at /admin/orders.
G1 to G13. A garment cannot advance until its gate passes, and the gate is recomputed from its evidence rows every single time it is asked — a stored "passed" flag is never trusted on its own. That is why the seeded demo carries 569 evidence rows behind its 151 gates. Opened as qc_officer at /admin/orders/desk/gates.
SOP §78's nine internal approval points land here: discount, fabric purchase, cutting release, urgent order, refund, free alteration, dispatch with balance, order closure and period-lock override. Each carries its own approver, money threshold and SLA. Opened as production_manager at /admin/approvals/desk.
Purchase orders to suppliers. Approving one above the configured threshold raises a G2 request rather than committing the spend — the person placing the order cannot also be the person who approves it. Opened as inventory_procurement at /admin/inventory/purchase-orders.
Incoming cloth is inspected before it can be issued. A deviation raises G5 rather than being waved through, so tolerance decisions are recorded against a named approver. Opened as inventory_procurement at /admin/inventory/fabric-inspection.
Cut cloth cannot be uncut, which is why G3 sits in front of this screen: a cutting job cannot open against a specification the customer has not yet agreed to. Opened as qc_officer at /admin/production/cutting.
The twelve tailoring steps, logged per garment. The assignment moves to In Progress on the first step and to Completed on the twelfth, so a tailor's workload reflects real work logged rather than work assigned. Opened as qc_officer at /admin/production/tailoring.
Two inspections, initial and final, each against a checklist with recorded defects. A major correction routes the garment back to the workshop instead of forward. Opened as finishing_packing at /admin/production/quality.
A Rusukh-error alteration is free by definition and passes straight through. A free alteration in a chargeable category is a concession, and G7 requires someone to sign for it — the seeded demo contains three such signed concessions under the 15-day fit guarantee. Opened as qc_officer at /admin/production/alterations.
Pressing, trimming and final presentation before the garment is packed. Opened as finishing_packing at /admin/production/finishing.
The package is built, then its manifest is verified against the order before it can be sealed. Packing and verifying are separate acts on purpose. Opened as finishing_packing at /admin/production/packing.
Dispatch. G8 governs releasing a shipment while a balance is still outstanding, so "send it anyway" is a decision with a name attached rather than a habit. Opened as finishing_packing at /admin/shipping/shipments.
What a rider carries out and what they must bring back. Failed attempts are recorded with a reason — unreachable, locked gate, blocked route — not silently retried. Opened as rider at /admin/shipping/manifests.
Signature or photograph against the shipment, captured at the door. Opened as finance at /admin/shipping/pod.
Cash collected at the door is a custody chain: rider, hand-over to finance, then reconciliation. Each hand-over is its own record, so an unreconciled bag has an owner. Opened as finance at /admin/shipping/cod.
Where staff take payment and issue refunds. A refund above the configured threshold raises G6 instead of moving money. Opened as finance at /admin/payments/desk.
Double-entry, in integer paisa. Every amount in this system is an integer number of paisa in a Money value object and every percentage is basis points; an architecture test fails the build if a float goes anywhere near a currency value. Opened as finance at /admin/finance/ledger.
Closing a period freezes it. Reopening it is G13 — the only approval in the set reserved to the super administrator, with a 24-hour SLA. Opened as finance at /admin/finance/closings.
Accrual, maturation, payout and clawback. A cancelled order claws back the commission it produced, and a manager override is clawed back with its parent rather than left behind. Opened as finance at /admin/commission.
Who did what, when. This is the screen that makes every approval above meaningful: a signature nobody can look up later is not a control. Opened as production_manager at /admin/audit/activity.
Every screen in the panel, grouped as the sidebar groups them, each opened as a role confirmed able to reach it. Where a screen is shown under a modest role — the cutting desk as a QC officer, the catalogue as a production manager — that is itself the evidence: the least privileged person who needs that screen can genuinely open it.
/admin/analytics/dashboard — opened as super_admin (root@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/analytics/financial — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/analytics/leaderboard — opened as super_admin (root@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/analytics/production-board — opened as finishing_packing (junaid.habib@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/approvals/desk — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/audit/activity — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/core/feature-flags — opened as super_admin (root@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/core/geography — opened as inventory_procurement (zubair.lakhani@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/queue — opened as super_admin (root@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/core/settings — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/identity/roles — opened as super_admin (root@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/identity/teams — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/identity/users — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/measurements/templates — opened as super_admin (root@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/catalog/accessories — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/catalog/categories — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/catalog/customization — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/catalog/fabrics — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/commission — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/commission/payouts — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/commission/statement — opened as rider (kashif.ali@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/crm/appointments — opened as measurement_rep (imran.sheikh@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/crm/leads — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/measurements/profiles — opened as measurement_rep (imran.sheikh@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/measurements/reference-garments — opened as measurement_rep (imran.sheikh@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/orders/desk/quotations — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/crm/complaints — opened as operations_coordinator (rehan.aziz@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/crm/feedback — opened as measurement_rep (imran.sheikh@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/crm/route-plans — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/dashboard — opened as finishing_packing (junaid.habib@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/notifications — opened as finishing_packing (junaid.habib@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/search — opened as finishing_packing (junaid.habib@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/finance/closings — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/finance/ledger — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/finance/reports — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/inventory/customer-fabric — opened as inventory_procurement (zubair.lakhani@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/inventory/fabric-inspection — opened as inventory_procurement (zubair.lakhani@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/inventory/goods-receipt — opened as inventory_procurement (zubair.lakhani@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/inventory/purchase-orders — opened as inventory_procurement (zubair.lakhani@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/inventory/stock-lots — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/inventory/suppliers — opened as inventory_procurement (zubair.lakhani@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/notifications/logs — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/notifications/preferences — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/notifications/preview — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/notifications/templates — opened as customer_service (nadia.iqbal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/orders/desk/approvals — opened as finance (shahid.kamal@rusukh.pk). This path is a signpost rather than a screen: it redirects to /admin/approvals, which is what you are looking at. The outlined entry is where this screen lives in the sidebar.
/admin/orders/desk/cancellations — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/orders/desk/gates — opened as qc_officer (naveed.anwar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/orders — opened as production_manager (arif.sattar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/payments/desk — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/production/alterations — opened as qc_officer (naveed.anwar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/production/cutting — opened as qc_officer (naveed.anwar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/production/files — opened as qc_officer (naveed.anwar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/production/finishing — opened as finishing_packing (junaid.habib@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/production/packing — opened as finishing_packing (junaid.habib@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/production/quality — opened as finishing_packing (junaid.habib@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/production/tailoring — opened as qc_officer (naveed.anwar@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/shipping/cod — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/shipping/manifests — opened as rider (kashif.ali@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/shipping/pod — opened as finance (shahid.kamal@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
/admin/shipping/shipments — opened as finishing_packing (junaid.habib@rusukh.pk). The outlined entry is where this screen lives in the sidebar.
The portal is a separate application behind a separate guard, and every query in it is scoped to the signed-in patron. A customer cannot see another customer's order, cannot select one in a dropdown, and cannot reach one by editing a URL.
The payment sequence at the end is real. A payment was genuinely taken during the capture run against a seeded balance, and the receipt in the figure is the one that transaction produced.
What a patron sees on signing in: their own orders, their own balance, their own next appointment. Every query behind this page is scoped to the signed-in customer. Signed in as ahmed.raza@gmail.com at /account.
A customer sees only their own orders. This is enforced in the query, not by hiding rows in the view — the browser suite asserts that another customer's order never appears here. Signed in as ahmed.raza@gmail.com at /account/orders.
Where the patron signs off a specification before cutting begins. Until they do, G3 holds the cutting desk — this screen is the other end of that gate. Signed in as ahmed.raza@gmail.com at /account/orders/approvals.
Stored measurement profiles, and the history of how they have changed. Signed in as ahmed.raza@gmail.com at /account/measurements.
The self-service measurement wizard. Progress is drafted per customer as they go, so a patron who closes the tab half way through does not start again. Signed in as ahmed.raza@gmail.com at /account/measurements/new.
Doorstep measurement and fitting visits, requested and tracked by the customer. Signed in as ahmed.raza@gmail.com at /account/appointments.
Where a patron pays their own advance or balance. The amount is decided by the server — the advance, capped at what is actually outstanding — and not typed in by the customer. Signed in as ahmed.raza@gmail.com at /account/payments.
Alteration requests and their progress, including work under the 15-day fit guarantee. Signed in as ahmed.raza@gmail.com at /account/alterations.
Where a complaint enters the system and becomes a tracked record with an owner. Signed in as ahmed.raza@gmail.com at /account/feedback.
Which channels the patron agrees to be contacted on. Signed in as ahmed.raza@gmail.com at /account/notifications.
Identity and delivery addresses. CNIC and bank fields are encrypted at rest through Laravel's encrypted cast, keyed by APP_KEY. Signed in as ahmed.raza@gmail.com at /account/profile.
The dropdown holds only this customer's own orders. The amount is not an input: the server charges the advance, capped at the remaining balance.
A real payment, taken through the browser during this capture run, against a real seeded balance. The transaction listed on this screen is the one it created — an RCP- receipt number issued by the application, not a mock-up.
The first order in the list is freshly booked and not yet priced. Submitting against it is refused on screen with a plain explanation. This exact path used to be an uncaught 500; it is now a message, and a browser test keeps it that way.
Three widths are supported and all three are tested: 375, 768 and 1440. The figures below are the same screen at each, and each was checked programmatically for horizontal overflow at the moment it was photographed — the check the whole responsive requirement comes down to in practice.
This is a sample rather than the whole proof. Every screen tagged responsive in the browser suite runs at all three widths on every run; that is 261 browser tests, not three pictures.
The same screen at 375px. Checked programmatically during this capture for horizontal overflow: none. The navigation collapses to a drawer below the desktop breakpoint rather than being hidden or scrolled off.
The same screen at 768px. Checked programmatically during this capture for horizontal overflow: none. The navigation collapses to a drawer below the desktop breakpoint rather than being hidden or scrolled off.
The same screen at 1440px. Checked programmatically during this capture for horizontal overflow: none. The navigation collapses to a drawer below the desktop breakpoint rather than being hidden or scrolled off.
What has actually been run against the code these screenshots came from, on 2026-09-05 against PHP 8.2.28. The full procedure, including how to re-run each suite and how to tell a real failure from a saturated dev server, is in 04-TESTING-AND-VERIFICATION.md.
| Suite | What it proves | Result |
|---|---|---|
| Pest — unit & feature | Every screen against every role, the money chain, the state machines | 2716 passed, 0 failed 13,372 assertions |
| Pest — concurrency | Twelve documented races, with real OS processes at a wall-clock barrier | 28 passed, 0 failed |
| Architecture | Module boundaries, no float money, no raw status queries, no hand-built Actions | 267 passed, 0 failed |
| Playwright | A real browser at 375, 768 and 1440 | 262 passed, 0 failed |
| Clean install | migrate:fresh --seed from an empty database | no error |
| Seeded gate integrity | 151 gates re-evaluated from 569 evidence rows | 151 of 151 passing |
Nothing was skipped, deleted or weakened to reach those numbers. A suite that goes green by removing a test proves less than the red one it replaced — and this project has been bitten more than once by a test that passed while covering nothing at all.