| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- """Prepare classroom closeout handoff locally; no API or production writes."""
- from pathlib import Path
- import hashlib
- import json
- ROOT = Path(__file__).resolve().parents[1]
- DOCS = Path('F:/文档/工作坊当前资料')
- OUT = ROOT / 'work/S5-classroom-completion-20261103'
- BASE = 'KSF-真实资料-20261102-01'
- assert not OUT.exists()
- OUT.mkdir()
- accepted = json.loads((ROOT / 'work/live-S5-independent-acceptance-20261103.json').read_text(encoding='utf-8'))
- assert accepted['contentAndPageAccepted'] and accepted['browserVerified']
- assert accepted['executionConformsToFixedRequestIds'] is False
- report = json.loads((ROOT / 'work/S5-classroom-next-20261103/03-project-S5-save.template.json').read_text(encoding='utf-8'))
- assert len(report['pendingQuestions']) == 13
- def put(name, text):
- with (OUT / name).open('x', encoding='utf-8', newline='\n') as stream:
- stream.write(text)
- def put_json(name, obj):
- put(name, json.dumps(obj, ensure_ascii=False, indent=2) + '\n')
- note = '课堂任务完成:S1至S5公开资料流程成果及S5方案/报告已保存并独立验收;项目沿用S_CikxZeBs,概念QO0uo8nisk,报告tLkz2MAoIw。13项研究/设计未决问题全部保留;完成不代表普遍需求已证实、实物/市场/量产验证、员工确认、正式发布或企业批准。S5报告实际保存requestId与54号存在偏差,已在55号留档,不补跑保存。'
- template = {'sessionId': None, 'projectId': None, 'toStage': 'S5', 'state': 'completed', 'note': note}
- assert len(note) <= 500
- put_json('01-project-complete.template.json', template)
- template_bytes = (OUT / '01-project-complete.template.json').read_bytes()
- template_hash = hashlib.sha256(template_bytes).hexdigest()
- steps = [
- {'step': 1, 'command': 'project-status', 'requestId': BASE + ':portion-fit-project:completion:precheck:v1', 'inputFile': '00-project-status.json'},
- {'step': 2, 'command': 'project-progress', 'requestId': BASE + ':portion-fit-project:complete:v1', 'inputFile': '01-project-complete.json'},
- {'step': 3, 'command': 'project-status', 'requestId': BASE + ':portion-fit-project:completion:read-final:v1', 'inputFile': '00-project-status.json'},
- ]
- runbook = {
- 'sessionId': 'btrFqkz0yw', 'projectId': 'S_CikxZeBs', 'opportunityId': 'QE9hjtCj8E',
- 'conceptId': 'QO0uo8nisk', 's5ArtifactId': 'tLkz2MAoIw', 's5OutputSourceId': '5zsPtYFL1u',
- 'projectArtifactIds': ['XF4h-Z7l5o', 'U3_W7WDliP', 'tLkz2MAoIw'],
- 'existingEventIds': ['GGDTcg5YTy', 'RkkTTE_xeb', 'hOFghbcMsY', 'VlGFu_jv4b', '0ya0a03U9G', 'qKnPnVkZA8', 'iUs3JwZ9Kf'],
- 'pendingQuestions': report['pendingQuestions'],
- 'steps': steps,
- 'remoteTemplateDirectory': '/opt/data/ksf-executor-20261103/S5-classroom-completion-01',
- 'remoteReceiptDirectory': '/opt/data/ksf-workshop-private/S5-classroom-completion-01',
- 'templateSha256': template_hash,
- 'expectedBefore': {'stageCode': 'S5', 'progressState': 'in_progress', 'artifactCount': 3, 'eventCount': 7, 'conceptCount': 1, 'pendingQuestionCount': 13},
- 'expectedAfter': {'stageCode': 'S5', 'progressState': 'completed', 'artifactCount': 3, 'eventCount': 8, 'lastEventType': 'completed', 'conceptCount': 1, 'pendingQuestionCount': 13, 'enterpriseApproval': False},
- 'retainedS5SaveRequestIdDeviation': accepted['requestIdDeviation'],
- 'prohibitedOperations': ['workshop-save', 'concept-save', 'project-create', 'workshop-import', 'report-submit'],
- }
- put_json('runbook.json', runbook)
- review = '''# 课堂总结与完成条件
- 2026年11月3日。当前生产状态仍为S5 / in_progress。本轮准备课堂收尾,不把软件课堂任务完成扩写为研究、企业审批或上市完成。
- | 阶段 | 已留存成果 | 本轮判断 |
- |---|---|---|
- | S1 品类资料 | G8IrkkDG7X,第2版 | 资料小结已保存、验收;市场数字和在售边界沿用原结论 |
- | S2 用户线索 | b7NOby5ys0,第1版 | 4篇历史个体自述,不证明普遍需求 |
- | S3 假设与选题 | ZW1FB5zeHr;候选V2z4ox7Ehx;项目基线XF4h-Z7l5o | 用户选择燃魂份量与用餐目的适配;机会QE9hjtCj8E、项目S_CikxZeBs已互链 |
- | S4 桌面评估 | U3_W7WDliP,第1版 | 完成公开资料核对和缺口评估;没有实物/市场验证结果 |
- | S5 桌面方案 | 概念QO0uo8nisk及报告tLkz2MAoIw,第1版 | 内容与电脑/手机生产页面已通过55号验收;未知规格、空配方/工艺及13未决项保留 |
- 完成条件:同一项目处于S5;当前概念存在且正确关联;项目S3/S4/S5三份成果齐备;原七事件无重复、无completed;13问题逐字保留;执行键偏差如实留档。上述条件满足时,现网project-progress允许在S5将state记为completed。实际写入须由王刚001在可信真实消息身份下执行58号,运维只负责57号落地与只读预检。准备或模拟通过不代表生产已完成。
- 本轮不新建总结报告、不另存S5版本,不增加来源、概念、机会卡或项目;只拟新增一条completed事件和一条成功写入审计,并更新既有项目/会话进度。完成事件的note记录课堂边界和历史偏差。
- ## 需要保留的执行问题
- S5报告实际保存requestId为KSF-真实资料-20261102-01:portion-fit-project:S5:save:v1,54号规定为KSF-真实资料-20261102-01:S5:save:v1。55号已经独立定位成功审计;不得用规定键补跑。下次交接可附远端实际第06步原命令/回执说明原因;不要为查明原因重新执行命令。这个未解释的偏差继续作为流程问题保留,不将课堂收尾写成“全程完全符合执行单”。
- S4第08步历史本地USAGE失败和后续原键恢复回执仍保留。S5本轮执行计数为3个写命令、5个读命令;报告为5章15节5张表。手机窄列表格、商品页人数未知标签及长出处横滚问题未修复。
- ## 研究和设计未决项(逐字沿用)
- '''
- review += '\n'.join(f'{i}. {q}' for i, q in enumerate(report['pendingQuestions'], 1))
- review += '''
- 研究后续可分两路:信息理解研究可先制作明确标为概念稿的布局,再预先确定对象、方法和判据;实物份量研究在实际研究时明确商品、样品、资源与操作条件。这里没有执行研究、采购、招募或试吃。课堂completed不清空问题,不认定未决项已经解决。
- 正式员工确认与报告发布沿用各自真人确认流程,不能用课堂completed替代;企业批准和研发量产依据仍未知。当前研究资料缺口不阻塞已经具备成果的课堂收尾,也不要求用户先提供实物才能测试软件流程。
- '''
- put('56-课堂总结与完成条件.md', review)
- ops = f'''运维001:请准备课堂收尾,本轮仅落地与只读预检,不代跑project-progress。
- 先读56号与55号独立验收;沿用会话btrFqkz0yw、项目S_CikxZeBs、机会QE9hjtCj8E、概念QO0uo8nisk及报告tLkz2MAoIw。课堂完成不等于需求/实物/市场/量产验证、员工确认、正式发布或企业批准。
- 原样落地01-project-complete.template.json至/opt/data/ksf-executor-20261103/S5-classroom-completion-01/,root:root 0644、hermes实读。固定模板{len(template_bytes)}B,sha256={template_hash}。sessionId/projectId均为null,toStage=S5、state=completed,note逐字保留;不生成绑定真实ID的输入,不修改模板或旧资料。先核FILES.sha256,再按现网专用命令合同核project-progress和project-status,不使用project-transition。
- 只读预检:项目仍S5/in_progress/live/status=workshop、ownerSession/sessionRef与当前王刚001归属一致;机会互链正确;currentConceptRef=QO0uo8nisk v1;成果恰XF4h-Z7l5o/U3_W7WDliP/tLkz2MAoIw;事件恰原7条且无completed;项目meta.pendingQuestions13条逐字等runbook;concept规格未知数值保留null、productionSteps及响应顶层formulaItems为空。旧S5报告仍v1,正文/章节/四引文/待补等原固定模板;未确认、未正式发布。
- 查runbook三个requestId的本地回执/在途及KsfOperation成功写入审计;只有一个未来写键{steps[1]['requestId']}。读键不保证入审计表,不以查不到推断从未执行读命令。项目已completed、对象/事件不符、已有写入或结果不确定即停报编号,不重跑、不换键、不升级版本。
- 新留存/opt/data/ksf-workshop-private/S5-classroom-completion-01/仅不存在才建hermes:hermes0700并确认为空。核58号两个输入、三组stdout/stderr/exitcode及结果编号文件均不存在,无在途。保留S5-classroom-next-01/及全部旧失败/恢复回执、模板/包;不复用旧目录。
- 历史S5保存键差异已在55/56号保留,不能拿本轮完成键补存报告。可只读取得实际第06步原命令/回执用于解释偏差,取不到就注明未取得,不重新执行任何旧命令。
- 本轮不改Skill/Function/schema/wrapper/前端、不重启,不执行project-progress/concept-save/workshop-save/import/create/正式发布,不清空13问题。回报模板指纹、合同、归属、成果/概念/事件、13问题、历史/在途与目标文件检查。通过后转交58号给王刚001在真实消息中执行,运维不代执行。
- '''
- put('57-发给运维001-课堂完成准备.txt', ops)
- steps_text = '\n'.join(f"{s['step']:02d}. {s['command']};input={s['inputFile']};requestId={s['requestId']}" for s in steps)
- actor = f'''王刚001:本单用于既有项目课堂收尾。用户已要求继续既有工作坊流程,不再问方向或重起草。先确认57号落地预检通过,读56号课堂总结;只将本项目记为S5/completed,13项研究未决问题不变。完成不等于企业批准、员工正式确认、正式发布或实物/市场/量产验证。
- 一、真实身份与固定输入
- 无参数运行ksfregistercurrent_employee(以现有可信接入正式工具名为准),核本条完整agentProfileKey、员工/发送者及会话btrFqkz0yw归属,与项目S_CikxZeBs、概念QO0uo8nisk、报告tLkz2MAoIw的既有归属一致;跨日不自动新建会话。不能拿旧键或姓名冒充本条核验,不一致即停。
- 模板/opt/data/ksf-executor-20261103/S5-classroom-completion-01/01-project-complete.template.json:{len(template_bytes)}B,sha256={template_hash}。
- 留存/opt/data/ksf-workshop-private/S5-classroom-completion-01/应为57号确认的空0700目录。确认目标无历史回执、无在途且不存在;所有新输入和每步stdout/stderr/退出码用O_EXCL独占写0600,已有即停,不覆盖旧文件。
- 二、三步固定顺序(1写、2读)
- {steps_text}
- 第01步:独占新建00-project-status.json,仅含{{"sessionId":"btrFqkz0yw","projectId":"S_CikxZeBs"}}。project-status读后核S5/in_progress/live/status=workshop,ownerSession/sessionRef及Agent归属一致;三份成果恰XF4h-Z7l5o、U3_W7WDliP、tLkz2MAoIw;concept=QO0uo8nisk v1且currentConceptRef正确;formulaItems=[];meta.pendingQuestions13条逐字等runbook;事件原七条,完整ID按runbook.existingEventIds且顺序1—7,无completed。状态已有变化即停,不套旧状态执行。
- 第02步:读模板入内存,仅填sessionId=btrFqkz0yw、projectId=S_CikxZeBs,逐字段差异恰这两项,其他整份深度相等。O_EXCL新建01-project-complete.json。执行前从runbook第02步原样读取requestId,不自行拼接、加前缀或换键;仅调用一次合法project-progress。
- node /opt/data/skills/ksf-workshop-runtime/scripts/ksf-secure.mjs project-progress --agent-profile <本条核实的完整agentProfileKey> --input /opt/data/ksf-workshop-private/S5-classroom-completion-01/01-project-complete.json --request-id {steps[1]['requestId']}
- 核外层ok=true、entryResult.ok=true、EXIT=0,逐条解释stderr;取projectId=S_CikxZeBs、stageCode=S5、progressState=completed、eventId非空、enterpriseApproval=false。独占保存结果编号;不再执行任何保存或建卡动作。
- 第03步:复用第01同一只读输入,project-status读回。核项目S5/completed/live/status=workshop,三个原成果ID不变、currentConceptRef及conceptId/version不变,规格null、空配方/工艺与13问题不变;事件恰8条,前7条ID/顺序不变,末条eventId等第02返回值、sequence=8、eventType=completed、fromStage/toStage均S5、projectRef/sessionRef正确、note逐字等模板。项目status字段仍workshop,completed落在progressState,不要求status=completed。
- 命令读取格式:node /opt/data/skills/ksf-workshop-runtime/scripts/ksf-secure.mjs project-status --input /opt/data/ksf-workshop-private/S5-classroom-completion-01/00-project-status.json --request-id <runbook本步原样requestId>。
- 三组留存前缀固定01-precheck、02-complete、03-final-status,各.stdout.json/.stderr.log/.exitcode;编号写04-result-ids.json。不把写命令内置的归属只读计成第四个CLI步骤;业务命令恰3步,其中1写2读。未开生产浏览器则browserVerified=false,后续Codex单独验收,不沿用旧轮true当本次已验。
- 三、停止与边界
- 任何失败、超时或不确定立即停,保留原requestId、全部输入/回执和已返回编号;不自动重试、换键、删记录或回滚。错误不等于零写入;第03读失败不因此再次完成。由Codex按编号核对再决定恢复。
- 预期仅新增1条completed事件与1条成功操作审计,更新当前项目/会话进度;不新增报告/正文来源/概念/卡/项目/产品/配方/工艺。不改S1—S5正文、13问题、Skill/Function/schema/wrapper/前端,不做招募/试吃/采购,不代员工确认或正式发布。历史S5实际保存键与54号偏差保留,不补跑规定键;本次完成不声称全程完全符合执行单。
- 回报三步完整requestId、两层invocationId、退出码/stderr、eventId、项目阶段/状态/3成果/1概念/8事件/13问题及实际留存清单权限。不得把课堂completed写成需求已验证或产品已具备量产条件。
- '''
- put('58-发给王刚001-课堂完成与回读.txt', actor)
- put('README.txt', '课堂收尾固定材料包。先读56号,再57号运维落地/只读预检,通过后58号由王刚001真实消息执行。\n仅1个project-progress完成写命令,前后各1次project-status。模板sessionId/projectId=null,不可直接提交。\n预期S5/completed、原3报告/1概念不变、8事件及13未决问题。正式确认/发布和研究验证未发生。\nS5原保存键偏差保留,不补存报告,不清空未决项。无凭据、浏览器档案或完整私聊。\n')
- put_json('preflight.json', {'ok': True, 'localStructureOnly': True, 'productionBusinessWrites': 0, 'completed': False, 'browserVerified': False, 'templateSha256': template_hash, 'pendingQuestionCount': 13})
- print(json.dumps({'ok': True, 'templates': 1, 'templateBytes': len(template_bytes), 'templateSha256': template_hash, 'businessApiCalls': 0, 'productionBusinessWrites': 0}, ensure_ascii=True))
|