Copy that sounds complete before work is settled can lead to the wrong next action. Capability registration, actual execution, delivery and result checking are different events. I made an independent Korean/English copy module from those distinctions, operating only on declared synthetic states.
Define meaning before choosing a sentence
Status is registered, prepared, running, waiting, needs_review, succeeded, failed or cancelled. Delivery, result and receipt are separate inputs. Registration or preparation declared alongside delivery is rejected. Succeeded requires delivery, a matching result and the final-record condition together.
The function does not read an executor to establish those facts. It refuses contradictory declarations and chooses copy for the accepted declaration. Original_evidence_verified always stays false. Receiving booleans does not certify the original site's result. An operational connection needs a trusted state supplier and a separate contract explaining which actual checks produced the declaration.
Do not lend completion language to registration or waiting
Registered says the definition is saved and has not run. Prepared describes inputs not yet delivered. Running and waiting direct attention to reading the existing execution. Neither a new button nor waiting for a response receives a completion label.
Needs review does not instruct resending the same request. It points first to the original delivery and result. Resend_authorized never becomes true under any state. Copy must not create execution authority. Whether to begin a genuinely new request depends on current material, human intent and delivery evidence outside this small presentation function.
Keep the delivery boundary in stop copy
A stop before delivery says precisely that. A stop after delivery states that prior actions were not undone, while unknown delivery remains unconfirmed. All can share a Stopped heading while their body explains different remaining effects.
An observer may stop before a result is later checked. Cancelled can retain a matching-result declaration without turning the old run into success. Needs_review also does not clear automatically when a later match is supplied. This is no state-transition engine. Presentation remains a narrow role that cannot rewrite the operational history simply by choosing more optimistic words.
Explore the implementation
Complete independent synthetic implementation
"""Localize a declared synthetic state. Does not execute or certify any action."""
STATES=frozenset({'registered','prepared','running','waiting','needs_review','succeeded','failed','cancelled'})
DELIVERY=frozenset({'none','sent','unknown'})
RESULTS=frozenset({'unchecked','match','mismatch','unavailable'})
RECEIPTS=frozenset({'missing','recorded'})
COPY={
'ko':{
'registered':('등록됨','기능 정의가 저장됐습니다. 아직 실행하지 않았습니다.','이번 입력과 대상을 확인하세요.'),
'prepared':('실행 준비','입력이 준비됐습니다. 아직 전달하지 않았습니다.','이번 작업의 실행 범위를 확인하세요.'),
'running':('실행 중','기존 실행이 진행 중입니다.','같은 실행의 상태를 읽으세요.'),
'waiting':('결과 대기','기존 실행의 결과를 기다리고 있습니다.','기존 결과를 읽으며 기다리세요.'),
'needs_review':('결과 확인 필요','완료 근거가 확정되지 않았습니다.','기존 전달과 결과를 먼저 읽어 확인하세요.'),
'succeeded':('결과 확인됨','선언된 결과 확인과 마지막 기록 조건이 맞습니다.','확인한 결과를 살펴보세요.'),
'failed':('전달 전 실패','전달하기 전에 실행이 끝났습니다.','실패 단계와 현재 입력을 확인하세요.'),
'cancelled':('중지됨','실행을 멈췄습니다.','현재 남아 있는 결과를 확인하세요.'),
'history':'이전 실행 · ',
'cancel_none':'전달 전에 실행을 멈췄습니다.',
'cancel_sent':'실행을 멈췄습니다. 이미 전달한 행동은 되돌리지 않았습니다.',
'cancel_unknown':'실행을 멈췄습니다. 전달 여부는 아직 확인되지 않았습니다.',
},
'en':{
'registered':('Registered','The capability definition is saved. It has not run.','Check the current inputs and target.'),
'prepared':('Prepared','Inputs are prepared and have not been delivered.','Check the requested execution scope.'),
'running':('Running','The existing execution is progressing.','Read the same run status.'),
'waiting':('Waiting for result','The existing execution is awaiting its result.','Wait by reading the existing result.'),
'needs_review':('Result needs review','Completion evidence is not settled.','Read the original delivery and result first.'),
'succeeded':('Result checked','The declared result and final-record conditions match.','Inspect the checked result.'),
'failed':('Failed before delivery','Execution ended before delivery.','Check the failed stage and current inputs.'),
'cancelled':('Stopped','Execution was stopped.','Inspect the outcome that remains.'),
'history':'Previous run · ',
'cancel_none':'Execution stopped before delivery.',
'cancel_sent':'Execution stopped. Previously delivered actions were not undone.',
'cancel_unknown':'Execution stopped. Delivery is still unconfirmed.',
}}
def describe(*,status,delivery='none',result='unchecked',receipt='missing',history=False,lang='ko'):
for value,allowed in [(status,STATES),(delivery,DELIVERY),(result,RESULTS),(receipt,RECEIPTS),(lang,frozenset(COPY))]:
if type(value) is not str or value not in allowed:raise ValueError('INVALID_STATE')
if type(history) is not bool:raise ValueError('HISTORY_BOOLEAN_REQUIRED')
if status in {'registered','prepared'} and (delivery!='none' or result!='unchecked' or receipt!='missing'):raise ValueError('PREPARATION_CONTRADICTION')
if result in {'match','mismatch'} and delivery!='sent':raise ValueError('RESULT_WITHOUT_DELIVERY')
if receipt=='recorded' and not(delivery=='sent' and result=='match'):raise ValueError('RECEIPT_WITHOUT_MATCH')
if status=='succeeded' and not(delivery=='sent' and result=='match' and receipt=='recorded'):raise ValueError('SUCCESS_UNPROVEN')
if status=='failed' and delivery!='none':raise ValueError('DELIVERED_FAILURE_NEEDS_REVIEW')
if status in {'running','waiting'} and (result!='unchecked' or receipt!='missing'):raise ValueError('ACTIVE_RESULT_CONTRADICTION')
c=COPY[lang];label,message,next_step=c[status]
if status=='cancelled':message=c['cancel_'+{'none':'none','sent':'sent','unknown':'unknown'}[delivery]]
return dict(status=status,label=(c['history'] if history else '')+label,message=message,next_step=next_step,
aria_live='off' if history else 'polite',history=history,lang=lang,
state_changed=False,action_executed=False,resend_authorized=False,
original_evidence_verified=False,localization_scope='declared_synthetic_state')
Do not announce a historical failure as current progress
History true adds a Previous run prefix and sets aria_live off. It is suggested metadata to avoid repeatedly announcing an old record like current activity. History is caller-declared; the function does not compare real timestamps or task identities.
Korean and English copy is provided without accepting raw error_message. This is neither arbitrary-log translation nor sensitive-value removal. Twenty-eight tests cover contradictory completion, stop boundaries, historical labeling and independent returned values. Five records come from actual local calls, with tests repeated after ZIP extraction. That does not constitute rendered-screen or screen-reader accessibility verification.
Adapt the state contract before adapting the words
Code, tests and record generation permit reuse and modification. Orders, publishing and ERP need their own meanings for delivery, verification and recording. Matching status names in another app do not automatically make this synthetic contract appropriate.
The example handles no network, files, authentication, execution, repair or persistent journal. State_changed and action_executed remain false. The useful property is not a larger collection of success messages but a distinction that helps a person understand the next check. Friendly copy still depends on an accurate account of completion evidence and effects remaining after a stop. I share that criterion together with the words.