Verification ledger — operator guides 00 to 04
Scope: docs-obsidian/user-guide/operator/00-README.md, 01-login-and-warehouse.md, 02-receiving-against-asn.md, 03-blind-receiving-and-returns.md, 04-damage-and-receipt-close.md. Method: static reading only (no server, no build).
Totals: 14 blocks. CONFIRMED 5, CORRECTED 8, UNRESOLVABLE 1. One corrected block (warehouse list) also left a new, narrower open block, so 2 blocks remain in the files.
Paths below are relative to crates/ unless they start with clients/.
| file | original claim | outcome | evidence | action taken |
|---|---|---|---|---|
| 00-README | Unknown whether stage/load/ship/replenishment are planned for RF | UNRESOLVABLE (product decision) | No RF screen: libs/wms-lib-sql/sql/rf-screens/*.sql. Only design mock-ups list Shipping/Replenishment (docs-obsidian/rf/design_handoff_webrf/reference/rf-mock.js:27,29). Admin CRUD only: services/app-server/src/web/rpcs/replenishment_policy_rpc.rs:4-14 | Block rewritten with precise unknown and "ask product owner for RF roadmap" |
| 00-README | Message text is built on the server and may differ | CORRECTED | Most text is server text. Some is worded by the terminal: clients/rf-go/internal/app/submit_context.go:290-298 ("No permission: {method}"), clients/rf-go/internal/app/model.go:2108 and :5180 ("Session expired...", "Invalid username or password") | Block replaced by plain statement; {function} explained as the server command name |
| 00-README | Exact permissions of Operator role unknown | CORRECTED (defaults now stated; admin edits survive) | Defaults: services/app-server/src/web/rpcs/receipt_commands_rpc.rs:40-52, case_level_commands_rpc.rs:18-24, pick_commands_rpc.rs:26-31, pick_assignment_rpc.rs:39-55, packing_rpc.rs:27-35, inventory_count_rpc.rs:46-60, serial_commands_rpc.rs:28-34; baseline grants libs/wms-lib-sql/sql/wms-app/migrations/001_baseline.sql (role 1002 rows); 047_the_floor_runs_rf_receiving.sql; admin edits kept: libs/wms-lib-auth/src/authorization/seeder.rs (ON CONFLICT DO NOTHING) | Block replaced by a list of Operator defaults; move/putaway noted as uneven (see findings) |
| 01-login | Wrong-password message text unknown | CORRECTED | clients/rf-go/internal/app/model.go:5170-5195 ("Invalid username or password", red status, stays on login and the screen stays: rf-screens/005_login_screen.sql:59-63); rf_login=false gives the same answer libs/wms-lib-web/src/handlers/handlers_login.rs:213 | Table row now names the message; rf_login case added |
| 01-login | What happens if the warehouse list fails to load | CORRECTED, plus one open detail | clients/rf-go/internal/jrpc/client.go:477-484 (warn, continue, no warehouse); no header then server uses the sole default warehouse or refuses: libs/wms-lib-core/src/model/user_warehouse.rs:227-234 (warehouse_required); libs/wms-lib-web/src/middleware/mw_auth.rs:275-277 | Behaviour stated as fact. New block keeps only the unknown: the exact on-screen words for warehouse_required. To verify: sign in with a user that has no warehouse, press 1 on Main Menu, read the status line |
| 02-asn | Receipt Closed says "main menu" but screen goes to Receiving menu | CORRECTED (guide text was incomplete) | rf-screens/020_uc_asn_declarative.sql:898-926 (title, onEnter pop_to RCM, prompt text "return to main menu"); RCM title "Receiving" rf-screens/010_uc_rcv_01.sql:63-70 | Guide now says Enter opens the Receiving menu, Esc reaches Main Menu; block deleted |
| 02-asn | How a "Receive anyway?" refusal is answered | CONFIRMED (answer is the terminal's Y/N overlay) | clients/rf-go/internal/app/model.go:2817-2831 (auto prompt for overridable errors), :1262-1305 (Y re-sends with ack, N/Esc "Cancelled"), :4046-4053 ("[Y/N]"); screen comment rf-screens/020_uc_asn_declarative.sql:547-551; operator-ack rule libs/wms-shared/src/validation_codes.rs:537-575 | Block replaced by explanation; two table rows corrected (SKU not on receipt; receipt without LPN) |
| 02-asn | To LPN is prefilled only when the server supplies expected LPN | CONFIRMED (rule made precise) | rf-screens/020_uc_asn_declarative.sql:496-499 (defaultFromExpr), libs/wms-inbound/src/service/receipt/expected_lpn.rs:1-24 | Block replaced by the exact rule |
| 03-blind | Location RETURNS may not exist | CORRECTED | Screen default rf-screens/050_uc_rtn_declarative.sql:205, 055_uc_rtn_multi_line.sql:331. Standard seed creates RETURN (no S) and STAGE: wms-app/migrations/001_baseline.sql:8379,8381. No other seed adds RETURNS | Guide says to change To Loc to the location the supervisor names; also "Cancel Planned Case needs supervisor/manager/admin" (case_level_commands_rpc.rs:24) |
| 03-blind | Message for a location that does not exist | CONFIRMED | libs/wms-inventory/src/deposit/deposit.rs:150-154 ("Invalid location {code}"), surfaced verbatim: libs/wms-inbound/src/error.rs:370-391 | Table row added |
| 03-blind | Full list of case-level messages | CORRECTED (list of the operator-facing ones added) | libs/wms-inbound/src/service/receipt/case_level/commands/receive_case_level_line.rs:249,646,1024,1032; replace_pallet.rs:114,144,173; cancel_planned_case.rs:78,82,108,119,134 | Table of messages added; block deleted |
| 03-blind | RCCASE_LIST exists but nothing opens it | CONFIRMED | rf-screens/080_uc_case_level_declarative.sql:403-464 is the only place the id appears; no target names it in any screen or in clients/rf-go | Block replaced by a plain statement |
| 04-damage | Exact wording of "grant cannot be used" messages | CORRECTED | Prefix override grant is not usable: libs/wms-inbound/src/service/receipt/shared/override_grant.rs:323; reasons override_grant.rs:230-300, libs/wms-inventory/src/movement/override_grant.rs:599-628 | Table row renamed; full list of reasons added |
| 04-damage | Force-Close menu item blocked for non-supervisors? | CONFIRMED | force_close_episode and its picker are Admin/Manager/Supervisor in serial_commands_rpc.rs; Receiving and Picking entries use visibleWhen against the selected warehouse role. The server still checks every RPC. | Operator and Viewer do not see the entry; Admin, Manager and Supervisor do. |
Product findings
- Return location default does not exist in the standard seed. Screens default To Loc to
RETURNS(rf-screens/050_uc_rtn_declarative.sql:205,055_uc_rtn_multi_line.sql:331). The seed createsRETURN(wms-app/migrations/001_baseline.sql:8379). A default install refuses the default value with "Invalid location RETURNS". Fix the screen default or the seed. Fixed (F-26):RCRTN01LINE/RCRTN02LINErev 2 default toRETURN(rf-screens 120). - Receipt Closed prompt lies. It says "Press Enter to return to main menu" (
rf-screens/020_uc_asn_declarative.sql:922-923) butonEnterispop_to RCM(the Receiving menu). Fixed (F-27):RCASN03DONErev 2 says "…to the Receiving menu" (rf-screens 120). - "Receipt without LPN is allowed only via supervisor override" is misleading. The code table lets the operator acknowledge it alone (
libs/wms-shared/src/validation_codes.rs:559-570,ReceiptWithoutLpn => None); the doc comment inlibs/wms-inbound/src/service/receipt/validation/validation_pipeline.rs:86-87also says "supervisor cap". Message, comment and gate disagree. Fixed (F-28): the refusal says "This receive has no LPN" and the terminal asks; the comment follows the gate (meta-ui 150). - Permission mismatch, force-close picker. Fixed (F-25/B1-18).
force_close_episodeandlist_force_close_candidatesshare the Admin/Manager/Supervisor declaration. Enterprise migration 020 grants SUPERVISOR the list on existing databases, and RF hides the menu entry from Operator and Viewer. - Declared defaults disagree with baseline grants.
receipt_receive_against_asnis Admin/Manager inreceipt_commands_rpc.rs:40-43,move_executeis Admin/Manager inmove_command_rpc.rs:26,putaway_suggest_locationandputaway_release_reservationare Admin/Manager inputaway_rpc.rs:42,44. The baseline migration grants all of them to OPERATOR (role 1002,001_baseline.sqlaround lines 19838-19990). Migration 047's header says the router lists "now stand" with the migration, which is true for blind/return/close but not for these. Result depends on whether a database came from the baseline or from the seeder alone. - Operator-facing text with internal wording. A Russian sentence inside the English message at
receive_case_level_line.rs:366("у строки приёмки {} нет упаковки ..."). Messages with internal ids and field names reach the terminal:receive_case_level_line.rs:960("receipt_detail_case {id} flipped by a concurrent scan; retry"),cancel_planned_case.rs:134,replace_pallet.rs:114(old_pallet_lpn),:229. Fixed (F-29): the pallet-replacement refusals and the concurrent-scan error are in the operator's words, the last one now a typed refusal with Russian (meta-ui 150). - "No permission: {function}" shows a server command name (for example
receipt_close,force_close_episode), not a menu name (clients/rf-go/internal/app/submit_context.go:296). Operators cannot map it to a screen. Fixed (F-30): rf-go says "No permission: {screen} ({function})". - Dead screen.
RCCASE_LISTis seeded and granted (wms-app/migrations/047_...sql:29) but no screen navigates to it. Fixed (F-31): removed (owner, 2026-10-13) —F2on RCCASE02 already lists the unreceived cases; rf-screens 121 deletes the seeded screen. - Force-Close item was shown to every user. Fixed (B1-18). rf-go carries the selected warehouse role in session globals, and every seeded Receiving/Picking menu revision gates the entry to Admin, Manager and Supervisor.
Blocks left unresolved
operator/00-README.md(stage/load/ship/replenishment on RF): a product roadmap question. Code has no RF screens for them. To verify: ask the product owner.operator/01-login-and-warehouse.md(words shown forwarehouse_required): needs a running RF terminal. To verify: sign in with a user that has no warehouse assigned, press1on Main Menu, read the status line.