# -*- coding: utf-8 -*-
"""Task-owned durable receipt and index updates; no business-code mutations."""
import csv,json
from pathlib import Path
from datetime import datetime
from zoneinfo import ZoneInfo
HERE=Path(__file__).resolve().parent
ROOT=HERE.parents[2];topic=HERE.parent
now=datetime.now(ZoneInfo('Asia/Shanghai'));stamp=now.strftime('%Y-%m-%d %H:%M +0800')
final=json.loads((HERE/'final-readback.sanitized.json').read_text())
commits=json.loads((HERE/'commits.sanitized.json').read_text())
receipt='''# 档口云打印代码与云效交付记录

2026-10-15，用户授权创建需求、拆分任务、关联代码、登记工时并指派兰海军；随后明确 MR 由用户自行创建。本轮仅提交并推送两个业务仓库当前 develop_binzhou 到同名 origin 分支，不创建 MR、不新建代码工作树、不推 release、不合并或生产部署。

| 工作项 | 内容 | 当前状态 | 负责人 | 预计工时 | 已登记实际工时 |
| --- | --- | --- | --- | --- | --- |
'''
for key,estimate,actual in [('parent','汇总16h','汇总3.4h'),('analysis','4h','1.5h'),('development','8h','1.1h'),('validation','4h','0.8h')]:
 r=final[key]
 receipt+=f"| [{r['serialNumber']}]({r['url']}) | {r['subject']} | {r['status']['name']} | 兰海军 | {estimate} | {actual} |\n"
receipt+='''
## 代码

'''
for repo,c in commits.items():
 receipt+=f"- {repo}：[{c['sha'][:9]}]({c['url']})，分支 `{c['branch']}`；Codeup元数据与git ls-remote SHA已核对，推送后本地干净。\n"
receipt+='''
父需求、开发任务、测试任务各回读2条codeupCommit关联；分析任务关联父需求UC与方案，不伪造代码提交。提交标题均以#VWCG-1447加空格开头。store提交含正式升级SQL db/v2/v2.36.6.sql，用户已在开发库执行；没有生产DDL。

## 规则与验证

采用已确认方案V0.5：档口类型下方三开关默认全开，保存立即生效；source=7点餐机预定、source=4手机选菜、source=2菜单消费，均要求存在实际菜品明细。来源1/3/5/6/8及未知、补单、金额付款和全custom_dish/package_fee明细排除自动打印。只替换stall_type的云端自动打印资格；ydy_equipment.print_receipt、人工补打及原模板、份数、内容继续原规则；设备本机出票范围外。

开发库专项7项909断言通过；保留8档口、213订单、217明细、2取餐记录。PC实际登录保存0/0/0及1/0/1回显与跨库读取通过。提交前复核store MealOrder 72项507断言（7可选集成跳过，已在开发库专项执行）、档口编辑5项24断言、一卡通11项38断言、ai_api8案例、Vue3项均通过。详细原业务回归及范围外既有失败见[dev-validation.md](../dev-validation.md)。外部支付/打印和特殊锁使用替身，不代表真实扣款、物理出纸、Redis并发或生产验收。

## 工时与云效回读

预计4/8/4小时按无AI投入估算；实际按本线程root各有效执行时段登记，排除用户等待，不叠加并行子代理。原始审计秒数见effort-timeline与actual-effort-plan；云效保留一位小数：分析1.5、实现0.6、测试0.8、提交收尾0.5，共3.4小时（收尾截止2026-10-15 19:13:03 +0800）。未将后续文档收尾时间追加为估计工时。

实际工时接口使用operatorId指定兰海军并逐条回读owner；早期owner参数被接口忽略导致默认账号和小数精度差异，已更新同一记录纠正，没有重复登记。官方接口依据：[UpdateEffortRecord](https://help.aliyun.com/zh/yunxiao/developer-reference/updateeffortrecord)。

父需求和三个任务均回读兰海军、计划日期、预计工时、实际工时、状态和交付评论；正文按RICHTEXT渲染HTML，保留完整Use Case与子任务执行切片。父需求待测试，子任务开发完成；不把软件回归通过等同于生产完成。

## Harness与审查

复用已缓存Ruflo3.38.20，隔离目录位于外部运行根的ruflo-stall-receipt-validation-20261015/submission-harness。三个角色登记由真实主执行者和两个只读Codex角色承担；回归角色实际重跑ai_api8案例，审查角色核验范围、代码和云效证据。Ruflo登记本身不计为执行或测试证据。度量见task-metrics.csv。

## 交付入口

[评审原型](https://zhctpmt.yyangpt.cn/work_store/20261015-standard-stall-receipt-control/prototype.html)、[已确认方案](../plan-v2.md)、[开发库验收](../dev-validation.md)。MR留给用户；如后续创建，源分支develop_binzhou、目标release，按两个仓库分别提交，并补充MR关联。

证据：commits.sanitized.json、code-relations.sanitized.json、actual-effort-readback.sanitized.json、final-readback.sanitized.json。items.sanitized.json为最初创建快照，最终状态以final-readback为准。无token、数据库密码或完整私有请求载荷。
'''
(HERE/'submission.md').write_text(receipt)
p=topic/'README.md';s=p.read_text()
s=s.replace('store、ai_api 的 develop_binzhou 本地源码已完成，未提交业务代码、未部署、未执行生产 SQL。','store、ai_api 的 develop_binzhou 已提交并推送同名远程分支；云效VWCG-1445及子任务1446～1448已建立、关联代码并登记工时，均指派兰海军。MR由用户自行创建，未部署或执行生产SQL。最新交付回读见[yunxiao/submission.md](yunxiao/submission.md)。')
s=s.replace('尚未进行已部署完整环境HTTP保存和实际出票验收。','已完成开发库环境PC实际HTTP保存回显，尚未进行物理出票和生产验收。')
s=s.replace('云效只核到范围不同的五场景VWCG-1414，未读取其实现、未覆盖其描述或状态、未创建重复需求，本次不宣称已完成云效同步或正式发布门禁。','既有五场景VWCG-1414不在本次范围，未读取其实现或覆盖它；本次三个开关独立登记VWCG-1445，子任务1446～1448。代码/工时/状态/评论已回读，MR由用户自提，正式发布门禁尚未执行。')
p.write_text(s)
latest=f'> {stamp} 档口云打印：VWCG-1445待测试、子任务1446/1447/1448开发完成，均兰海军；预计16h、实际已登记3.4h。store 62ad186fb、ai_api bdffa846已推送origin/develop_binzhou并关联真实commit。用户明确MR自行创建；未推release/合并/部署。最新证据 `work_store/20261015-standard-stall-receipt-control/yunxiao/submission.md`，覆盖下方历史阶段状态。'
for rel in ['HEARTBEAT.md','tasks/QUEUE.md']:
 p=ROOT/rel;s=p.read_text();lines=s.splitlines();lines[1:1]=['',latest];p.write_text('\n'.join(lines)+'\n')
