Bind reader-appropriateness to scoring, revision and delivery (#592) - #609
Conversation
- Formal-delivery soft/hard follows the saved reader-contract clause type, not which input field a requirement came from (#592). - Expression <=2 is must-fix: it triggers the existing single revision and flags a self-contradicting "达到要求" verdict instead of passing silently. - report_profiles keeps only the industry increment; shared reader and evaluation rules stay in deliverable_spec. - The scout contract is delivered through the actual dispatch, and building a review packet that drops a saved contract now fails loudly. - Delivery-affecting gaps carry related/impact/action/status; execution detail stays out of the body.
- Show the must-fix/overall contradiction in the assessment panel (expression <=2 while overall is 达到要求) instead of leaving it only in the events table. - Scout now gets the saved plan.json reader_contract in the dispatch, and the scout contract text points at that file rather than implying it is self-contained. - Add a behaviour test that generation_prompt writes scout-contract.md and wires both its absolute path and plan.json into the dispatch. - Use SOFT_CONTRACT_KINDS in requirement_severity instead of a dead constant.
…ery-consistency # Conflicts: # src/briefloop/static/app.js
Review上一轮要的三件事都做了:表达分与总体矛盾进评分面板、Scout 交接有行为测试、 已对齐
建议收紧1. 2. 门控测试没有覆盖「同一个句子换输入栏」。 3. Scout 交接仍靠提示词。 文件写了、prompt 里有路径,测试也只断言这两点。 小点
结论: 作为 #592 第一刀可以合。优先补一门真正换栏位的测试,以及别让 |
| 'kind': kind, 'source_quote': quote, 'instruction': quote}]}) | ||
|
|
||
|
|
||
| def test_writing_constraint_gate_ignores_which_input_field_it_came_from(): |
There was a problem hiding this comment.
只有一条 objective,把整段标成 writing_preference / reader_content。soft 用例等于内容句和写作句绑在同一个 id 上再整段变软,测的是漏拆,不是「同一句换输入栏」。应覆盖:内容在 objective、写作在 writing_preferences(或同栏但两条 clause),未覆盖写作只 notice、未覆盖内容仍 blocker。
| # A saved reader contract must survive into the packet. Losing it silently would | ||
| # let the Reviewer check content without the user's own delivery interpretation. | ||
| saved_contract=snapshot['detail'].get('reader_contract') | ||
| if saved_contract and snapshot['requirements'].get('reader_contract')!=saved_contract: |
There was a problem hiding this comment.
_snapshot 已经用 detail.reader_contract 去做 resolve,这里再和自己比,生产路径上几乎不会响。要证明「丢掉就失败」,测试里需要一份被改过的 snapshot,或断言 detail 有约定则 spec 必须带上。
| @@ -126,7 +126,7 @@ for(const id of ['download','download-docx','download-bundle']){ | |||
| } | |||
There was a problem hiding this comment.
Number(null)===0,缺 expression 且 overall 为「达到要求」时会误出这段。Python must_fix 要求整数分。用 Number.isInteger(d.expression) && d.expression<=2。
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
First, contained slice of the #592 plan (
private_planning/issue-592-delivery-consistency-plan-2026-09-10.md). It makes the writing-noise problem observable to users without adding roles or a new revision loop.What changed
release.decisiondecides soft/hard from the saved reader-contract clause type (requirement_severity), so the same sentence typed into the objective or into writing preferences cannot flip a formal-delivery gate.<=2ismust_fix; it triggers the existing single auto-revision even when the overall verdict would look passing. A must-fix body marked达到要求is recorded asassessment_inconsistentand shown in the assessment panel ("表达分偏低但总体仍判为达到要求,两者不一致…"), not only left in the events table. Expression anchors 4/3/2/1 are in the evaluator rules.report_profileskeeps only the industry increment; shared body/record, accuracy and evaluation rules stay indeliverable_spec.generation_promptwritesscout-contract.mdand hands every Scout its absolute path plus the savedplan.jsonreader_contract through the real dispatch; the scout contract text points atplan.jsoninstead of implying it is self-contained.build_packetrefuses to drop a saved reader contract.Tests
must_fix/overall_inconsistentthresholds;generation_promptwrites the scout contract and wires it into the dispatch.pytest: 183 passed, 3 subtests withnode_modulespresent. Without it,test_rich_documentcannot import@tiptap/core(environmental, unrelated to this diff).Not in this PR
Ref #592.