任务:判据变更声明(W10):改判据只走声明,由作者以外的账号复核接受,接受后开新修订

依据:

  • 决定 35 第 13、16 项(docs/hub-r4-progress.md):W10(判据变更声明)要做。
  • 第 25 项(所有者 10-23 晚改定):不加工具。Hub 卡住、要人做一步的时候,只在回答里写明下一步该谁做什么,用现有的工具和命令就能做。这一件的判断类请求照这条做,规则写在第 3 条,不另外依赖别的页。
  • 模型:node tools/show-element.ts W10 W07 I01 A03 A04 B07 W06 B03 V05 读。
    • W10 F[0]–F[1]、R[0]–R[2];W07 F[5];
    • I01 R[1]:判据要改,只能走判据变更声明;
    • A03 R[0]:判据只能取期望来源的片段;
    • A04 F[0]、R[3]、R[4]:人且非作者由 Hub 按账号判定;判据变更声明只接受 Hub 能核对身份的独立判断;
    • B07 R[2]、R[9]:回答改变期望时,按新修订在同一血缘开新运行,不改写原运行;B07 F[5]:请求的回答;
    • W06 R[0];B03 R[4];V05 R[7]。
  • 合约 README 决定 8:判据变更声明不在提交的形状里。对照模型的复核第 2 节第 2 条:核心没有声明的通道,也没有第二人接受。
  • 现在运行中一个判据都改不了:只能发布新的包版本,或者作者在本地改了文档再重跑。第一个用得上的是编译包:用例的期望和锁定构建的手册对不上时,expected_grounded 只认用例里期望的原文(case-compile 1.2.0“期望文字必须出自它的引文”),模型没有合法的办法改。

  • 集成者先做(模型文字归集成者):W10 的变更记录写决定 35。B07 R[9] 不改。合约 README 决定 8 的那句由这一件改。
  • 分支和工作树:w10-criterion-change,目录 circle-hub-w10-criterion-change,从 hub-redesign 开出。
    • 等下面这些都合并以后,由集成者开出并通知:
      • hub-unknown-exits:它加请求记录的写入和列出、运行的期限,这一件的请求用它;
      • w04-rulings-ledger:同改 contracts/src/submission.ts、hub/runs/engine/submit.ts、evaluate.ts;
      • 同一批写的 share-production-results(加 canViewRun)、kb-unversioned、test-bed-ownership:同改 start.ts、contracts/src/run.ts、pack.ts、validation.ts。
    • v07-repetition 同改 contracts/src/pack.ts、run.ts、validation.ts,排在这一件后面。
    • 第二步改编译包,等 hub-pack-findings 合并。
  • 可以改的路径(行号照现在的写,合并以后以函数为准):
    • contracts/src/submission.ts(声明)、contracts/src/run.ts(运行记录冻结已接受的声明)、contracts/src/pack.ts(RunContext 带出已接受的声明;要求项模板的按账号独立)、contracts/src/validation.ts(分区清单的条目列出被取代的判据)、contracts/README.md,照生成器重新生成 contracts/generated/**;
    • hub/runs/engine/ 里:
      • submit.ts;
      • exact.ts:声明的解析和逐字核对;
      • evaluate.ts:把已接受的声明交给检查,列出被取代的判据;
      • independence.ts、lineage.ts:按账号的独立;
      • start.ts:开新修订时冻结;只读的复核前驱(第 3 条);
      • hub-unknown-exits 加的请求模块:发判断请求,写回答;
      • README.md;
    • hub/server/text.ts、console/pages.ts(运行页那一段);
    • packs/workflow/criterion-review/**(新,通用的复核包);
    • 第二步:packs/workflow/case-compile/**;
    • 对应的测试。
  • 规则:同前(不推送、不建 PR、不发布、不部署;不碰 7420、钥匙串、环境配置文件和任何真实系统;测试只用合成数据,版本线 10.6 以后,地址只用 192.0.2.0/24 和 2001:db8::/32;git commit -s)。所有者的规矩:
    • 未知只是过渡状态,写明缺的事实和下一步动作:没回答的声明写明等哪条请求、谁能答、何时到期;
    • 枚举只来自生成的词表;
    • Hub 只核验,不生成内容,不调用模型:不替检查判断新判据,不改任何源文件的字节;
    • 核心里没有产品的字。
  • 验证:npx tsc --noEmit;node tools/gen-contracts.ts --check;node --test --test-concurrency=1 对 contracts/**、hub/runs/**、hub/server/**、packs/workflow/criterion-review/**;第二步加 packs/workflow/case-compile/**。每条先写改前失败、改后通过的测试。

要做的

  1. 声明的形状(W10 F[0]–F[1]、W07 F[5]):提交加可选的 criterion_changes,每项:
    • item:哪个条目;
    • criterion:现在的判据在哪,引用本运行绑定的源文件片段;
    • assertion:它断言什么,一句话;
    • old:那里的原文,逐字;
    • new:新的判据;
    • grounds:支持新判据的引文,至少一条,每条是引用加原文。

    测试:合约的正反例。

  2. 边界(T03 R[3]、R[4]):
    • criterion 解析不出、old 不逐字、引文不逐字:整份不受理,照现有的码(REFERENCE_UNRESOLVED、QUOTE_MISMATCH),指到那一项。这是 T03 R[3] 的三种整份拒收之一。
    • 引文解析得到、也逐字,但不是期望来源的片段:只拒这一条声明,不发请求,在 errors 里列出,修正说明写“判据只能取期望来源的片段(A03 R[0])”。提交的其余部分照常受理(T03 R[4]:角色不对是反驳,不是整份拒收)。
    • 同一个条目的同一处判据只许一条声明。
    • 测试:每种拒收一条;角色不对的那条只拒它自己;正常的受理。
  3. 等作者以外的账号复核(R[0]、A04 F[0]、R[3]、R[4];决定 35 第 25 项):
    • 作者账号:本运行和它血缘里各运行的运行者。
    • 请求:受理的提交里,每条声明写一条判断类请求记录(hub-unknown-exits 加的请求记录):
      • 绑定运行、条目和声明在提交里的位置;
      • 期限:声明所在运行的提交期限(hub-unknown-exits 第 5 条)。过期以后请求照样能答;开始运行的答复写“请求 <号> 已过期,仍等作者以外的账号复核;新修订不带这条声明”。
      • 下一步写在请求里:“作者以外的账号开一次复核运行:start_run criterion-review,输入是声明所在的那份提交(rec:),前驱是本运行”。
      • 什么算了结:一次复核运行,运行者不是作者账号,它的复核要求项满足。只有结果受理、要求项没满足的,不算。
    • 谁能答:不是作者的管理员,以及管理员把这次运行分享给的用户(share-production-results 的 canViewRun)。
    • 只读的复核前驱:
      • 现在的前驱只认运行者本人和管理员(canSeeRun),经分享的用户开不了复核运行。
      • 这一件加一种前驱用法:工作流声明 predecessor_access: "view",开始运行的人对前驱 canViewRun 成立就行。
      • 只许每个要求项都声明了 independent_of: predecessor 的包这样声明,发布时核对。
      • 这种前驱只给读:这次运行可以解析前驱的记录。它不沿用前驱的租约,不接着前驱的修复轮数,不共用客户端键。每一条都写测试。
      • 别的包照旧,share-production-results 的规则不变。
    • 复核包 criterion-review,通用,包里不写产品的字:
      • 条目是那份提交里的每条声明,投影函数取 criterion_changes;
      • 一个要求项:独立判断,independent_of: predecessor,按账号判定(下一条);
      • 槽位写接受与否(包自己声明的封闭集)、理由和引文;
      • 引用照交接的规则(B03 R[3])在复核运行自己的边界上重核;检查核引文确实出自声明所引的期望来源。
      • SKILL.md 写明:接受与否由账号的主人确认,模型只起草。
    • 按账号的独立(A04 F[0]、R[3]):
      • 要求项模板加一个标记:独立按账号判定。
      • 这样的要求项,复核运行的运行者不是任何作者账号时,独立性记 human_non_author;是作者账号时记 not_independent。会话和模型族照旧记下,但不用来判。
      • 实现在 independence.ts,作者账号由 lineage.ts 给,evaluate.ts 照标记选判法。
      • 客户端声明的模型独立,对这种要求项不算数(A04 R[4])。
    • 回执文字写出声明和请求号:“等作者以外的账号复核;接受以后以本运行为前驱开新运行”。
    • 测试:
      • 请求的字段、期限和下一步;
      • 作者自己的复核运行不算;
      • 另一个账号用同一个模型族复核,按账号满足;
      • 非作者接受、不接受各一;
      • 结果受理但要求项没满足的复核,不了结请求;
      • 经分享的用户开复核运行成功,它没拿到前驱的租约;
      • 没声明 predecessor_access 的包,经分享的用户拿别人的运行当前驱被拒;
      • 复核运行的引文不逐字被拒;
      • 包的发布校验和样例。
  4. 接受之前(R[1]):这次运行的检查只看原判据。守着判据的要求项(编译包的 expected_grounded 这一类)照检查的结论记不通过,修复和轮数照错误表,不另开例外。测试:声明待定时那一项不通过。
  5. 开新修订(B07 R[9]、W06 R[0]):
    • 以声明所在的运行为前驱 start_run 时,Hub 找出以那个运行为前驱的复核运行:运行者不是作者账号,复核要求项满足。把其中接受了的声明冻结进新运行,带声明的位置和复核结果的 rec: 引用。
    • 还没有复核的不带,开始运行的答复写“请求 <号> 还没有回答”和期限;没接受的不带,写出复核人和理由。
    • 冻结的声明经 RunContext 交给检查,检查自己决定怎么用;核心不改源文件,也不替检查判断。
    • 测试:已接受、未回答、已拒绝三种;冻结以后才接受的,不进这一次运行。
  6. 被取代的判据(R[2]):新运行的分区清单里,每个条目列出被取代的判据:位置、旧值、新值、声明和复核结果的引用、复核人。前驱运行的结论照样保留、照样可读(只追加,V05 R[7])。测试:字段齐全;前驱结果的字节不变。
  7. 作者看得到什么:复核运行是复核人的运行,作者照 R02 读不了它。
    • 请求了结时,把接受与否、理由和复核人写进请求记录的回答(B07 F[5]),给发请求的作者看。
    • 复核结果的 rec: 只给管理员和复核人解析。
    • 测试:作者用 get_nodes 读复核结果的 rec:,答“对你不可用”;同时开始运行的答复里写出了结论、理由和复核人。
  8. 显示:回执、开始运行的答复和控制台的运行页写出声明、请求的状态和被取代的判据。测试:text.test.ts、console.test.ts 各几条。

第二步(hub-pack-findings 合并以后,集成者通知)

  • 编译包的 expected_grounded 认冻结的已接受声明:期望文字可以取新判据的片段,新判据的引文要逐字出自期望来源;升版本,重签。
  • 合成用例:用例的期望和手册对不上;声明,作者以外的账号复核接受,新修订通过;没接受时照旧不通过。

完成后在终端里回报:提交号、测试数量、没做完或拿不准的地方。