dsh-completion-guard 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/CHANGELOG.zh-CN.md +19 -0
- package/README.md +52 -8
- package/README.zh-CN.md +13 -5
- package/dist/domain/index.d.ts +2 -2
- package/dist/domain/index.js +2 -2
- package/dist/{domain-BtR3J5aL.js → domain-BUA1lLjs.js} +6492 -4484
- package/dist/{index-CZSt3D0G.d.ts → index-CfEiC4bb.d.ts} +287 -14
- package/dist/index.d.ts +2 -2
- package/dist/index.js +220 -16
- package/docs/ARCHITECTURE.md +4 -0
- package/docs/CONTRACT_REVISION_0_6_3.md +136 -0
- package/docs/DEVELOPMENT_HANDOFF_0_6_3.json +65 -0
- package/docs/DEVELOPMENT_PLAN_0_6_3.md +103 -0
- package/docs/EXECUTE_0_6_3_PROMPT.md +62 -0
- package/docs/LOCAL_ACCEPTANCE.md +889 -0
- package/docs/REVIEW_0_6_2_CORE_ALIGNMENT.md +87 -0
- package/docs/SEMANTIC_COMPATIBILITY.md +49 -1
- package/docs/upstream-deltas.json +67 -11
- package/package.json +2 -2
package/docs/LOCAL_ACCEPTANCE.md
CHANGED
|
@@ -1,5 +1,894 @@
|
|
|
1
1
|
# Local Acceptance
|
|
2
2
|
|
|
3
|
+
## 0.6.3 core-alignment batch (2026-09-16)
|
|
4
|
+
|
|
5
|
+
Source candidate, uncommitted, not frozen, not installed, not published. macOS,
|
|
6
|
+
Node v25.1.0, pnpm 11.22.0. Baseline `63326f22d40407099baa70c8947c37029749588e`
|
|
7
|
+
(0.6.2); the four documents handed over with the batch were preserved untouched.
|
|
8
|
+
|
|
9
|
+
### Reproduced defects and their regressions
|
|
10
|
+
|
|
11
|
+
| Defect | Regression that exercises the old reading | Fixed behaviour |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| F062-01 question marker swallowed the mixed request | `legacyQuestionReadingIsInformational` (the 0.6.2 rule, retained in `src/domain/semantics.ts`) returns true for the three recorded inputs, while the current reading keeps one information range and at least two execution obligations | `tests/domain/v063-core-alignment.test.ts` |
|
|
14
|
+
| F062-02 session directory was a `resolved` request target | the recorded capture now yields `targetSource.kind = environment_default` and `targetCaptureStatus = clarification_required` instead of `resolved` | `tests/domain/v063-core-alignment.test.ts` (K2) |
|
|
15
|
+
| F062-03 prepare rendered a recipe the gate refuses | the same item/action pair now returns `incompatible` with `action_not_compatible_with_item` and no `evidence_input_contract` | `tests/domain/v063-core-alignment.test.ts` (K3) |
|
|
16
|
+
| K4 records an earlier version closed as answered were inherited | an answered mixed record is marked `needs_review` before terminal filtering and blocks the certificate and Goal completion | `tests/domain/v063-core-alignment.test.ts` (K4) |
|
|
17
|
+
|
|
18
|
+
### Hold-out bookkeeping, stated exactly
|
|
19
|
+
|
|
20
|
+
Fifty set files exist in this batch — thirty-five hold-out sets, fourteen
|
|
21
|
+
reviewer-probe regression files and one self-review file — and they are not
|
|
22
|
+
interchangeable:
|
|
23
|
+
|
|
24
|
+
| Set | File | Status |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
| hold-out round 1 | `tests/domain/v063-holdout.test.ts` | **Now regression coverage.** It produced three findings; repairing two of them changed the source, and the third was an incorrect case in the set itself. Applying the plan's rule, the finding-affected cases stay as regressions and the set no longer counts as untuned hold-out evidence. |
|
|
27
|
+
| independent review | `tests/domain/v063-review-regressions.test.ts` | **Regression coverage.** The reviewer's own nine failing probes, kept with the contract expectations the reviewer stated. |
|
|
28
|
+
| second review | `tests/domain/v063-review2-regressions.test.ts` | **Regression coverage.** The second review's five failing probes and their positive controls — an embedded interrogative read as a clause question, a `check if …` condition, inheritance that fills rather than overwrites, a standing prohibition in preparation. |
|
|
29
|
+
| third review | `tests/domain/v063-review3-regressions.test.ts` | **Regression coverage.** The third review's four failing probes with the controls that keep the repair from over-reaching — a purpose clause behind the action, a preface that moved the verb offset, a tautological preparation, and the work vocabulary. |
|
|
30
|
+
| fourth review | `tests/domain/v063-review4-regressions.test.ts` | **Regression coverage.** The fourth review's four failing probes with the controls that keep the structural rule from over-reaching — a question with no subordinate span before it, a real conditional order, and an obligation that DID name the branch. |
|
|
31
|
+
| hold-out round 2 | `tests/domain/v063-holdout-round2.test.ts` | **NOW REGRESSION COVERAGE.** Its nine findings drove source repairs in the first repair round, so it can no longer be hold-out evidence. |
|
|
32
|
+
| hold-out round 3 | `tests/domain/v063-holdout-round3.test.ts` | **NOW REGRESSION COVERAGE.** Its findings drove the third repair round. |
|
|
33
|
+
| hold-out round 4 | `tests/domain/v063-holdout-round4.test.ts` | **NOW REGRESSION COVERAGE.** Its findings drove the fourth repair round. |
|
|
34
|
+
| hold-out round 5 | `tests/domain/v063-holdout-round5.test.ts` | **NOW REGRESSION COVERAGE.** It found the classifier defect (a purpose clause was masked before segmentation) and that repair changed the source. |
|
|
35
|
+
| hold-out round 6 | `tests/domain/v063-holdout-round6.test.ts` | **NOW REGRESSION COVERAGE.** The fifth review then returned three source defects (F1-F3), and this set's own oracle was revised three times, so it cannot be untuned evidence. |
|
|
36
|
+
| hold-out round 7 | `tests/domain/v063-holdout-round7.test.ts` | **NOW REGRESSION COVERAGE.** It found the `then` conflict (the English sequencing preface was also read as a comparative subordinate boundary, so `Then check whether the build passed.` was an acceptance order while the Chinese spelling was an information request) and that repair changed the source. Two of its own expectations were also wrong and are recorded in its header. |
|
|
37
|
+
| fifth review | `tests/domain/v063-review5-regressions.test.ts` | **Regression coverage.** The fifth review's three defects and four failing assertions, with the probes that already passed. |
|
|
38
|
+
| hold-out round 8 | `tests/domain/v063-holdout-round8.test.ts` | **NOW REGRESSION COVERAGE.** It found no defect of its own and its expectations were never revised, but the sixth review then returned three counterexamples against the same invariant and those repairs changed the source. |
|
|
39
|
+
| sixth review | `tests/domain/v063-review6-regressions.test.ts` | **Regression coverage.** The sixth review's three defects and their controls. |
|
|
40
|
+
| hold-out round 9 | `tests/domain/v063-holdout-round9.test.ts` | **NOW REGRESSION COVERAGE.** It found nothing of its own, but the seventh review then returned three counterexamples against the two-sided invariant and those repairs changed the source. |
|
|
41
|
+
| seventh review | `tests/domain/v063-review7-regressions.test.ts` | **Regression coverage.** The seventh review's three defects, with both sides of the invariant: an explanation creates no authority, and a following order still does. |
|
|
42
|
+
| hold-out round 10 | `tests/domain/v063-holdout-round10.test.ts` | **NOW REGRESSION COVERAGE.** It found nothing of its own, but the eighth review then found the explanation scope was still pattern-based and tightened the "and then" control, and that repair changed one of this set's shapes. |
|
|
43
|
+
| eighth review | `tests/domain/v063-review8-regressions.test.ts` | **Regression coverage.** The eighth review's three counterexamples (a finite complement, a `whether` complement, a longer object), the tightened `and then` reading, the separate-instruction positive controls and the closed-complement controls. |
|
|
44
|
+
| hold-out round 11 | `tests/domain/v063-holdout-round11.test.ts` | **NOW REGRESSION COVERAGE.** It found nothing of its own, but the ninth review then required that an explanation's scope never authorize an action it mentions, and that repair changed this set's own reading. |
|
|
45
|
+
| ninth review | `tests/domain/v063-review9-regressions.test.ts` | **Regression coverage.** The ninth review's two counterexamples, the same heads followed by a real instruction, the multi-action plan refusal, and the two scope controls (an unrecognised instruction form keeps its path, a pure reported question keeps its closable lane). |
|
|
46
|
+
| hold-out round 12 | `tests/domain/v063-holdout-round12.test.ts` | **NOW REGRESSION COVERAGE.** The tenth review then showed a bare question head must carry its non-execution qualification into every child, and that repair changed the source. |
|
|
47
|
+
| tenth review | `tests/domain/v063-review10-regressions.test.ts` | **Regression coverage.** The tenth review's three question-scope counterexamples, the refusal decided against the obligation's own target, and the investigation-imperative contrast. |
|
|
48
|
+
| hold-out rounds 13-17 | `tests/domain/v063-holdout-round13.test.ts` … `-round17.test.ts` | **REGRESSION COVERAGE.** Each of these sets found one or more source defects in the question-scope family while the family was being closed: a temporal interrogative read as a condition, the Chinese temporal and subject-prefixed heads, the interrogative vocabulary (`谁`, `怎样`, `何时`…), a question word that doubles as a relative pronoun, a verb-fronted interrogative, and the modal that can stand between the action and the interrogative. Every defect was repaired in the source; each set's own oracle corrections are recorded in its header. |
|
|
49
|
+
| hold-out round 18 | `tests/domain/v063-holdout-round18.test.ts` | **NOW REGRESSION COVERAGE.** The eleventh review then showed an investigation imperative governs an OPEN complement, and that repair changed the source. |
|
|
50
|
+
| eleventh review | `tests/domain/v063-review11-regressions.test.ts` | **Regression coverage.** The eleventh review's three investigation-complement counterexamples, the fact-stating contrast, the separate-instruction positive and the gate/preparation agreement. |
|
|
51
|
+
| hold-out rounds 19-24 | `tests/domain/v063-holdout-round19.test.ts` … `-round24.test.ts` | **REGRESSION COVERAGE.** Closing the investigation boundary exposed six more defects of the same family, each repaired in the source: the `if`-complement taken by the condition splitter, the modal-bearing subordinators (能否/可否/能不能), the postposed Chinese interrogative, the yes/no interrogatives (是否/是不是), the Chinese A-不-A class (要不要/该不该/需不需要/可不可以/对不对), a question about a single action read as an instruction, and an OBJECT list (plugins AND skins) mistaken for an action list. Each set's own oracle corrections are recorded in its header. |
|
|
52
|
+
| hold-out round 25 | `tests/domain/v063-holdout-round25.test.ts` | **NOW REGRESSION COVERAGE.** The twelfth review then showed a DECLARATIVE investigation complement carries its own actor, and that repair changed the source. |
|
|
53
|
+
| twelfth review | `tests/domain/v063-review12-regressions.test.ts` | **Regression coverage.** The twelfth review's two actor-complement counterexamples, the state-question contrast, the separate-instruction positive and the gate/preparation agreement. |
|
|
54
|
+
| hold-out rounds 26-28 | `tests/domain/v063-holdout-round26.test.ts` … `-round28.test.ts` | **REGRESSION COVERAGE.** Closing the actor boundary exposed three more defects of the same family, each repaired in the source: an investigation of a DECLARATIVE `that` clause was authorized, a coordination-free `that` verification was read as an instruction, and the Chinese subject rule needed an action predicate (the rotation verb was also missing from the work vocabulary) so that a state question about an OBJECT keeps its coordinated order. Each set's own oracle corrections are recorded in its header. |
|
|
55
|
+
| hold-out round 29 | `tests/domain/v063-holdout-round29.test.ts` | **NOW REGRESSION COVERAGE.** The thirteenth review then inverted the complement rule (governing by default, closing only on positive proof of a state question), and that repair changed the source. |
|
|
56
|
+
| thirteenth review | `tests/domain/v063-review13-regressions.test.ts` | **Regression coverage.** The thirteenth review's five counterexamples — an unrecognised predicate and a subject position after the subordinator — plus the proven-state contrasts and the separate instruction. |
|
|
57
|
+
| self-review (fifth round) | `tests/domain/v063-repair5-regressions.test.ts` | **Regression coverage.** The three counterexamples found by adjacency self-review while the round-5 set was being written (the English sentence end, the coordinated ordering fragment, the two-repository clause), with the abbreviation, version, single-repository and preface controls. |
|
|
58
|
+
| hold-out round 30 | `tests/domain/v063-holdout-round30.test.ts` | **NOW REGRESSION COVERAGE.** It required no source change of its own, but the fourteenth review then showed that closure still accepted a state WORD as proof, and that repair changed the source. |
|
|
59
|
+
| fourteenth review | `tests/domain/v063-review14-regressions.test.ts` | **Regression coverage.** The fourteenth review's four counterexamples — a state word as an action's object or modifier, in both languages — plus the siblings of the same root cause (attributive, relative clause, causative, a Chinese predicate with an action object), the proven-state contrasts, the answerable lane and the plain order. |
|
|
60
|
+
| hold-out rounds 31-34 | `tests/domain/v063-holdout-round31.test.ts` … `-round34.test.ts` | **REGRESSION COVERAGE.** Each of these sets found one or more source defects while the predicate proof was being closed: the English infinitive test firing on the `to` inside `up-to-date`, a lazy Chinese modifier strip that stopped at a possessive, a state-noun proof that could not name a mirror or a lease, a postposed interrogative whose questioned span carried a verb outside every vocabulary, a yes/no question with an explicit subject that authorized the order beside it, and a governed clause that the message classifier discarded as session talk. Every defect was repaired in the source; each set's own oracle corrections are recorded in its header. |
|
|
61
|
+
| hold-out round 35 | `tests/domain/v063-holdout-round35.test.ts` | **The current independent set**, written after the fifteenth repair round with wording this batch has never used: the stative and adjective shapes, the subject question beside the imperative question, the classifier and the reader agreeing that a governed clause is work, the pure question that adds no obligation, and inheritance beside them. It required NO source change, so it is the untuned set. |
|
|
62
|
+
|
|
63
|
+
Two hold-out round 1 expectations WERE changed during that round, so the earlier
|
|
64
|
+
"no expectation was relaxed" claim was wrong and is corrected here: the
|
|
65
|
+
conditional-request case was rewritten to assert the contract's conditional
|
|
66
|
+
reading instead of an executable one, and one legacy case was replaced because
|
|
67
|
+
the sentence it used is genuinely a pure information request rather than a mixed
|
|
68
|
+
one. Both are corrections of an incorrect oracle, recorded rather than hidden;
|
|
69
|
+
the case that a conjunction was read as a repository name was a real source
|
|
70
|
+
defect and was repaired in `src/domain/capture.ts`.
|
|
71
|
+
|
|
72
|
+
Hold-out round 2 initially produced nine failing assertions. Every one was
|
|
73
|
+
repaired in the source, not in the expectations:
|
|
74
|
+
|
|
75
|
+
- 呢 and 吧 were treated as interrogatives, so "安装这个主题呢。" closed as an
|
|
76
|
+
answer. Only 吗/? ask on their own; 呢 asks only when the clause carries its
|
|
77
|
+
own interrogative content, and 吧 never does.
|
|
78
|
+
- The state vocabulary was too narrow: "是否有新版本" and "Check for a new
|
|
79
|
+
version" did not read as state questions.
|
|
80
|
+
- 并且 split as 并 + 且, leaving a stray fragment, and 以及/而后 were not
|
|
81
|
+
boundaries at all.
|
|
82
|
+
- 是不是 was read as a negation, turning a question into a prohibition.
|
|
83
|
+
- A request preface (先/然后/请) hid an investigation opener behind an action
|
|
84
|
+
verb, so "先检查是否有新版本" read as an order.
|
|
85
|
+
- A targeted inheritance repair (below) returned to the informational-only clause
|
|
86
|
+
head, so a mixed clause starting with an order kept only a partial reading.
|
|
87
|
+
|
|
88
|
+
### Targeted repair round after the independent review
|
|
89
|
+
|
|
90
|
+
The review returned the batch with nine failing probes. The root causes and
|
|
91
|
+
repairs:
|
|
92
|
+
|
|
93
|
+
| Reviewer finding | Root cause | Repair |
|
|
94
|
+
| --- | --- | --- |
|
|
95
|
+
| `安装新主题吧。` and `Check whether an update exists and install the package.` closed after a zero-tool final answer | 吧/呢 counted as interrogatives; an unpunctuated English conjunction was not a boundary | `endsOnInterrogative` (only 吗/? ask alone; 呢 needs question content; 吧 never), and a `CONJUNCT_BOUNDARY` that also covers 并且/以及/而后 and bare 并/且 followed by a distinct clause |
|
|
96
|
+
| A prohibition naming `/repo-b` became the inherited target of a later commit | inheritance accepted any same-unit git item that mentioned a path | candidates must be pending, non-legacy requirements whose disposition is `executable_now`, with `targetCaptureStatus === 'resolved'` and no wait or condition |
|
|
97
|
+
| `提交分支 release。` bound `release` as the repository | the bare-object reader stepped over the 分支 label but not its VALUE | `labeledTokenRange` records what each field already claims, and a claimed value is never re-read as the repository |
|
|
98
|
+
| Three references to one repository reported ambiguity | uniqueness was counted per item | candidates are deduplicated by canonical repository identity |
|
|
99
|
+
| A passed `needsReview` record of the current unit was outside the blocking set, and another unit's answered record was inside it | the blocking set used the pending-only closure plus every answered record | the set is selected by the record's own unit scope (current unit, required descendants, and unit-less legacy records), independent of terminal status |
|
|
100
|
+
| An English unpunctuated mixed legacy record escaped the upgrade check | the check reused the current fragment splitter, which returned one fragment | the check tests the run's informational fragments against the whole-clause reading, so a historically mixed record is caught whatever rule produced it |
|
|
101
|
+
| prepare reported `compatible` while execution denied with `mutation_host_lock_unavailable` | prepare did not pass the projection-level snapshot facts | `enabled`, `integrity` and `hostStatus` are passed to the shared judgement |
|
|
102
|
+
|
|
103
|
+
After those repairs the reviewer's 11 probes pass, the round 2 hold-out set
|
|
104
|
+
passes, and the pre-existing suite is unchanged.
|
|
105
|
+
|
|
106
|
+
### Second repair round after the second independent review
|
|
107
|
+
|
|
108
|
+
The batch was returned again with five failing probes covering three defects;
|
|
109
|
+
all three were repaired in the source.
|
|
110
|
+
|
|
111
|
+
| Reviewer finding | Root cause | Repair |
|
|
112
|
+
| --- | --- | --- |
|
|
113
|
+
| `Create a file /tmp/test-status.txt recording whether the tests passed.` closed as `informational / answered` | an `whether`/`if` **inside the action's object** was read as the clause's own question (`INVESTIGATION_THEN_QUESTION` matched the investigation word mid-clause, and the embedded-interrogative rule fired on the whole clause) | the English investigation form has to open the clause, and an embedded interrogative is a question only when it is NOT behind the clause's action (`englishInterrogativeIsMatrix`); a leading interrogation verb followed by if/whether/when/… is handled as an interrogation instead of a condition (`interrogativeTakesIfObject`) |
|
|
114
|
+
| `提交仓库 /repo-b 分支 main。` then `提交分支 release。` produced `branch: main` | inheritance copied the source's target over the item's, discarding a field the follow-up named | inheritance FILLS unset fields only; the item's own captured selection is kept, and its environment-default identity placeholder is excluded from what it "owns" |
|
|
115
|
+
| prepare reported `compatible` while execution denied with `mutation_conflicting_prohibition` | `prepare` never passed the standing-prohibition input the shared judgement already supported | `prepare` computes the same prohibition conflict the gate does and passes it in, so the verdict is `blocked` |
|
|
116
|
+
|
|
117
|
+
The second repair round also corrected two things the review did not name:
|
|
118
|
+
`context_guard_prepare` was feeding the CALLER's proposed target into the
|
|
119
|
+
compatibility judgement, which made a mere proposal read as `incompatible`; it
|
|
120
|
+
now judges against the obligation's own target and reports the divergence as a
|
|
121
|
+
proposal. And `推送分支 release` was recording `refspec: release`, because a bare
|
|
122
|
+
label value was accepted as a refspec; a refspec must now be spelled like one (a
|
|
123
|
+
`src:dst` pair or a ref path), while a branch named inside a transfer order is
|
|
124
|
+
still that order's refspec.
|
|
125
|
+
|
|
126
|
+
The reviewer's five probes are kept in
|
|
127
|
+
`tests/domain/v063-review2-regressions.test.ts`, and round 3 is the replacement
|
|
128
|
+
independent set.
|
|
129
|
+
|
|
130
|
+
### Third repair round after the third independent review
|
|
131
|
+
|
|
132
|
+
Four failing probes covering three defects; all three were repaired in the
|
|
133
|
+
source.
|
|
134
|
+
|
|
135
|
+
| Reviewer finding | Root cause | Repair |
|
|
136
|
+
| --- | --- | --- |
|
|
137
|
+
| `Create a file /tmp/status.txt to show what changed.` and `Create a script /tmp/check.sh to check the status.` closed as `informational / answered` | `REPORTED_QUESTION` and `INVESTIGATION_OF_STATE` still matched ANYWHERE in the clause, so a purpose clause behind the action ("… to show what changed") was read as the clause's question; only the `whether` branch had been fixed | every English question branch now has to open the clause (`opensClause`), and `INFO_OPENING` is gated the same way |
|
|
138
|
+
| `Please check if the package is installed.` became `pending / conditional_wait` | `interrogativeTakesIfObject` compared the verb's absolute character offset with the matched head's LENGTH, so a preface pushed it out of range and the condition splitter took over | the verb's offset is located inside the match itself, so a preface cannot move it |
|
|
139
|
+
| prepare reported `compatible` for a target the gate denied | the previous round's fix passed the obligation's target as BOTH sides of the comparison, making it a tautology | preparation compares the SUPPLIED target exactly as the gate will, and uses the gate's own authorizing predicate, so an under-specified target is reported `blocked / target_not_authorizing` rather than compatible |
|
|
140
|
+
|
|
141
|
+
The third repair round also extended the work vocabulary (`draft`, `emit`,
|
|
142
|
+
`produce`, `log`, `起草`, `拟定`), without which a purpose clause attached to a
|
|
143
|
+
verb outside the list fell through to `unresolved` and its question word still
|
|
144
|
+
matched.
|
|
145
|
+
|
|
146
|
+
The reviewer's probes are kept in
|
|
147
|
+
`tests/domain/v063-review3-regressions.test.ts`, and round 4 is the replacement
|
|
148
|
+
independent set.
|
|
149
|
+
|
|
150
|
+
### Fourth repair round after the fourth independent review
|
|
151
|
+
|
|
152
|
+
Four failing probes covering three defects; all three were repaired in the
|
|
153
|
+
source.
|
|
154
|
+
|
|
155
|
+
| Reviewer finding | Root cause | Repair |
|
|
156
|
+
| --- | --- | --- |
|
|
157
|
+
| `Archive /tmp/logs to show what changed.` and `Compress /tmp/logs to check the status.` still closed as `informational / answered` | every earlier fix located the clause head by looking for a KNOWN action verb, so a purpose clause behind a verb outside the vocabulary kept its question word | the gate is structural now: a question word behind a subordinate span — `to <verb>`, a relative pronoun (`which`/`who`/`that`/`than`), a participle, or a prepositional opener (`after`/`before`/`about`/`for`/…), in English, or 为了/用来/以便/从而/进而/用于 in Chinese — belongs to that span whatever the main verb is (`headOpensClause`, `ENGLISH_SUBORDINATE_BOUNDARY`, `CJK_SUBORDINATE_BOUNDARY`). An unknown main verb now yields `unresolved`, never `answered` |
|
|
158
|
+
| preparation reported a target verdict for a caller-supplied target the gate had already denied | the previous round's fix fed the CALLER's target in as the obligation's own selection as well, so the authorizing predicate compared a value with itself | preparation uses the gate's own `requestedTargetAuthorizesMutation` against the OBLIGATION's selection and reports `blocked / target_not_authorizing` when the obligation never named that field; an obligation that did name it stays authorizable from the caller's target |
|
|
159
|
+
| `Create /tmp/check.sh to determine if the service is running.` became `pending / conditional_wait` | `if` inside the purpose span was read as a condition on the main clause, because the condition splitter does not know about subordinate spans | the condition marker counts only when it is not inside a subordinate span opened before it (`conditionMarkerIsClauseLevel`), so the purpose reading survives while `Install the package if available.` stays conditional |
|
|
160
|
+
|
|
161
|
+
The reviewer's four probes are kept in
|
|
162
|
+
`tests/domain/v063-review4-regressions.test.ts`, and round 5 is the replacement
|
|
163
|
+
independent set.
|
|
164
|
+
|
|
165
|
+
### Fifth repair round, found by adjacency self-review
|
|
166
|
+
|
|
167
|
+
Round 5 found one source defect of its own (the interaction classifier masked
|
|
168
|
+
question terms anywhere in the message, so `打包日志以便确认哪些请求失败。` was
|
|
169
|
+
dropped before segmentation; subordinate spans are now masked before the
|
|
170
|
+
question-term test and restored for everything else). Writing round 6 against
|
|
171
|
+
the fixed source then exposed three MORE defects by adjacency — the English
|
|
172
|
+
sentence boundary, the coordinated ordering fragment, and the two-repository
|
|
173
|
+
clause. None of the three was returned by a reviewer; all three are in the
|
|
174
|
+
fail-OPEN direction, so they are recorded with the same weight.
|
|
175
|
+
|
|
176
|
+
| Defect | Root cause | Repair |
|
|
177
|
+
| --- | --- | --- |
|
|
178
|
+
| `Install the package. What changed?` was read as ONE information range: the order disappeared and the record closed as answered | the clause splitter treated `。`/`!`/`?`/`!`/`?` as sentence ends but never the ASCII `.`, so an English two-sentence message stayed one run and its interrogative ENDING decided the whole run. The Chinese spelling of the same message split correctly, which is how the asymmetry survived four rounds | an ASCII full stop is a sentence end when a new clause follows it — whitespace, then a capital or non-Latin letter, a quote or a bracket, or a lower-case word that opens a question or its own instruction (`sentencePeriodEnd`). A decimal, a version number (`0.6.3`), a file name (`README.md`) and an abbreviation whose continuation is an ordinary word (`See e.g. the log`) keep the run whole |
|
|
179
|
+
| `What changed, and update the README?` answered the update away | the coordinated fragment ended the sentence, so `endsOnInterrogative` claimed it even though its own head is an instruction | a fragment that opens with a coordinating conjunction and then carries its own action head is an instruction (`coordinatedFragmentOrdersWork`); a coordinated clause that is still an investigation (`然后检查是否有新版本`) stays a question |
|
|
180
|
+
| `提交仓库 /repo-b 与 /repo-c。` silently resolved to `/repo-b` | the labelled repository reader returns the FIRST value and never looked for a second candidate | a second repository-looking token joined by 与/和/及/或/、/,/and/or records `requested_target_repository_ambiguous` instead of a guess (`namesSeveralRepositories`); a file extension and a claimed field value (`分支 main`, `remote origin`) are not candidates |
|
|
181
|
+
|
|
182
|
+
The three counterexamples are kept in
|
|
183
|
+
`tests/domain/v063-repair5-regressions.test.ts`.
|
|
184
|
+
|
|
185
|
+
### Sixth repair round after the fifth independent review
|
|
186
|
+
|
|
187
|
+
The fifth review returned four failing assertions covering three defects. All
|
|
188
|
+
three were repaired in the source, and the reviewer's probes are kept.
|
|
189
|
+
|
|
190
|
+
| Reviewer finding | Root cause | Repair |
|
|
191
|
+
| --- | --- | --- |
|
|
192
|
+
| `Install the package. please report what changed?` was ONE information range: the install was answered away | the sentence boundary was decided from the NEXT word (a word list of question words, conjunctions and verbs at offset 0), so a lower-case request preface left the run whole and the trailing `?` decided it | `sentencePeriodEnd` no longer reads the next word's class at all: a period followed by whitespace and further text ends the sentence, and only a period with no space after it or one that belongs to an abbreviation (`e.g.`, `i.e.`, `cf.`, `etc.`, honorifics, dotted initialisms) keeps the run whole — a closed class instead of an open word list |
|
|
193
|
+
| `What changed, and archive the logs?` produced NO item | the whole-message interaction classifier returned `conversational` as soon as a question term appeared, before any decomposition, so the coordinated order never reached capture | a conversational verdict now has to show that every fragment either asks or says nothing (`ordersWorkBesideQuestion`); a fragment whose head is a Latin word that is not a question, a descriptive opener or a Chinese statement is work the capture layer sees, and the clause-level rule (`coordinatedFragmentOrdersWork`) treats the same head as an instruction |
|
|
194
|
+
| `提交仓库 /repo-b、/repo-c。` and `提交仓库 /repo-b 和仓库 /repo-c。` still resolved to `/repo-b` | the alternative-repository rule required whitespace before the coordinator and matched the token immediately after it, so a glued enumeration mark and a repeated field label both hid the second candidate | candidates are enumerated by structure (`repositoryCandidates`): every repository-looking token plus the current-repository deixis, then a pair joined by a coordinator, an optional repeated field label, or a coordinator glued inside one token (Han characters are legal in paths, so the token is split instead of excluded) is an alternative |
|
|
195
|
+
|
|
196
|
+
Writing round 7 after those repairs then found one more source defect of the same
|
|
197
|
+
family: `then` was both a request preface and a "comparative" subordinate
|
|
198
|
+
boundary, so `Then check whether the build passed.` stayed an acceptance order
|
|
199
|
+
while the Chinese `然后检查是否有新版本。` was an information request. The
|
|
200
|
+
boundary list now holds `than` only, and the English sequencing words join
|
|
201
|
+
`REQUEST_PREFACE`, so a preface cannot change what a clause asks. Round 8 is the
|
|
202
|
+
replacement independent set and required no further source change.
|
|
203
|
+
|
|
204
|
+
### Seventh repair round after the sixth independent review
|
|
205
|
+
|
|
206
|
+
The sixth review returned three counterexamples, all of the same invariant — an
|
|
207
|
+
execution residue must survive whatever question, punctuation or abbreviation
|
|
208
|
+
stands around it, and a name the root gave must not be re-judged by its
|
|
209
|
+
extension. All three were repaired in the source.
|
|
210
|
+
|
|
211
|
+
| Reviewer finding | Root cause | Repair |
|
|
212
|
+
| --- | --- | --- |
|
|
213
|
+
| `What changed and archive the logs?` produced NO item, while the comma spelling kept the archive | the session-talk classifier split fragments on punctuation only, so the coordinator was invisible to it and the semantic layer never ran | the classifier now decomposes with the SEMANTIC layer's own `splitTextFragments` (coordinators and list separators), and the clause layer's rule was generalized from "a coordinated fragment" to any fragment that asks nothing and carries its own action head (`fragmentOrdersWorkOnItsOwn`), with question CONTENT — not a bare `?` — deciding whether a fragment asks |
|
|
214
|
+
| `Install the package etc. What changed?` was one information range | the abbreviation exception applied unconditionally, so `etc.` swallowed the sentence end and the trailing question mark decided the whole message | an abbreviation keeps the run whole only when what follows continues the sentence, and a question that follows it in either case opens a new one (`CONTINUES_SENTENCE`, `QUESTION_OPENER`) |
|
|
215
|
+
| `提交仓库 /repo-b.js 与 /repo-c.js。` silently resolved to the first | the candidate list filtered out anything with a file extension while the first-object reader accepted it, so the two judgements contradicted each other | extensions are no longer identity evidence: a repository may be called `/repo-a.js`. A file argument in another clause is excluded by the join rule instead ("提交仓库 /repo-a,运行 /tmp/script.sh" is not a coordinator list) |
|
|
216
|
+
|
|
217
|
+
Writing the Chinese half of the first finding also exposed a fourth gap in the same
|
|
218
|
+
place: `什么变了并归档日志?` stayed one information range, because a bare 并
|
|
219
|
+
split only before a KNOWN action head. A coordinator that separates an ASKING
|
|
220
|
+
clause from a clause that does not ask is now a boundary whatever verb the second
|
|
221
|
+
clause uses, so the unknown Chinese verb survives too. Round 9 is the replacement
|
|
222
|
+
independent set and required no further source change.
|
|
223
|
+
|
|
224
|
+
### Eighth repair round after the seventh independent review
|
|
225
|
+
|
|
226
|
+
The seventh review returned three counterexamples and stated the requirement on
|
|
227
|
+
both sides: an execution obligation must not be closed by an answer, and a request
|
|
228
|
+
for an explanation must not become execution authority. All three were repaired in
|
|
229
|
+
the source.
|
|
230
|
+
|
|
231
|
+
| Reviewer finding | Root cause | Repair |
|
|
232
|
+
| --- | --- | --- |
|
|
233
|
+
| `Explain how to install foo and restart service api.` produced a restart obligation that the production authorizer returned `authorized` for | the coordinator sits inside the question's own object ("how to install X AND restart Y"), but every decomposition rule treated the second verb phrase as an independent instruction | a question whose object IS a coordinated action list governs the whole list (`governsActionList`, checked before partitioning and inside the clause splitter). It requires a question head — a reported question, an investigation or a question word — plus an interrogative object (`how to <verb>`, 怎么/如何/…), so a question that merely stands beside an order still keeps the order, and `Explain the deploy. Then restart service api.` still authorizes the restart in English and Chinese |
|
|
234
|
+
| `Install the package etc. please tell me what changed?` was again one information range | the abbreviation tie-breaker only recognised a question that STARTS with a question word, so the politeness preface hid it | the tie-breaker no longer looks for words at all: when a fragment is informational only because it ends interrogatively, a yes/no question (final 吗/呢, or an English auxiliary) covers the clause, while a trailing wh-question leaves any action head before it as a residue (`questionCoversWholeClause`, `executionResidueBeforeQuestion`) |
|
|
235
|
+
| `提交仓库 /repo-a 分支 main。提交仓库 /repo-a 分支 release。提交。` made the last clause inherit `main` | candidates were deduplicated by repository alone and the first source's whole field set was copied, so clause order decided which branch a later clause authorized | uniqueness is judged PER FIELD: candidates are grouped by canonical repository, and a field is inherited only when every candidate of the group that names it agrees. A conflicting branch (or remote or refspec) is left unset, the clause keeps the fields that were agreed and reports `requested_target_field_ambiguous`, and authorization is denied rather than guessed |
|
|
236
|
+
|
|
237
|
+
The self-review sweep that followed the repairs found one more instance of the
|
|
238
|
+
same invariant, this time in the SESSION layer: `Archive the logs etc.
|
|
239
|
+
请说明一下哪些请求失败了?` and `什么变了并归档日志?` produced NO item at all,
|
|
240
|
+
because the classifier's fragment test called the whole fragment a question before
|
|
241
|
+
the reader ever ran. The classifier now applies the same residue rule as the
|
|
242
|
+
reader (question content only speaks for the text before it), keeps each
|
|
243
|
+
sentence's own closing mark, and both cases are regressions.
|
|
244
|
+
|
|
245
|
+
The repairs also completed two closed classes rather than patching samples: the
|
|
246
|
+
reported-question head now includes the Chinese reporting verbs (解释/说明/描述/讲解/
|
|
247
|
+
说说/告诉我), and the identity comparison treats two spellings of one repository as
|
|
248
|
+
one value.
|
|
249
|
+
|
|
250
|
+
### Ninth repair round after the eighth independent review
|
|
251
|
+
|
|
252
|
+
The eighth review returned three counterexamples that all escaped the SAME
|
|
253
|
+
approximation, and named the reason: the explanation scope was a PATTERN — it
|
|
254
|
+
required `to <verb>` and a fixed character window — so a finite complement
|
|
255
|
+
("how I CAN install …"), a `whether` complement and a longer object each let the
|
|
256
|
+
scope escape and the coordinated action became authority again. It also tightened
|
|
257
|
+
one control: `and then` can belong to the operation order BEING EXPLAINED, so it
|
|
258
|
+
must not be read as an actual instruction.
|
|
259
|
+
|
|
260
|
+
The repair replaces the pattern with the sentence:
|
|
261
|
+
|
|
262
|
+
| Reviewer finding | Root cause | Repair |
|
|
263
|
+
| --- | --- | --- |
|
|
264
|
+
| `Explain how I can install foo and restart service api.` | the scope needed an infinitive (`to <verb>`) | an explanation head governs its SENTENCE; the coordination belongs to the explanation exactly when the complement is still OPEN at the coordinator — an infinitive or a modal in English, a manner interrogative in Chinese (`OPEN_COMPLEMENT_BEFORE_COORDINATOR`). No phrase list, no window |
|
|
265
|
+
| `Explain whether I should install foo and restart service api.` | the same | a `whether` complement with a modal is open, so it governs |
|
|
266
|
+
| `Explain how to install the optional development package with its recommended configuration and restart service api.` | the object exceeded the character window | the window is gone: the test looks only at whether the complement was open where the coordinator appears |
|
|
267
|
+
| `Explain how to deploy and then restart …` must not authorize | `and then` was read as a sequence instruction | while the complement is open, a coordinator — `and then` included — describes the explained operation order, so it creates no authority. The positive control is an explicitly SEPARATE instruction (its own sentence), in both languages |
|
|
268
|
+
|
|
269
|
+
Two closed-complement controls are kept so the repair cannot over-reach:
|
|
270
|
+
`Tell me what changed and install the package.` and `Explain the incident, rotate
|
|
271
|
+
every credential and redeploy.` open a NEW predicate and keep their orders, and an
|
|
272
|
+
explanation of a quoted command (`Explain \`git rebase\`.`) stays undecidable
|
|
273
|
+
rather than answerable. Round 11 is the replacement independent set and required
|
|
274
|
+
no further source change.
|
|
275
|
+
|
|
276
|
+
### Tenth repair round after the ninth independent review
|
|
277
|
+
|
|
278
|
+
The ninth review showed the explanation scope was still keyed on WORDS: the
|
|
279
|
+
open-complement test looked for `to` or a modal, so a finite complement
|
|
280
|
+
(`Explain how you install foo and restart service api.`) escaped it and the
|
|
281
|
+
restart became authority. It named the rule that closes the family: **only proof
|
|
282
|
+
that an action has LEFT the explanation's scope may grant execution authority, and
|
|
283
|
+
a protection pattern that did not match is never that proof.**
|
|
284
|
+
|
|
285
|
+
| Reviewer finding | Root cause | Repair |
|
|
286
|
+
| --- | --- | --- |
|
|
287
|
+
| `Explain how you install foo and restart service api.` | the scope decision required a modal or an infinitive in the complement | the decision is structural and needs no words: a sentence an explanation heads is decided as ONE scope before any partition, and it is `unresolved` whenever a coordinated part carries an action of its own (`isExplanationScope`). A pure reported question with no action residue keeps its closable lane, and an explanation of a quoted command stays undecidable |
|
|
288
|
+
| `Explain why we install foo and restart service api.` | the same | the same rule; the complement's form no longer matters at all |
|
|
289
|
+
| the restart must not authorize even though the clause is undecided | the gate authorized any pending requirement whose action and target matched, so a disposition of `unresolved` was not itself a bar | the mutation gate and `evaluateCompatibility` refuse an explanation's scope as a LAST RESORT, so every earlier refusal keeps reporting the reason it always did. The rule is scoped: an `unresolved` clause that is NOT an explanation's scope (an unrecognised instruction form such as `应用包 foo 版本 0.6.3 配置档 default。`) keeps the path it always had, and the action PLAN of an explanation is refused action by action |
|
|
290
|
+
|
|
291
|
+
Round 12 is the replacement independent set and required no further source change.
|
|
292
|
+
|
|
293
|
+
### Eleventh repair round after the tenth independent review
|
|
294
|
+
|
|
295
|
+
The tenth review showed the protection still keyed on an EXPLANATION head: a bare
|
|
296
|
+
question (`如何…?`, `How do I …?`, `Can you explain …?`) was decomposed into an
|
|
297
|
+
information range plus a child that had LOST its parent question scope and was
|
|
298
|
+
marked `executable_now`, so the gate's last-resort refusal never saw it. It also
|
|
299
|
+
noted that some earlier negatives only looked safe because `api?` did not match the
|
|
300
|
+
target `api` — a text artifact, not semantic protection. The requirement was
|
|
301
|
+
explicit: **propagate the original question scope's non-execution qualification to
|
|
302
|
+
the children and consume it at the authorization entry; do not re-guess scope from
|
|
303
|
+
the split text.**
|
|
304
|
+
|
|
305
|
+
| Reviewer finding | Root cause | Repair |
|
|
306
|
+
| --- | --- | --- |
|
|
307
|
+
| `如何安装 foo 并重启 api 服务?` / `How do I install foo and restart service api safely?` / `Can you explain how to install foo and restart service api safely?` | only an explanation head was in the governing set, and the clause was partitioned before any qualification could be attached | a clause a QUESTION heads is decided ONCE from that head, before any partition or split, and is `unresolved` whenever it also carries an action (`questionHeadsClause`, `isQuestionScopeNeedingReview`). No child is created, so nothing can lose the qualification, and the gate and preparation consume the same predicate |
|
|
308
|
+
| a target that matches must not change the verdict | the refusal depended on the child's own target matching | the rule is read from the item's own captured target and action plan, action by action, so a perfect target cannot hide it |
|
|
309
|
+
| the boundary with the earlier reviews | an investigation imperative (`Check whether …`, `检查是否…`) coordinates two IMPERATIVES, so its second order must keep its authority | the governing set holds question words, auxiliaries, subject-prefixed and verb-fronted interrogatives, and explanation heads — never investigation imperatives. Order-headed mixed messages keep their partition and their execution |
|
|
310
|
+
|
|
311
|
+
Closing the family exposed and fixed four more defects of the same shape, each
|
|
312
|
+
recorded as its own round: a temporal interrogative read as a condition
|
|
313
|
+
(`When should I install … ?`), a Chinese question whose subject pronoun stands
|
|
314
|
+
before the interrogative (`你们如何安装 … 并重启 …`), missing members of the
|
|
315
|
+
interrogative vocabulary (`谁`, `怎样`, `何时`, `多少`…), a question word that is
|
|
316
|
+
also a relative pronoun (`Who owns … ?`, which `englishInterrogativeIsMatrix`
|
|
317
|
+
treated as a subordinate boundary and therefore read as an instruction), and the
|
|
318
|
+
modal that can stand between the action and the interrogative
|
|
319
|
+
(`需要安装多少依赖并重启 …?`). Round 18 is the replacement independent set and
|
|
320
|
+
required no further source change.
|
|
321
|
+
|
|
322
|
+
### Twelfth repair round after the eleventh independent review
|
|
323
|
+
|
|
324
|
+
The eleventh review showed the last gap of the family: an INVESTIGATION imperative
|
|
325
|
+
was excluded from the governing set wholesale, so
|
|
326
|
+
`Check whether it is safe to install foo and restart service api.` split at the
|
|
327
|
+
coordinator and both actions became authority. The imperative head does not
|
|
328
|
+
authorize its embedded actions: the root asked to CHECK whether installing and
|
|
329
|
+
restarting is safe, should happen, or is needed.
|
|
330
|
+
|
|
331
|
+
| Reviewer finding | Root cause | Repair |
|
|
332
|
+
| --- | --- | --- |
|
|
333
|
+
| `Check whether it is safe to install foo and restart service api.` / `Check whether we should install foo and restart service api.` / `检查是否需要安装 foo 并重启 api 服务。` | the governing set held question words, auxiliaries and explanation heads but never an investigation whose complement is OPEN | the complement is now read STRUCTURALLY: the subordinator (`whether`/`if`, 是否/有没有/能否/…) must open the complement AND a modal or an infinitive must stand before the coordinator (`to install`, `we should install`, 需要安装). A complement that merely states a fact (`whether an update exists`) keeps the second order it always had |
|
|
334
|
+
| the refusal must not depend on the target text | as before, the rule is read from the item's own captured target and action plan, action by action | unchanged, and now exercised on both sides of the boundary |
|
|
335
|
+
|
|
336
|
+
Closing that boundary exposed six more defects of the same family, each repaired and
|
|
337
|
+
recorded as its own round: an `if`-complement still taken by the condition splitter
|
|
338
|
+
when a second instruction was coordinated (the head test and the clause test had
|
|
339
|
+
been conflated), the Chinese modal-bearing subordinators (能否/可否/能不能), the
|
|
340
|
+
POSTPOSED interrogative (`检查一下[安装 foo 并重启 api 服务]是否安全`), the yes/no
|
|
341
|
+
interrogatives missing from the question vocabulary (是否/是不是), the Chinese
|
|
342
|
+
A-不-A class read by the negation path as prohibitions (要不要/该不该/需不需要/
|
|
343
|
+
可不可以/对不对), a question about a single action still read as an instruction, and
|
|
344
|
+
an ordinary OBJECT list (`检查一下本地插件和皮肤是否有更新`, where 和 joins two nouns)
|
|
345
|
+
mistaken for a coordination of actions. Round 25 is the replacement independent set
|
|
346
|
+
and required no further source change.
|
|
347
|
+
|
|
348
|
+
### Thirteenth repair round after the twelfth independent review
|
|
349
|
+
|
|
350
|
+
The twelfth review closed the last gap of the family: an investigation's complement
|
|
351
|
+
can have its OWN actor — a deployment script, a migration script, the operations
|
|
352
|
+
staff — so a DECLARATIVE complement coordinates its own predicates and none of them
|
|
353
|
+
is root authority. Requiring a modal or an infinitive in the complement was still a
|
|
354
|
+
pattern, and a plain declarative complement escaped it.
|
|
355
|
+
|
|
356
|
+
| Reviewer finding | Root cause | Repair |
|
|
357
|
+
| --- | --- | --- |
|
|
358
|
+
| `Check whether the deployment scripts install foo and restart service api.` | the complement test only recognised a modal or an infinitive | a declarative complement is now read by the actor signal, per language: Chinese puts the subject BEFORE the subordinator and the action directly after it (确认[运维人员]是否[轮换密钥]…), English puts the subject after the subordinator and the action takes an object (whether [the deployment scripts] [install foo]). The Chinese side additionally requires an ACTION predicate in the complement, so a state question about an object (确认[缓存]是否[有效]并安装依赖) keeps its coordinated order |
|
|
359
|
+
| `检查运维人员是否安装 foo 并重启 api 服务。` | the same | the same rule; the clause is one undecided obligation and every action in it is refused |
|
|
360
|
+
| the refusal must not depend on the target text | unchanged: the rule is read from the item's own captured target and action plan, action by action | unchanged |
|
|
361
|
+
|
|
362
|
+
Closing that boundary exposed three more defects of the same family, each repaired
|
|
363
|
+
and recorded as its own round: an investigation of a DECLARATIVE `that` clause
|
|
364
|
+
(`Verify that the operator rotates the credentials and redeploys the service`) was
|
|
365
|
+
authorized, a coordination-free `that` verification was read as an instruction
|
|
366
|
+
instead of an answerable check, and the Chinese subject rule needed the action
|
|
367
|
+
predicate (which also required the rotation verb in the work vocabulary). The
|
|
368
|
+
cross-end ledger records the tightened DSH reading for the English mixed-conjunction
|
|
369
|
+
case (one undecided obligation) with revision 3. Round 29 is the replacement
|
|
370
|
+
independent set and required no further source change.
|
|
371
|
+
|
|
372
|
+
### Fourteenth repair round after the thirteenth independent review
|
|
373
|
+
|
|
374
|
+
The thirteenth review showed the rule still needed evidence the surface cannot
|
|
375
|
+
supply: the complement closed only when a KNOWN action predicate was recognised
|
|
376
|
+
(`archive`, `归档` and `bootstrap` were not), and the Chinese subject only counted in
|
|
377
|
+
one position (before the subordinator, while `是否有人安装…` and `是否由运维人员安装…`
|
|
378
|
+
put it after). Two lines of attack, one root cause.
|
|
379
|
+
|
|
380
|
+
| Reviewer finding | Root cause | Repair |
|
|
381
|
+
| --- | --- | --- |
|
|
382
|
+
| `Check whether the operators archive the logs and restart service api.` / `检查运维人员是否归档日志并重启 api 服务。` / `… bootstrap the environment …` | closure required a recognised action predicate in the complement | the rule is INVERTED: an investigation's complement GOVERNS by default, and closing it requires positive proof that the question is about a STATE — the subordinator opens the complement, no actor of its own stands on either side of it, no modal or infinitive governs an action there, and the complement names a state (`complementIsProvenStateQuestion`). An unrecognised predicate is no longer evidence of anything |
|
|
383
|
+
| `确认是否有人安装 foo 并重启 api 服务。` / `检查是否由运维人员安装 foo 并重启 api 服务。` | the subject had to stand before the subordinator | the actor test is position-independent: it looks on BOTH sides of the subordinator, and an actor introduced by 由 counts. A proven state question (`是否有新版本`, `缓存是否有效`, `whether the lock file is current`) keeps its coordinated order, and a coordination-free verification stays answerable |
|
|
384
|
+
|
|
385
|
+
Round 30 is the replacement independent set and required no further source change.
|
|
386
|
+
|
|
387
|
+
### Fifteenth repair round after the fourteenth independent review
|
|
388
|
+
|
|
389
|
+
The fourteenth review returned the batch with one P1 and four counterexamples: the
|
|
390
|
+
previous round still asked the surface for evidence it does not carry. Closure had
|
|
391
|
+
been granted when a state WORD appeared anywhere in the complement and no word from an
|
|
392
|
+
actor list stood in it, so a state word that is an action's OBJECT or MODIFIER was
|
|
393
|
+
accepted as proof and the coordinated order was authorized.
|
|
394
|
+
|
|
395
|
+
| Reviewer finding | Root cause | Repair |
|
|
396
|
+
| --- | --- | --- |
|
|
397
|
+
| `Check whether the technicians install available updates and restart service api.` / `Check whether the technicians archive completed jobs and restart service api.` / `检查程序是否安装更新并重启 api 服务。` / `确认小王是否更新依赖并重启 api 服务。` | closure was proven by the PRESENCE of a state word anywhere in the complement plus the ABSENCE of a word from an actor list — both are absence-of-pattern tests, and `available`/`completed`/`更新`/`依赖` were doing duty as an action's modifier or object | the proof is now the PREDICATE: the complement itself must be a state predication. Chinese places the subject before the subordinator, so the predicate follows it directly and needs no copula (`是否正常`, `是否已经完成`), or a stative verb (有/是/为/存在…) governs a state noun (`是否有新版本`, `是否有更新`). English places the subject after `whether`, so the predicate is the complement's LAST word and must be a state adjective reached through a copula (`is valid`, `is current`), with no action verb before it. The actor list is gone entirely — any actor, in any position, is irrelevant once the predicate is proven |
|
|
398
|
+
| the refusal must not depend on the target text | unchanged: the rule is read from the item's own captured target and action plan, action by action | unchanged, and now exercised on both sides of the proof |
|
|
399
|
+
|
|
400
|
+
Closing that proof exposed six more defects of the same family, each repaired and
|
|
401
|
+
recorded as its own round, and each pinned by the set that found it:
|
|
402
|
+
|
|
403
|
+
- the English infinitive test read the `to` inside `up-to-date` as a modal, so a copula
|
|
404
|
+
state question never closed;
|
|
405
|
+
- the Chinese modifier strip was lazy and stopped at a possessive, so `有可用的镜像`
|
|
406
|
+
left `的镜像` and the coordinated order lost its authority;
|
|
407
|
+
- the state-noun proof could not name ordinary state objects (`镜像`, `租约`), and the
|
|
408
|
+
Chinese predicate class could not name `为空`/`满`;
|
|
409
|
+
- the POSTPOSED interrogative was recognized only when the action stood on the far side
|
|
410
|
+
of the coordinator, so `核对一下重启 api 服务并归档日志是否安全。` was read as an order —
|
|
411
|
+
and `classifyPositive` now decides the postposed form as undecided directly instead of
|
|
412
|
+
through a vocabulary-dependent residue test;
|
|
413
|
+
- a yes/no question that states its own subject and carries no imperative at all
|
|
414
|
+
(`审计人是否加盖有效的印章并重启 api 服务。`) governed nothing, so the order coordinated
|
|
415
|
+
beside it was authorized; the yes/no subject form is now an investigation head, and a
|
|
416
|
+
separator no longer opens a clause inside a governed investigation;
|
|
417
|
+
- and the message classifier discarded such a governed clause as session talk
|
|
418
|
+
(`审计员是不是替换凭据并轮换密钥。` produced NO obligation at all, so the order vanished
|
|
419
|
+
instead of staying visible and undecided); the classifier now consumes the reader's
|
|
420
|
+
own predicates, exactly as the gate and preparation do.
|
|
421
|
+
|
|
422
|
+
Round 35 is the replacement independent set and required no further source change.
|
|
423
|
+
|
|
424
|
+
### Sixteenth round: the contracted automatic authorization is withdrawn
|
|
425
|
+
|
|
426
|
+
This round is a **user-approved contract change**, not a repair: the requirement that
|
|
427
|
+
a coordinated second action inside one governed clause be auto-authorized is replaced
|
|
428
|
+
by the narrowed contract in [CONTRACT_REVISION_0_6_3.md](CONTRACT_REVISION_0_6_3.md).
|
|
429
|
+
The fourteen independent reviews that preceded it each showed that the closure it
|
|
430
|
+
depended on could only be guessed (a state word, an actor list, a work verb, a
|
|
431
|
+
position window); the new reading keeps the whole clause as ONE undecided obligation
|
|
432
|
+
and refuses execution until the root writes the action as its own instruction.
|
|
433
|
+
|
|
434
|
+
| Superseded (old contract) | Now (narrowed contract) | Keeper |
|
|
435
|
+
| --- | --- | --- |
|
|
436
|
+
| `Check whether an update exists and install the package.` keeps its install as an order | one undecided obligation; the install stays visible in its action plan and authorizes nothing | — |
|
|
437
|
+
| `检查是否有新版本并且安装这个主题。` / `检查是否有更新并安装新主题。` keep the second order | same | — |
|
|
438
|
+
| a "proven state question" (`检查服务是否正常并记录变更。`, `确认缓存是否有效并安装依赖。`, `Check whether the cache is valid and install the package.`, `Verify whether the lock file is current and install the package.`) closes its complement and keeps the coordinated order | same-clause coordination is undecided; there is no complement-closure proof any more | — |
|
|
439
|
+
| an explanation whose complement is closed opens a new predicate (`说明…的作用,然后更新 README。`) | the explanation head governs its SENTENCE, so the same-sentence order is undecided | a separate sentence or clause still authorizes |
|
|
440
|
+
| a trailing question mark keeps the order in front of it (`What changed, and update the README?`) | punctuation alone never authorizes: one undecided obligation | — |
|
|
441
|
+
|
|
442
|
+
| Kept and re-pinned | Where |
|
|
443
|
+
| --- | --- |
|
|
444
|
+
| pure questions are answerable (`检查是否有新版本。`, `Is there any update for the plugin?`, an object-list question) | `tests/domain/v063-narrowed-contract.test.ts` |
|
|
445
|
+
| a plain explicit instruction with a legal unique target is executable (`重启 api 服务。`) | same |
|
|
446
|
+
| an instruction that clearly left the governed scope is executable (its own sentence, or its own clause: `检查是否存在更新;安装新主题;`) | same |
|
|
447
|
+
| an undecided obligation is captured, cannot be closed by an ordinary answer, and cannot take a certificate | same |
|
|
448
|
+
| the qualification is established once, inherited by partition children, and CONSUMED by the gate and preparation (the gate follows the stored field, not the item text) | same |
|
|
449
|
+
| target ambiguity, K2 provenance, K3 prepare/execute agreement and K4 legacy fidelity | the existing suites, unchanged |
|
|
450
|
+
|
|
451
|
+
The four counterexamples of the fourteenth review
|
|
452
|
+
(`Check whether the technicians archive records that are complete and restart service api.`,
|
|
453
|
+
`Check whether the technicians ensure the cache is valid and restart service api.`,
|
|
454
|
+
`负责生产环境维护的运维人员是否安装 foo 并重启 api 服务。`,
|
|
455
|
+
`负责生产环境维护的运维人员是不是安装 foo 并重启 api 服务。`) are pinned in that suite
|
|
456
|
+
together with the group transformations the review asked for: subject substitution and
|
|
457
|
+
lengthening, known and unknown verbs, object modifiers, relative clauses and nested
|
|
458
|
+
complements, Chinese and English, punctuation and conjunction variants, the reading
|
|
459
|
+
before and after the split and after a replay, and the main action plus every
|
|
460
|
+
`actionPlan` action. Superseded expectations in the earlier hold-out and review files
|
|
461
|
+
are relabelled **合同调整** in place rather than deleted; the two expectations that were
|
|
462
|
+
my own oracle errors are labelled as such.
|
|
463
|
+
|
|
464
|
+
Total independent sets in this batch: fifty set files (thirty-five hold-outs, fourteen
|
|
465
|
+
reviewer-probe regression files and one self-review file).
|
|
466
|
+
|
|
467
|
+
### Seventeenth round: qualification became a positive finding
|
|
468
|
+
|
|
469
|
+
The concentrated review of the narrowed-contract batch returned three P1s about how
|
|
470
|
+
the qualification is ESTABLISHED (delivery and consumption were already accepted):
|
|
471
|
+
|
|
472
|
+
| Reviewer finding | Root cause | Repair |
|
|
473
|
+
| --- | --- | --- |
|
|
474
|
+
| `I wonder whether the technicians restart service api.` was `granted` and authorized the restart | `qualificationOfClause` granted whenever no governed pattern matched — a default, not a finding | `granted` now requires POSITIVE evidence: no question content anywhere in the clause's own span and a recognised action. Every other reading is `restricted` (`unproven_scope`), so the reviewer's exact input is denied with `mutation_item_not_executable` |
|
|
475
|
+
| `Explain this instruction: "Install foo. Restart service api."` re-qualified the second sentence inside the quote and authorized the restart | the qualification was computed AFTER the sentence split, so the quoted parent scope was already lost: the quoted `.` ended the clause | the parent span is established first: a quote (or code span) owns its own punctuation, so a mark inside it never opens a clause of the parent, and a protected clause is indivisible |
|
|
476
|
+
| `安装 foo 并重启 api 服务是否可行。` split into two `granted` items and authorized the restart | a postposed interrogative was only recognised with a trailing `?`, so the coordinator split the clause | the protection now follows the clause's OWN question content (`clauseAsksOwnQuestion`), with or without the mark; the whole clause is one restricted obligation |
|
|
477
|
+
|
|
478
|
+
Group transformations of the same invariant are pinned in
|
|
479
|
+
`tests/domain/v063-narrowed-contract.test.ts`: several uncertainty heads
|
|
480
|
+
(`I wonder`, `I am not sure`, `想问一下`), the quote styles and a longer quote, the
|
|
481
|
+
postposed form with and without `?`, and the pure-quote control. Two further
|
|
482
|
+
consequences are recorded rather than hidden: an order whose coordinated object carries
|
|
483
|
+
an interrogative (`创建文件 /tmp/x 并记录测试是否通过。`) is now protected and undecided
|
|
484
|
+
(relabelled 合同调整 in place), and an imperative whose verb is outside the action
|
|
485
|
+
vocabulary is refused rather than guessed, so the purpose-clause control in the
|
|
486
|
+
invariant suite uses a recognised verb.
|
|
487
|
+
|
|
488
|
+
### Eighteenth round: a directive, not a mention; the parent scope first
|
|
489
|
+
|
|
490
|
+
A second concentrated review of the narrowed contract returned two more P1s about
|
|
491
|
+
ESTABLISHMENT, plus the quote-style gap:
|
|
492
|
+
|
|
493
|
+
| Reviewer finding | Root cause | Repair |
|
|
494
|
+
| --- | --- | --- |
|
|
495
|
+
| `The technicians restart service api every night.` and `日志显示运维人员重启 api 服务。` authorized a restart | `granted` was established by `namesWork`, which only proves the text MENTIONS an action, not that the root ordered it | `granted` now requires a DIRECTIVE (`opensWithDirective`): an imperative in the root's voice — the action opens the clause after any request preface, or the clause opens with a closed-class actor/locative/time/object phrase (`由你…`, `在仓库…`, `按 P0—P4…`, `明天推送`) — and the clause is not a report. A statement is `restricted`, and the disposition is forced to agree with the stored qualification, so a restricted clause can no longer be `executable_now` |
|
|
496
|
+
| `Explain this instruction: 'Install foo. Restart service api.'` and `解释这条指令:「安装 foo。重启 api 服务。」` re-qualified the restart inside the quote | only straight/curly double quotes were protected | every quote style is protected (`"…"`, `“…”`, a word-boundary `'…'`, `「…」`, `『…』`), and the wait/resume heuristics read the quote-blanked text, so a quoted echo of a confirmation no longer reserves anything |
|
|
497
|
+
| (follow-on) the bare `应用包 foo 版本 0.6.3 配置档 default。` form lost its grant under the directive rule | an unrecognised operation word cannot be a positive directive finding | the sanctioned route is the root's explicit restatement (`把应用包 foo 版本 0.6.3 配置档 default 明确为 apply`), which is granted and keeps the K3/K4 fixtures meaningful; the retired boundary is recorded rather than hidden |
|
|
498
|
+
|
|
499
|
+
Group transformations are pinned in `tests/domain/v063-narrowed-contract.test.ts`: statements
|
|
500
|
+
that mention work (four), every quote style (four), directives that keep their authority
|
|
501
|
+
(including a fronted actor or locative), and the explicit-restatement route.
|
|
502
|
+
|
|
503
|
+
### Nineteenth round: authorization intent, not wording
|
|
504
|
+
|
|
505
|
+
The third concentrated review closed the last two gaps in the positive findings:
|
|
506
|
+
|
|
507
|
+
| Reviewer finding | Root cause | Repair |
|
|
508
|
+
| --- | --- | --- |
|
|
509
|
+
| `把重启 api 服务记为待讨论事项。`, `Record restart service api as a hypothetical example.`, `把重启 api 服务明确为禁止操作。` authorized the restart | the restatement route granted on its own wording ("明确为/记为/record … as"), but recording, classifying or forbidding an action is not ordering it | a restatement is granted only when its RESTATED CONTENT is itself an instruction (`restatedContentIsInstruction`: the content opens with an action the reader can identify, or resolves to an operation). A category, a topic or a ban is restricted |
|
|
510
|
+
| `重启 api 服务是一个危险操作。` was executable | an action at the clause head was taken for an imperative, but here the action is the clause's SUBJECT | `opensWithDirective` now rejects a descriptive matrix predicate (`是/属于/意味着/导致…`, `is/are/means/causes…`), read only from the clause the action head belongs to, so a relative clause or a following clause cannot make an order look descriptive |
|
|
511
|
+
|
|
512
|
+
Controls kept: `把更新插件明确为 apply package demo@2.0.0 profile web` and
|
|
513
|
+
`把应用包 foo 版本 0.6.3 配置档 default 明确为 apply` remain granted (they restate an
|
|
514
|
+
INSTRUCTION), `重启 api 服务。` remains executable, and a directive beside a description keeps
|
|
515
|
+
its own authority while the description adds no action. All are pinned in
|
|
516
|
+
`tests/domain/v063-narrowed-contract.test.ts`.
|
|
517
|
+
|
|
518
|
+
### Twentieth round: the restatement is judged, and its authority is bound
|
|
519
|
+
|
|
520
|
+
The fourth concentrated review showed the restatement route still took a shortcut
|
|
521
|
+
("the content mentions an action") and handed the whole item one reusable grant:
|
|
522
|
+
|
|
523
|
+
| Reviewer finding | Root cause | Repair |
|
|
524
|
+
| --- | --- | --- |
|
|
525
|
+
| `把重启 api 服务记为需要讨论的重启操作。`, `把重启 api 服务明确为解释重启流程。`, `Record restart service api as a description of how technicians restart service api.` authorized the restart | the content test accepted any action word anywhere in the restated span | the restated span (`restatedContentOf`) must now pass the SAME judgement a clause passes (`qualificationOfClause`) or be a canonical OPERATION spec whose HEAD is the operation (`restatedContentIsOperation`, which also rejects content that asks or describes). Prose that mentions an operation stays restricted |
|
|
526
|
+
| `把重启 api 服务明确为检查日志。` authorized the restart even though the restated directive is `检查日志` | the qualification was a blanket `granted` for the item, whose action was still read from the pre-restatement text | capture now takes `semanticAction` and `actionPlan` from the RESTATED span (the target identity still comes from the whole clause, because a restatement clarifies the obligation it names). The item's identity is the inspection, so a restart mutation is denied — the action named before the restatement is never authorized |
|
|
527
|
+
|
|
528
|
+
Pinned in `tests/domain/v063-narrowed-contract.test.ts` with the four reviewer inputs, the
|
|
529
|
+
identity-binding assertion and the sanctioned-restatement controls.
|
|
530
|
+
|
|
531
|
+
### Twenty-first round: the restatement binds its target too
|
|
532
|
+
|
|
533
|
+
The fifth concentrated review found one binding defect in that repair:
|
|
534
|
+
|
|
535
|
+
| Reviewer finding | Root cause | Repair |
|
|
536
|
+
| --- | --- | --- |
|
|
537
|
+
| `把重启 api 服务明确为重启 worker 服务。` and `Rebind restart service api as restart service worker.` still captured `service_id=api` and authorized the OLD target | capture took the ACTION from the restated span but the TARGET from the whole clause, so the pre-restatement target won | capture now binds action, `actionPlan` and TARGET together to the restated span: a field the new span names wins, and only the fields it OMITS are inherited from the clarified obligation — and only when that older selection is unambiguous. The old `api` target is denied, the new `worker` target is what the item authorizes, and `把应用包 foo 版本 0.6.3 配置档 default 明确为 apply` still inherits package/version/profile (pinned in `tests/domain/v063-narrowed-contract.test.ts`) |
|
|
538
|
+
|
|
539
|
+
### Twenty-second round: per-span uniqueness, per-field merge
|
|
540
|
+
|
|
541
|
+
The sixth concentrated review found the merge rule was still conditional and the
|
|
542
|
+
uniqueness check was missing on both spans:
|
|
543
|
+
|
|
544
|
+
| Reviewer finding | Root cause | Repair |
|
|
545
|
+
| --- | --- | --- |
|
|
546
|
+
| `把重启 api 服务或 worker 服务明确为 restart。` authorized `api` and `把重启 api 服务明确为重启 worker 服务或 cache 服务。` authorized `worker`, both `resolved` | neither span was checked for a UNIQUE selection: the extractor silently took the first candidate | `identityCandidates` counts the distinct candidates a span names for the action's identity field; two or more on EITHER span is reported as `requested_target_field_ambiguous` with `clarification_required`, so the gate refuses every candidate |
|
|
547
|
+
| `把应用包 foo 版本 0.6.3 配置档 default 明确为 apply package foo version 0.6.4。` lost `profile=default` | inheritance ran only when the restated span named NOTHING | the merge is now PER FIELD: the restated span's own fields win, every field it OMITS is inherited from the clarified obligation while that older selection is unique. The main action and the `actionPlan` share the rule |
|
|
548
|
+
|
|
549
|
+
### Twenty-third round: the enumeration shares the extractor's grammar
|
|
550
|
+
|
|
551
|
+
The seventh concentrated review showed the candidate enumeration and the target
|
|
552
|
+
extractor used different syntax:
|
|
553
|
+
|
|
554
|
+
| Reviewer finding | Root cause | Repair |
|
|
555
|
+
| --- | --- | --- |
|
|
556
|
+
| `Rebind restart service api or worker as restart.` authorized `api`, and `Rebind restart service api as restart service worker or cache.` authorized `worker`, both `resolved` | `identityCandidates` matched "name before `service`", while the extractor accepts `service <name>`; it read `restart` as a candidate, missed `api or worker`, and the shared-label list went unchecked | the candidate set is now enumerated with the EXTRACTOR's own parsers (`labeledTokens` with a coordinated continuation list, `actionObjectTokens`, and the noun-suffix scan), each normalized by the same helper, and ambiguity is judged within one surface form so mixing forms cannot invent a pair. `buildActionPlan` calls the same check per entry (`restatedSpanAmbiguous`), so the main action and the plan share one rule |
|
|
557
|
+
|
|
558
|
+
### Twenty-fourth round: uniqueness covers every identity field
|
|
559
|
+
|
|
560
|
+
The eighth concentrated review showed the audit stopped at the object name:
|
|
561
|
+
|
|
562
|
+
| Reviewer finding | Root cause | Repair |
|
|
563
|
+
| --- | --- | --- |
|
|
564
|
+
| `把应用包 foo 版本 0.6.3 配置档 default 明确为 apply package foo version 0.6.4 or 0.6.5 profile default。` authorized `version=0.6.4`, and `… profile web or prod。` authorized `profile=web` | only service and package names were enumerated; version and profile were still read as single values | the enumeration now follows the action's whole identity contract (`identityFieldLabels`: service, package, version, profile, registry, repository, branch, remote, refspec), each field read with the extractor's labels and normalization, so a coordinated list after any label is ambiguous. The merge reads the CLARIFIED span rather than the whole clause, because the whole clause necessarily names both the old and the new value |
|
|
565
|
+
|
|
566
|
+
Boundary recorded: the audit applies to the restatement merge, where two spans must be
|
|
567
|
+
reconciled; a plain clause keeps the extractor's single reading (the fixture families
|
|
568
|
+
that depend on it are unchanged).
|
|
569
|
+
|
|
570
|
+
### Twenty-fifth round: the uniqueness result is consumed by every entry
|
|
571
|
+
|
|
572
|
+
The ninth concentrated review showed the ordinary capture bypassed the audit:
|
|
573
|
+
|
|
574
|
+
| Reviewer finding | Root cause | Repair |
|
|
575
|
+
| --- | --- | --- |
|
|
576
|
+
| `Restart service api or worker.` authorized `api` and `提交仓库 /repo-a 分支 main 或 release。` authorized `main`, both `resolved` | the plain branch took the extractor's single value; the audit ran only for a restatement | the ordinary capture, the restatement merge and every `actionPlan` entry now consume the same uniqueness result. The enumeration and the extractor share ONE label/verb definition (`IDENTITY_LABELS`) with boundaries, and a label's value must be separated from it, so a path (`/repo-a`), a compound token (`synthetic-plugin`) or a sub-path (`repo/sub`) is not read as a second candidate; earlier reason codes (an ambiguous repository, a missing field) are preserved |
|
|
577
|
+
|
|
578
|
+
The 33 fixture rejections from the first attempt were traced to exactly those parse false
|
|
579
|
+
positives and fixed there, not by skipping the ordinary entry; the positive controls
|
|
580
|
+
(`重启 api 服务。`, `提交仓库 /repo-a 分支 main。`, the per-field inheritance and the install
|
|
581
|
+
fixture form) all still resolve.
|
|
582
|
+
|
|
583
|
+
### Twenty-sixth round: identity values keep their case
|
|
584
|
+
|
|
585
|
+
The tenth concentrated review found the enumerators lowercased every candidate:
|
|
586
|
+
|
|
587
|
+
| Reviewer finding | Root cause | Repair |
|
|
588
|
+
| --- | --- | --- |
|
|
589
|
+
| `提交仓库 /repo-a 分支 main 或 Main。` authorized `main` and `Push repository /repo-a remote origin refspec main:main or main:Main.` authorized `main:main`, both `resolved` | `labeledTokens` and `fieldCandidates` applied a blanket `toLowerCase()`, so two distinct git identities collapsed into one candidate | candidates keep their value; each field is normalized by its OWN rule (`fieldNormalizer`): packages through the package-spec parser, registries through their canonical form, and every git identity — repository, branch, remote, refspec — case-sensitively. A repeated EXACT value is still one candidate (`main 或 main` stays `resolved`), and the positive controls are unchanged |
|
|
590
|
+
|
|
591
|
+
### Twenty-seventh round: package-spec tuples and the shared label set (closing checklist)
|
|
592
|
+
|
|
593
|
+
The closing review fixed the last two items on its checklist:
|
|
594
|
+
|
|
595
|
+
| Blocker | Root cause | Repair |
|
|
596
|
+
| --- | --- | --- |
|
|
597
|
+
| `foo@1.0.0 or foo@2.0.0` collapsed into one package name and authorized `1.0.0` (install, restated apply and publish), and `foo@1.0.0 version 2.0.0` was not refused as a conflict | the package candidate was normalized to its NAME only, and a version inside a spec never reached the version field | a package candidate is the whole SPEC (`id@version`), and the spec's version joins the labelled versions as ONE candidate set for the version field, so a same-name/different-version list and a spec/label conflict are both ambiguous, while an exactly repeated version stays unique |
|
|
598
|
+
| `推送仓库 /repo-a 远端 origin 引用规范 main:main 或 main:release。` authorized `main:main` | the audit's label set lacked the Chinese `引用规范` that the extractor already accepted | the audit and the extractor now share the whole field-label set (repository, branch, remote, refspec incl. `引用规范`, package, artifact, version, profile, registry, service, plus the guarded verb forms), so no label can exist on one side only |
|
|
599
|
+
|
|
600
|
+
The closing review's other fixed checks — qualification propagation, prohibition/wait/human
|
|
601
|
+
actions, ordinary instructions, explicit follow-up authorization, the upgrade and
|
|
602
|
+
certificate suites — reported no new blockers, and the repository-wide suite is green.
|
|
603
|
+
|
|
604
|
+
### T06 evidence: a real 0.6.2 projection, upgraded by the production entry
|
|
605
|
+
|
|
606
|
+
The earlier T06 evidence derived a log with the CURRENT reader and then assigned
|
|
607
|
+
the old shape onto the result by hand, and its "history is preserved" case
|
|
608
|
+
compared two snapshots with no operation between them. That is withdrawn; what
|
|
609
|
+
replaces it:
|
|
610
|
+
|
|
611
|
+
- `scripts/record_legacy_upgrade_fixture.mjs` EXECUTES the committed 0.6.2 build
|
|
612
|
+
(`deriveProjection` from the baseline `dist/`, extracted with
|
|
613
|
+
`git archive 63326f2 dist`) and stores the records that build emitted, with the
|
|
614
|
+
baseline commit and a SHA-256 for every module file. Re-running it is
|
|
615
|
+
deterministic; the recorded file is `tests/fixtures/upgrade/legacy-0.6.2.json`.
|
|
616
|
+
The recorder covers BOTH real protocols, because the earlier release behaves
|
|
617
|
+
differently on each: a session with no boundary notice leaves the mixed record
|
|
618
|
+
`pending`, and a session that announced the v5 boundary applies its delivery
|
|
619
|
+
pass and writes the record CLOSED — `status: answered` with a delivered
|
|
620
|
+
`answeredBy` (turn, response sequence and response digest). The v5 notice is
|
|
621
|
+
written out in the recorder so it never imports the current source; the sixth
|
|
622
|
+
review's own v5 comparison is what showed the first recording had omitted it.
|
|
623
|
+
- `tests/domain/v063-legacy-upgrade.test.ts` loads those records as the persisted
|
|
624
|
+
state of an earlier session and runs `applyUpgradeEligibility` — the exported
|
|
625
|
+
entry `deriveProjection` itself calls — BETWEEN the two snapshots, so the diff
|
|
626
|
+
shows exactly what the upgrade changed: the eligibility fact and nothing else.
|
|
627
|
+
It asserts the recorded ID, revision, `normalizedText`, `textSha256`, spans,
|
|
628
|
+
status, action, target and `answeredBy` are untouched (including the CLOSED v5
|
|
629
|
+
records, whose delivered answer does not rescue them), that no certificate,
|
|
630
|
+
checkpoint or effect appears, that the flag blocks the certificate and the Goal
|
|
631
|
+
with `legacy_record_needs_review`, that a second upgrade keeps the original
|
|
632
|
+
reason and revision, and that the pure-question control is never flagged. The
|
|
633
|
+
unit attribution the v5 recording carries is part of the restored state, so the
|
|
634
|
+
record is in the eligibility scope exactly as it is in a live session.
|
|
635
|
+
- What this file does NOT claim: it drives the eligibility entry over the
|
|
636
|
+
persisted records directly. Native host recovery — restoring a real profile and
|
|
637
|
+
replaying a real session through the runtime — remains unmeasured below.
|
|
638
|
+
- `tests/domain/v063-upgrade-chain.test.ts` keeps only the durable-log cases and
|
|
639
|
+
labels every constructed record as predicate-level.
|
|
640
|
+
|
|
641
|
+
### Evidence added in the repair round
|
|
642
|
+
|
|
643
|
+
- `tests/domain/v063-review-regressions.test.ts` — the reviewer's nine failing
|
|
644
|
+
probes plus two positive controls, with the reviewer's own contract
|
|
645
|
+
expectations.
|
|
646
|
+
- `tests/domain/v063-holdout-round2.test.ts` — 28 assertions across 19 cases in
|
|
647
|
+
wording families absent from every earlier set: 呢/吧 as particles, 并且/以及/
|
|
648
|
+
而后/then chains, an enumerated repository, a subdirectory that must not
|
|
649
|
+
collapse onto its parent, inheritance across an unrelated clause,
|
|
650
|
+
prepare/action agreement on stale revision, non-pending status and a
|
|
651
|
+
cross-family action, and eligibility scope across unit boundaries.
|
|
652
|
+
- `tests/domain/v063-legacy-upgrade.test.ts` — the T06 evidence: records emitted
|
|
653
|
+
by executing the committed 0.6.2 build, upgraded by the production entry with
|
|
654
|
+
the before/after comparison bracketing that call. The construction and its
|
|
655
|
+
limits are described in the T06 section above.
|
|
656
|
+
- `scripts/record_legacy_upgrade_fixture.mjs` +
|
|
657
|
+
`tests/fixtures/upgrade/legacy-0.6.2.json` — the recorder and the recording it
|
|
658
|
+
produces (baseline commit, every module hash, the records as the earlier
|
|
659
|
+
release left them).
|
|
660
|
+
- `tests/domain/v063-upgrade-chain.test.ts` — the durable-log half of T06: the
|
|
661
|
+
v5 boundary, root message, completed turn and delivery, idempotent
|
|
662
|
+
re-derivation, the v4 (pre-v5) scope, and the predicate-level shapes a
|
|
663
|
+
recorder cannot emit, each labelled as such.
|
|
664
|
+
- `tests/tools/v063-host-lifecycle.test.ts` — T07 over ONE durable log: the
|
|
665
|
+
registered tools materialized through the real `ToolRuntime`, their
|
|
666
|
+
call/result round-trips APPENDED to the log in the persisted wire shape, a
|
|
667
|
+
restart-style re-derivation, a `compaction/summary`, a second re-derivation,
|
|
668
|
+
the Recovery packet and digest from the post-compaction projection, the
|
|
669
|
+
production Stop decision, and the same refusals after the replay.
|
|
670
|
+
- `tests/domain/v063-review2-regressions.test.ts` — the second review's five
|
|
671
|
+
failing probes plus positive controls (a conditional order, genuine
|
|
672
|
+
questions, a prohibition on another repository, a prohibition of another
|
|
673
|
+
action, an unset field still inheriting).
|
|
674
|
+
- `tests/domain/v063-holdout-round3.test.ts` — the round-3 independent set
|
|
675
|
+
(28 assertions), now marked in its own header as regression coverage.
|
|
676
|
+
- `tests/domain/v063-review3-regressions.test.ts` — the third review's four
|
|
677
|
+
failing probes plus the positive controls that keep the repairs from
|
|
678
|
+
over-reaching (a genuine question, an order with a preface, a complete
|
|
679
|
+
selector).
|
|
680
|
+
- `tests/domain/v063-holdout-round4.test.ts` — the round-4 set (19 cases), now
|
|
681
|
+
marked in its own header as regression coverage.
|
|
682
|
+
- `tests/domain/v063-review4-regressions.test.ts` — the fourth review's four
|
|
683
|
+
failing probes plus the positive controls that keep the structural rule from
|
|
684
|
+
over-reaching (a question with no subordinate span before it, a real
|
|
685
|
+
conditional order, an obligation that DID name the branch).
|
|
686
|
+
- `tests/domain/v063-holdout-round5.test.ts` — the round-5 set, now marked in
|
|
687
|
+
its own header as regression coverage; it found the classifier defect.
|
|
688
|
+
- `tests/domain/v063-repair5-regressions.test.ts` — the fifth repair round's
|
|
689
|
+
three self-review counterexamples (the English sentence end, the coordinated
|
|
690
|
+
ordering fragment, the two-repository clause) with the abbreviation, version,
|
|
691
|
+
single-repository and preface controls.
|
|
692
|
+
- `tests/domain/v063-holdout-round6.test.ts` — the round-6 set (16 cases), now
|
|
693
|
+
regression coverage.
|
|
694
|
+
- `tests/domain/v063-review5-regressions.test.ts` — the fifth review's four
|
|
695
|
+
failing assertions and three defects plus the probes that already passed.
|
|
696
|
+
- `tests/domain/v063-holdout-round7.test.ts` — the round-7 set, now regression
|
|
697
|
+
coverage; it found the English `then` preface/boundary conflict.
|
|
698
|
+
- `tests/domain/v063-holdout-round8.test.ts` — the round-8 set (16 cases), now
|
|
699
|
+
regression coverage.
|
|
700
|
+
- `tests/domain/v063-review6-regressions.test.ts` — the sixth review's three
|
|
701
|
+
defects plus the controls that keep the repairs from over-reaching (a genuine
|
|
702
|
+
question, an abbreviation that continues its sentence, a claimed field value, a
|
|
703
|
+
file argument in another clause, two spellings of one repository).
|
|
704
|
+
- `tests/domain/v063-holdout-round9.test.ts` — the round-9 set (19 cases), now
|
|
705
|
+
regression coverage.
|
|
706
|
+
- `tests/domain/v063-review7-regressions.test.ts` — the seventh review's three
|
|
707
|
+
defects, with the explanation-versus-order pair in both languages and the
|
|
708
|
+
per-field inheritance controls.
|
|
709
|
+
- `tests/domain/v063-holdout-round10.test.ts` — the round-10 set (17 cases), now
|
|
710
|
+
regression coverage.
|
|
711
|
+
- `tests/domain/v063-review8-regressions.test.ts` — the eighth review's three
|
|
712
|
+
counterexamples plus the tightened `and then` reading, the separate-instruction
|
|
713
|
+
positive controls and the closed-complement controls.
|
|
714
|
+
- `tests/domain/v063-holdout-round11.test.ts` — the round-11 set (18 cases), now
|
|
715
|
+
regression coverage.
|
|
716
|
+
- `tests/domain/v063-review9-regressions.test.ts` — the ninth review's two
|
|
717
|
+
counterexamples plus the separate-instruction positives and the two scope
|
|
718
|
+
controls.
|
|
719
|
+
- `tests/domain/v063-holdout-round12.test.ts` — the round-12 set (16 cases), now
|
|
720
|
+
regression coverage.
|
|
721
|
+
- `tests/domain/v063-review10-regressions.test.ts` — the tenth review's question
|
|
722
|
+
scopes, the target-independent refusal and the imperative contrast.
|
|
723
|
+
- `tests/domain/v063-holdout-round13.test.ts` … `-round17.test.ts` — the five sets
|
|
724
|
+
that closed the question-scope family, each recording the defect it found and any
|
|
725
|
+
oracle correction of its own.
|
|
726
|
+
- `tests/domain/v063-holdout-round18.test.ts` — the round-18 set (11 cases), now
|
|
727
|
+
regression coverage.
|
|
728
|
+
- `tests/domain/v063-review11-regressions.test.ts` — the eleventh review's
|
|
729
|
+
investigation-complement counterexamples and the contrasts that keep the rule
|
|
730
|
+
honest.
|
|
731
|
+
- `tests/domain/v063-holdout-round19.test.ts` … `-round24.test.ts` — the six sets
|
|
732
|
+
that closed the investigation boundary, each recording the defect it found and any
|
|
733
|
+
oracle correction of its own.
|
|
734
|
+
- `tests/domain/v063-holdout-round25.test.ts` — the round-25 set (12 cases), now
|
|
735
|
+
regression coverage.
|
|
736
|
+
- `tests/domain/v063-review12-regressions.test.ts` — the twelfth review's
|
|
737
|
+
actor-complement counterexamples and their contrasts.
|
|
738
|
+
- `tests/domain/v063-holdout-round26.test.ts` … `-round28.test.ts` — the three sets
|
|
739
|
+
that closed the actor boundary, each recording the defect it found and any oracle
|
|
740
|
+
correction of its own.
|
|
741
|
+
- `tests/domain/v063-holdout-round29.test.ts` — the round-29 set (12 cases), now
|
|
742
|
+
regression coverage.
|
|
743
|
+
- `tests/domain/v063-review13-regressions.test.ts` — the thirteenth review's five
|
|
744
|
+
counterexamples, the proven-state contrasts and the separate instruction.
|
|
745
|
+
- `tests/domain/v063-holdout-round30.test.ts` — the round-30 set (17 cases), now
|
|
746
|
+
regression coverage.
|
|
747
|
+
- `tests/domain/v063-review14-regressions.test.ts` — the fourteenth review's four
|
|
748
|
+
counterexamples, the siblings of the same root cause, the proven-state contrasts,
|
|
749
|
+
the answerable lane and the plain order.
|
|
750
|
+
- `tests/domain/v063-holdout-round31.test.ts` … `-round34.test.ts` — the sets that
|
|
751
|
+
closed the predicate proof, each marked in its own header as regression coverage
|
|
752
|
+
with the defects it found and its own oracle corrections.
|
|
753
|
+
- `tests/domain/v063-holdout-round35.test.ts` — the current independent set
|
|
754
|
+
(20 cases), the only set in this batch that required no source change.
|
|
755
|
+
- `tests/fixtures/cross-end/codex-0.13.9.shape.json` — a NEW Codex recording
|
|
756
|
+
made in this batch by `scripts/record_cross_end_oracle.py --mode shape`, which
|
|
757
|
+
executed the installed module's `_reply_only_request_shape` plus
|
|
758
|
+
`clause_metadata`/`verification_contract` on twelve shared inputs and bound
|
|
759
|
+
the result to the module SHA-256 `4b895aad…`. T08 reads it, so the comparison
|
|
760
|
+
is measured rather than inferred: on this batch Codex's reply-only judge
|
|
761
|
+
returns false for all twelve, which is why the mixed-request and pure-question
|
|
762
|
+
families are recorded `not-aligned` — DSH closes a range Codex would not.
|
|
763
|
+
|
|
764
|
+
### What remains unmeasured after this round
|
|
765
|
+
|
|
766
|
+
- Native Codex host turns: the shape recording executes entry points, not a
|
|
767
|
+
session. No native Codex acceptance is claimed.
|
|
768
|
+
- Cross-repository follow-up reference and prepare/execute comparison on the
|
|
769
|
+
Codex side: no equivalent entry point exists; recorded as not measured and not
|
|
770
|
+
applicable respectively.
|
|
771
|
+
- Candidate CI, the frozen tgz, macOS/Windows exact-artifact acceptance,
|
|
772
|
+
real-model behaviour, plugin installation, DSH restart, tag, npm publication
|
|
773
|
+
and GitHub Release.
|
|
774
|
+
|
|
775
|
+
### Known boundaries found while testing, and deliberately not repaired
|
|
776
|
+
|
|
777
|
+
- A publish target's registry identity is the canonical base the repository's own
|
|
778
|
+
canonicalizer records (`https://registry.npmjs.org/`). A caller that supplies
|
|
779
|
+
the root's UNNORMALIZED spelling therefore does not match the obligation. Both
|
|
780
|
+
lanes agree — so T05 holds — and preparation reports the recorded identity, so
|
|
781
|
+
the workflow proceeds from the target it returns. Loosening the comparison
|
|
782
|
+
would change an identity predicate the gate shares, which this batch does not
|
|
783
|
+
do.
|
|
784
|
+
- An English investigation behind a preface USED TO keep the pre-existing
|
|
785
|
+
`ACCEPTANCE_LEAD` lane; the fifth review's follow-up and round 7 showed that
|
|
786
|
+
made the English reading differ from the Chinese one, so it is repaired:
|
|
787
|
+
`Then check whether the disk is full.` is an information request, like
|
|
788
|
+
`然后检查是否有新版本。`.
|
|
789
|
+
- An investigation's complement GOVERNS by default. It closes only on positive proof
|
|
790
|
+
that the complement PREDICATES a state — a Chinese state adjective, a stative verb
|
|
791
|
+
governing a state noun, or an English state adjective reached through a copula, with
|
|
792
|
+
no modal, infinitive or action verb in the way. A state WORD that is an action's
|
|
793
|
+
object or modifier (`install available updates`, `安装更新`, `更新依赖`) proves
|
|
794
|
+
nothing, an unrecognised predicate proves nothing, an actor anywhere proves nothing,
|
|
795
|
+
and the actor list the earlier rounds leaned on is gone: proof is positive, never the
|
|
796
|
+
absence of a protection pattern.
|
|
797
|
+
- The proof vocabulary is itself a positive list, so a state the lists cannot name
|
|
798
|
+
(`有可用的镜像` before the round that added it) is refused rather than authorized.
|
|
799
|
+
The asymmetry is deliberate: an unprovable complement leaves its coordinated part
|
|
800
|
+
inside the question, where it is never authority.
|
|
801
|
+
- A clause a QUESTION heads is one scope: it is never partitioned into an
|
|
802
|
+
executable child, and when it carries an action it is `unresolved`. An
|
|
803
|
+
investigation IMPERATIVE is different — `Check whether … and install …`
|
|
804
|
+
coordinates two orders — so its second order keeps its own authority — UNLESS its
|
|
805
|
+
complement is open (`Check whether it is safe TO INSTALL … AND restart …`,
|
|
806
|
+
`检查是否需要安装…并重启…`), in which case the actions are what the root asked to
|
|
807
|
+
have checked and none of them authorizes.
|
|
808
|
+
- Only an EXPLICITLY executable reading authorizes. An explanation whose
|
|
809
|
+
sentence mentions an action is refused action by action, whatever its target
|
|
810
|
+
says, and a question is refused for the same reason; authority requires an
|
|
811
|
+
explicitly separate instruction. An `unresolved` clause that is not an
|
|
812
|
+
explanation's scope keeps the behaviour the gate always had, so an unrecognised
|
|
813
|
+
instruction form is still judged on its action and target rather than refused on
|
|
814
|
+
its disposition alone.
|
|
815
|
+
- Inside the sentence an explanation heads, a coordinator belongs to the
|
|
816
|
+
explanation while its complement is open, so `Explain how to install X and then
|
|
817
|
+
restart Y` creates no authority even though a reader might take it as an
|
|
818
|
+
instruction. The safe direction is deliberate: an instruction must be its own
|
|
819
|
+
sentence (`Explain the deploy. Then restart service api.`).
|
|
820
|
+
- A period ends a sentence whenever whitespace and further text follow it. The
|
|
821
|
+
only non-boundaries are a period with no space after it (a decimal, a version
|
|
822
|
+
number, a file name) and an abbreviation from the closed English class
|
|
823
|
+
(`e.g.`, `i.e.`, `cf.`, `etc.`, honorifics, dotted initialisms). An ordinary
|
|
824
|
+
lower-case word after a period therefore STARTS a new sentence, which is the
|
|
825
|
+
fail-closed direction.
|
|
826
|
+
- A repository candidate must be spelled like one: a path or a Latin name that
|
|
827
|
+
is not a value another field already claims. An extension is NOT evidence of
|
|
828
|
+
identity — a repository may be called `/repo-a.js` — so a clause that offers
|
|
829
|
+
several candidates records the ambiguity instead of choosing, and two spellings
|
|
830
|
+
of the SAME path (`/repo-a` and `/repo-a/`) are one candidate. A file argument
|
|
831
|
+
in another clause is not a candidate because the join rule requires a
|
|
832
|
+
coordinator and nothing else between them.
|
|
833
|
+
- A period that belongs to an abbreviation keeps the run whole only when what
|
|
834
|
+
follows continues the sentence; a question after it opens a new sentence.
|
|
835
|
+
(An earlier revision of this record claimed the 0.6.2 build never wrote
|
|
836
|
+
`answered` records for these shapes. That was wrong — it followed from a
|
|
837
|
+
recording made without the v5 boundary notice — and the recorded v5 fixture now
|
|
838
|
+
carries the closed records instead.)
|
|
839
|
+
|
|
840
|
+
### Gates run
|
|
841
|
+
|
|
842
|
+
| Gate | Command | Result |
|
|
843
|
+
| --- | --- | --- |
|
|
844
|
+
| typecheck | `pnpm run typecheck` | exit 0 |
|
|
845
|
+
| lint | `pnpm run lint` | exit 0; 27 warnings, 0 errors — the same count as the 0.6.2 baseline, so the batch adds no new warning |
|
|
846
|
+
| unit/deterministic tests | `pnpm test` | 127 files, 2140 passed, 1 skipped |
|
|
847
|
+
| release packer | `pnpm run test:release-pack` | 2/2 passed |
|
|
848
|
+
| download stats | `pnpm run test:stats` | 10/10 passed |
|
|
849
|
+
| build | `pnpm run build` | exit 0; 6 files, 1105.16 kB; two consecutive builds are byte-identical |
|
|
850
|
+
| pack inventory | `pnpm run pack:check` | name `dsh-completion-guard`, version `0.6.3`, 35 files (the contract revision note is packaged) |
|
|
851
|
+
| documentation audit | `python3 scripts/audit_repository_documentation.py .` | 27 markdown files, 0 errors, 0 warnings |
|
|
852
|
+
| documentation audit test | `python3 -m pytest tests -q` | 84 passed |
|
|
853
|
+
| whitespace | `git diff --check` | clean |
|
|
854
|
+
| reviewer probes (supplementary evidence, not the acceptance) | the fourteen counterexample files under `/tmp/dsh-063-review`, `/private/tmp/dsh-063-independent-review`, `/private/tmp/dsh-063-review3`, `/private/tmp/dsh-063-review4`, `/tmp/dsh-063-review-20260917`, `/tmp/dsh-063-review-20260917-next`, `/tmp/dsh-063-review-20260917-r8`, `/tmp/dsh-063-review-20260917-r9`, `/tmp/dsh-063-review-20260917-r10`, `/tmp/dsh-063-review-20260917-r11`, `/tmp/dsh-063-review-20260917-r12`, `/tmp/dsh-063-review-20260917-r13`, `/tmp/dsh-063-review-20260917-r14` and `/tmp/dsh-063-review-20260917-r15`, run from `tests/domain/` | all fourteen files passed against the final source; every copy was removed afterwards |
|
|
855
|
+
| recorded 0.6.2 fixture | `node scripts/record_legacy_upgrade_fixture.mjs --module-dir <baseline dist> --commit 63326f2… --output tests/fixtures/upgrade/legacy-0.6.2.json` | exit 0; re-running reproduces the committed fixture byte for byte |
|
|
856
|
+
|
|
857
|
+
`NODE_PATH` was unset for the test runs. The DSH harness injects a `NODE_PATH`
|
|
858
|
+
that points at the runtime store, and `tests/domain/host-target-preflight.test.ts`
|
|
859
|
+
resolves a visible parent package through it and reports
|
|
860
|
+
`target_profile_module_shadow` for eight of its 46 cases. With `NODE_PATH`
|
|
861
|
+
unset — the environment every CI lane and the 0.6.2 recheck used — the file
|
|
862
|
+
passes 46/46. This is an environment artifact of the developing session, not a
|
|
863
|
+
repository defect, and it is recorded here rather than worked around in the
|
|
864
|
+
source.
|
|
865
|
+
|
|
866
|
+
### T01–T08 coverage
|
|
867
|
+
|
|
868
|
+
- T01/T02 — `tests/domain/v063-core-alignment.test.ts` (paraphrase, punctuation,
|
|
869
|
+
word order, negation, condition, quoted command, unknown tail) and
|
|
870
|
+
`tests/domain/v063-holdout.test.ts`.
|
|
871
|
+
- T03 — delivery closes only its own information range, including the zero-tool
|
|
872
|
+
final and the partial-completion counterexamples.
|
|
873
|
+
- T04 — target provenance, unique inheritance, two-candidate ambiguity,
|
|
874
|
+
explicit-current-repository resolution, and a model-supplied target.
|
|
875
|
+
- T05 — one compatibility judgement for prepare and the mutation gate, with the
|
|
876
|
+
same-snapshot equality and the revision/condition change counterexamples.
|
|
877
|
+
- T06 — the pre-terminal eligibility check, its idempotence across a reload, and
|
|
878
|
+
the certificate/Goal block.
|
|
879
|
+
- T07 — `tests/tools/v063-host-materialization.test.ts` drives the registered
|
|
880
|
+
tools through the real `ToolRuntime` output contract and reads the production
|
|
881
|
+
Stop decision; the producer-reference and boundary negatives stay refused.
|
|
882
|
+
- T08 — `tests/domain/v063-cross-end-projection.test.ts` reads the recorded
|
|
883
|
+
Codex facts and the case-level ledger
|
|
884
|
+
`tests/fixtures/cross-end/core_alignment_0_6_3.json`. The mixed-request and
|
|
885
|
+
unnamed-repository families are `not-applicable`/`not-aligned`; nothing is
|
|
886
|
+
claimed as aligned without a measured Codex counterpart.
|
|
887
|
+
|
|
888
|
+
Not executed, and not implied by the above: candidate CI, the frozen tgz,
|
|
889
|
+
macOS/Windows exact-artifact acceptance, real-model behaviour, plugin
|
|
890
|
+
installation, DSH restart, tag, npm publication and GitHub Release.
|
|
891
|
+
|
|
3
892
|
## 0.6.2 lifecycle and documentation consolidation (2026-09-16)
|
|
4
893
|
|
|
5
894
|
The coordinator added a third Codex recording (`--mode lifecycle`) using
|