p=ROOT/'work/team-learning/thread-records/2026-10-15/standard-stall-receipt-control.md'
p.write_text(p.read_text()+f'\n## {stamp} 云效与代码交付\n\n用户要求创建需求、拆分任务、关联代码、登记工时并指派兰海军；随后明确MR自提。已建立VWCG-1445及1446/1447/1448，均兰海军；父待测试、子开发完成。两仓库develop_binzhou提交推同名远程，store62ad186fb、ai_api bdffa846；2条真实commit关联回读，预计16h、实际3.4h。无MR、无release推送或生产变更。当前执行模式为隔离Ruflo与真实只读审查/回归角色，早期只读讨论记录保留为历史。详见`work_store/20261015-standard-stall-receipt-control/yunxiao/submission.md`。\n')
p=HERE/'authorization.md';s=p.read_text();s=s.replace('按云效Codeup提交流程关联真实提交和2个release目标MR；不合并、不部署、不执行生产SQL。原develop_binzhou工作区及开发库保留数据不动，独立工作树整理提交。','最初讨论拟整理两个release目标MR，随后用户明确覆盖为MR自行创建。实际仅提交两个既有develop_binzhou分支并推送同名远程，不建新代码工作树；开发库保留数据不动，不合并、部署或执行生产SQL。');p.write_text(s)
index=ROOT/'control/task-index/items/20261015-standard-stall-receipt-analysis.tsv'
with index.open() as f:reader=csv.DictReader(f,delimiter='\t');headers=reader.fieldnames;row=next(reader)
row.update(task_id='VWCG-1445',source='用户确认;云效VWCG-1445;子1446/1447/1448',target_branch='release',task_branch='develop_binzhou',commit='store:62ad186fb;ai_api:bdffa846',mr_url='n/a',status='待测试;均兰海军;真实commit已关联;预计16h实际3.4h;MR用户自提;未部署',evidence_path='work_store/20261015-standard-stall-receipt-control/yunxiao/submission.md',updated_at=stamp)
with index.open('w') as f:w=csv.DictWriter(f,fieldnames=headers,delimiter='\t',lineterminator='\n');w.writeheader();w.writerow(row)
for key in ['analysis','development','validation']:
 r=final[key];child=row.copy();child.update(task_id=r['serialNumber'],title=r['subject'],source='父需求VWCG-1445',commit='n/a' if key=='analysis' else row['commit'],status='开发完成;兰海军;MR用户自提;详交付回读')
 with (index.parent/(r['serialNumber']+'.tsv')).open('w') as f:w=csv.DictWriter(f,fieldnames=headers,delimiter='\t',lineterminator='\n');w.writeheader();w.writerow(child)
# Strip unrelated creator/modifier account metadata from this task's JSON snapshots.
def clean(x):
 if isinstance(x,dict):return {k:clean(v) for k,v in x.items() if k not in ['creator','modifier']}
 if isinstance(x,list):return [clean(y) for y in x]
 return x
for p in HERE.glob('*.sanitized.json'):
 p.write_text(json.dumps(clean(json.loads(p.read_text())),ensure_ascii=False,indent=2)+'\n')
print('Updated task-owned delivery documentation and four index rows')
