Verification ledger: operator guides 05, 06, 07, 09, 10, 11
Scope: every > Not confirmed by code: block in 05-putaway.md, 06-move.md,
07-inventory-inquiry.md, 09-picking.md, 10-packing-verify.md and
11-troubleshooting-and-messages.md. Method: static reading of code, SQL and seeds only.
Paths are relative to the repository root.
Result: 12 blocks. 11 CONFIRMED, 1 CORRECTED, 0 UNRESOLVABLE. No block is left in these files.
| file | original claim | outcome | evidence | action taken |
|---|---|---|---|---|
| 05-putaway.md | Which role may run putaway. The code lists Admin and Manager. | CONFIRMED (completed: the seeded grants differ from the declaration) | crates/services/app-server/src/web/rpcs/putaway_rpc.rs:42 declares Admin, Manager. crates/libs/wms-lib-sql/sql/wms-app/migrations/001_baseline.sql:19886 (OPERATOR, id 1002) and :19987 (SUPERVISOR, id 1004) grant putaway_suggest_location. Role ids: sql/wms-enterprise/migrations/001_baseline.sql:1417-1423. | Block replaced by a plain sentence: Operator and Supervisor hold it by default; "No permission" means the administrator changed it. |
| 06-move.md | Which role may run Move Stock. The code lists Admin and Manager. | CONFIRMED (same as above) | crates/services/app-server/src/web/rpcs/move_command_rpc.rs:26 declares Admin, Manager. 001_baseline.sql:19882 (OPERATOR) and :19981 (SUPERVISOR) grant move_execute. sql/dev_only/install-db/900-dev-seed.sql:52 says OPERATOR holds move_execute. | Block replaced by a plain sentence. |
| 07-inventory-inquiry.md | How ATP is calculated. | CONFIRMED | View inventory_balance_atp: sql/wms-app/migrations/011_a_hold_says_what_it_forbids.sql:77-135. ATP = max(qty - allocated - picked - (qty if an active, outbound-blocking hold matches lot, location or pallet), 0). Rust doc: crates/libs/wms-lib-core/src/model/inventory/inventory_balance_atp.rs:1-5. The list shows ATP only when it differs from qty: sql/rf-screens/090_uc_inv_inquiry.sql:217. | Block replaced by a plain explanation of ATP. |
| 09-picking.md | Which pick work areas the user may take. | CONFIRMED | Per-operator, per-task-type, per-work-area rights table: crates/libs/wms-lib-core/src/model/tasks/operator_task_permission.rs:155-181 (read on every claim, equipment zone exclusions removed). Refusal: crates/libs/wms-tasks/src/service/claim.rs:108-161; text: crates/libs/wms-tasks/src/error.rs:41-52. | Block replaced. States that the supervisor grants the rights, the check runs on every request, and the terminal shows no list. |
| 09-picking.md | Text on the line above Current loc (for example when there is no work). | CONFIRMED | PICK01 sets No eligible Pick work: sql/rf-screens/094_uc_pick.sql:73, 095_uc_pick_assignment.sql:143, 101_uc_pick_drop_close.sql:616. PKA00 area dispatch sets No eligible Pick work in the area: 095_uc_pick_assignment.sql:321, 101_uc_pick_drop_close.sql:727. Server refusals go to the same status area (clients/rf-go/internal/app/model.go:2785-2860, handleServerError). | Block replaced with the two texts. |
| 09-picking.md | Valid short-reason codes. | CONFIRMED | Seeded published codes: SHORT (sql/wms-app/migrations/036_pick_short_reason.sql:85-91), LPN_NOT_FOUND, WRONG_LOCATION (071_count_on_scan_and_putaway_exceptions.sql:22-30, LPN_NOT_FOUND has allow_partial = false). Admins can add or retire codes (crates/services/app-server/src/web/rpcs/pick_short_reason_rpc.rs:20-22). | Block replaced with the three seeded codes and a note that a warehouse may differ. |
| 09-picking.md | When the terminal asks for a carrier (Scan Carrier) and when it gives a single pick (Pick Work). | CONFIRMED | crates/libs/wms-outbound/src/picking/commands/dispatch_next.rs:225-300: live or undelivered carrier job first (Resume); no area named gives a discrete task; area named: policy carrier_required false gives a discrete task in the area; true gives a held task if any, else ScanCarrier. | Block replaced with the decision order in plain words. |
| 10-packing-verify.md | What happens to a reported box after Report. Guide also said "the box is removed from your queue". | CORRECTED | exception_report.rs (crates/libs/wms-outbound/src/packing/commands/exception_report.rs:1-20, insert at about :110) writes only an open, blocking exception. No unit, carton or stock change. The queue lists units with status Pending (crates/libs/wms-lib-core/src/model/outbound/outbound_flow_unit.rs, station_queue, about :410-430). The claim does not change status (crates/libs/wms-outbound/src/flow/advance.rs:45-60). So the box stays in Waiting. Screen text: sql/rf-screens/103_uc_pack_verify.sql:260. | Removed the false line. Text now says the box stays in Waiting, the report is stored open and blocks the order, no stock changes. |
| 11-troubleshooting-and-messages.md | What the operator sees when the connection to the server is lost. | CONFIRMED | Transport error becomes jrpc transport: ... (clients/rf-go/internal/jrpc/client.go:318-319), shown as the red status text (clients/rf-go/internal/app/model.go:5196-5205, 2785-2860). 10 s timeout: client.go:44. 401: Session expired. Please sign in again. (model.go:2107-2108). | Block replaced with the visible behaviour, the 10 s limit and the session-expired text. |
| 11-troubleshooting-and-messages.md | Which data fields each kind of label fills on each screen. | CONFIRMED | Screens: sql/rf-screens/106_uc_structured_barcode_scan.sql:78,153,231,299,373 (gtin to SKU, serial to serial field), :427,486 (lpn to LPN on INVINQ01, INVMOV01). Element naming: crates/libs/wms-inventory/src/barcode_scan.rs:360-385 (AI 00 to LPN, 01/02 to GTIN, 21 to serial, 10/11/12/13/15/16/17 to lot attributes). Seeded formats: sql/wms-app/migrations/086_barcode_formats_follow_gs1.sql. | Block replaced with a table for the standard GS1 formats, plus a note that stored formats can change. |
| 11-troubleshooting-and-messages.md | How WebRF maps keys on a phone. | CONFIRMED | clients/rf-go/web/src/components/Footer.tsx:4-22 (one button per footer key, tap sends the key, no focus steal), web/src/keys.ts:1-30,95-125 (which keys are sent), web/src/styles.css:73 (48 px touch target). | Block replaced with the phone and keyboard behaviour. |
| 11-troubleshooting-and-messages.md | Where support looks for the failed-action entries. | CONFIRMED (default location; the exact folder is per installation) | crates/services/app-server/src/logger.rs:208-213 (logs/app-server.log.YYYY-MM-DD, daily, JSON). Terminal: clients/rf-go/internal/rflog/logger.go:44 (rf-terminal.YYYY-MM-DD.log), folder default logs (clients/rf-go/internal/config/config.go:76). Layer 1 fields: docs-obsidian/architecture/logging.md. | Block replaced with the default file names. Tells the reader to ask support for the real folder. |
Product findings
- Declared roles disagree with seeded grants for
move_executeandputaway_suggest_location.putaway_rpc.rs:42andmove_command_rpc.rs:26sayroles = [Admin, Manager]. The baseline seed grants the same methods to OPERATOR and SUPERVISOR (sql/wms-app/migrations/001_baseline.sql:19882,19886,19981,19987), and the dev seed relies on it (sql/dev_only/install-db/900-dev-seed.sql:52). RF operators work only because of the seed row. The declaration is the thing the auto-seeder and the permission catalogue read (crates/services/app-server/src/web/rpcs/catalog.rs:430), so it is misleading. Also, the same two methods are the only ones an RF operator needs, yetputaway_release_reservation(putaway_rpc.rs:44) is Admin/Manager only while the RF putaway screen calls it (sql/rf-screens/093_uc_putaway.sql:335). Baseline grants it to OPERATOR (001_baseline.sql:19885), so it works, but only by the seed. - Packing discrepancy has no way to be settled in code. The report writes an open, blocking
packing_exception(exception_report.rs), and the screen promises "the order waits for recovery" (sql/rf-screens/103_uc_pack_verify.sql:260). The only packing commands present are open work, close, void, reopen and report (crates/libs/wms-outbound/src/packing/commands/). Nothing sets an exception to a closed status (PackingExceptionStatus::is used nowhere outside the model). The comment inexception_report.rs:10-11refers to a later slice (E). Until it exists, a reported order cannot become Packed. - A reported box stays in the pack queue. The unit stays
Pending(outbound_flow_unit.rsstation_queue,advance.rs:45-60), so the box shows again under Waiting and can be scanned and closed. Close is blocked from marking the order Packed only throughjudge_packed. The PACK04 header comment says nothing about taking the unit out of the queue. If the product intent is "put the box aside", the queue should hide it. - Wrong-password text is worded by the terminal, not by the server:
Invalid username or password(clients/rf-go/internal/app/model.go:5180). This closes the "exact text of a wrong-password message" block in01-login-and-warehouse.md(not in my scope;00-README.md:58already lists the text). - Wording nit in the file header of
clients/rf-go/internal/app/errors.go:3-6: it names a source fileerror.rsunderrfmanagement/receipt/services/in the cratewms-business-logicthat no longer exists (therfmanagement/folder was renamed toservice/on 2026-07-30 per.claude/CLAUDE.md).
Blocks left unresolved
None.