chore(plating): de-dash shipped code + intake-neutral customer emails

Replace em-dashes and en-dashes with hyphens across 789 shipped source
files (py/xml/js/scss) so the delivered module reads as human-written;
em-dashes had become a recognizable AI-generated tell. Internal .md dev
notes are excluded. The WO-sticker mojibake strippers keep their dash
search targets (now written — / –). No logic changes: comments
and display strings only; validated with py_compile + lxml parse.

Rewrite the 7 customer notification emails to be intake-neutral
(ship-in / drop-off / pickup) and repair-aware, and fix the Shipped
email documents line (packing slip vs bill of lading; certificate only
when issued). Subjects use a hyphen separator.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-06-05 00:16:19 -04:00
parent c9eb61ee0c
commit 8c76a16366
789 changed files with 4692 additions and 4692 deletions

View File

@@ -1,4 +1,4 @@
# Battle test real shop failure modes.
# Battle test - real shop failure modes.
#
# This is the "what if my operator is sloppy / forgetful / lazy" suite.
# We document what the system does TODAY, then identify what's missing.
@@ -41,7 +41,7 @@ def make_job(po_suffix):
# ====================================================================== 1
print('='*72)
print('SCENARIO 1 Carlos forgot to click Start. Realizes 2 hours later.')
print('SCENARIO 1 - Carlos forgot to click Start. Realizes 2 hours later.')
print('='*72)
job = make_job('S1-' + fields.Datetime.now().strftime('%H%M%S'))
step = job.step_ids.sorted('sequence')[0]
@@ -58,7 +58,7 @@ print(f' GAP: No "Adjust Time" affordance for forgetful operators.')
# ====================================================================== 2
print()
print('='*72)
print('SCENARIO 2 Carlos finished step physically. Forgot Finish. Went home.')
print('SCENARIO 2 - Carlos finished step physically. Forgot Finish. Went home.')
print('='*72)
job = make_job('S2-' + fields.Datetime.now().strftime('%H%M%S'))
step = job.step_ids.sorted('sequence')[0]
@@ -77,7 +77,7 @@ print(f' GAP: No way to retroactively correct the timelog interval.')
# ====================================================================== 3
print()
print('='*72)
print('SCENARIO 3 Two operators tap Start on the same step.')
print('SCENARIO 3 - Two operators tap Start on the same step.')
print('='*72)
job = make_job('S3-' + fields.Datetime.now().strftime('%H%M%S'))
step = job.step_ids.sorted('sequence')[0]
@@ -97,7 +97,7 @@ except Exception as e:
# ====================================================================== 4
print()
print('='*72)
print('SCENARIO 4 Operator finishes step #6 before #5 is started.')
print('SCENARIO 4 - Operator finishes step #6 before #5 is started.')
print('='*72)
job = make_job('S4-' + fields.Datetime.now().strftime('%H%M%S'))
steps = job.step_ids.sorted('sequence')
@@ -119,7 +119,7 @@ print(f' But there\'s no "force serial" flag for steps that MUST be in order.')
# ====================================================================== 5
print()
print('='*72)
print('SCENARIO 5 Job stuck mid-process. Manager wants to take over.')
print('SCENARIO 5 - Job stuck mid-process. Manager wants to take over.')
print('='*72)
job = make_job('S5-' + fields.Datetime.now().strftime('%H%M%S'))
step = job.step_ids.sorted('sequence')[0]
@@ -141,7 +141,7 @@ print(f' Bob finishes: state={step.state}, finished_by={step.finished_by_user_i
# ====================================================================== 6
print()
print('='*72)
print('SCENARIO 6 Bake window expired (operator at lunch). Override?')
print('SCENARIO 6 - Bake window expired (operator at lunch). Override?')
print('='*72)
BW = env['fusion.plating.bake.window']
Bath = env['fusion.plating.bath']
@@ -169,7 +169,7 @@ except Exception as e:
# ====================================================================== 7
print()
print('='*72)
print('SCENARIO 7 Operator clocks 6 hours on a step expected to take 30 min.')
print('SCENARIO 7 - Operator clocks 6 hours on a step expected to take 30 min.')
print('='*72)
job = make_job('S7-' + fields.Datetime.now().strftime('%H%M%S'))
step = job.step_ids.sorted('sequence')[0]
@@ -186,7 +186,7 @@ print(f' GAP: System silently accepted 12x overrun. No alert, no chatter post.'
# ====================================================================== 8
print()
print('='*72)
print('SCENARIO 8 Operator did 4 of 5 parts. 1 contaminated. Qty drift.')
print('SCENARIO 8 - Operator did 4 of 5 parts. 1 contaminated. Qty drift.')
print('='*72)
job = make_job('S8-' + fields.Datetime.now().strftime('%H%M%S'))
print(f' Job qty={job.qty}, qty_done={job.qty_done}, qty_scrapped={job.qty_scrapped}')
@@ -196,7 +196,7 @@ for s in job.step_ids.sorted('sequence'):
s.button_start()
if s.state == 'in_progress':
s.button_finish()
# Try to mark done qty_done is still 0
# Try to mark done - qty_done is still 0
try:
job.button_mark_done()
print(f' Job done: qty_done={job.qty_done}, qty_scrapped={job.qty_scrapped}')