@openwop/openwop-conformance 1.136.1 → 1.136.2
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/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_comment": "Provenance of this vendored schemas/ copy. See conformance/README.md \u00a7\"Resolving the contract\". Compare against the stamp in your installed @openwop/openwop-conformance to detect a stale hand-copied contract.",
|
|
3
|
-
"suiteVersion": "1.136.
|
|
4
|
-
"corpusCommit": "
|
|
3
|
+
"suiteVersion": "1.136.2",
|
|
4
|
+
"corpusCommit": "4123dfae532f80231763fc43f8d3df3022c58c3d"
|
|
5
5
|
}
|
|
@@ -488,6 +488,10 @@
|
|
|
488
488
|
"requiresApproval": {
|
|
489
489
|
"type": "boolean",
|
|
490
490
|
"description": "RFC 0151 §C — an inverse action can itself be harmful (RFC 0147 R9), so it may be gated behind the same approval surface as a forward effect."
|
|
491
|
+
},
|
|
492
|
+
"waiveRequiresApproval": {
|
|
493
|
+
"type": "boolean",
|
|
494
|
+
"description": "RFC 0151 §B/§E (S36, 2026-08-17) — OPTIONAL. When true, ABANDONING this inverse action (§E `skip with justification` or `terminate as uncompensated`) requires an RFC 0051 approval to have resolved `approved` first — if a human must authorize RUNNING an inverse, a human must authorize deciding it will NEVER run. DEFAULT = the obligation's EFFECTIVE `requiresApproval` (after the policy's `approvalScope` escalation, §B) — NOT false — so the field is purely additive: no existing document changes meaning. Stamped onto the obligation at MINT time like `requiresApproval` (a mid-flight redefinition cannot change who had to authorize). Does NOT apply to `substitute` (still an attempt to undo; a substitution is a new planVersion whose own `requiresApproval` governs it). No policy-level counterpart: because the default inherits the effective value, an `approvalScope` escalation escalates waives with it."
|
|
491
495
|
}
|
|
492
496
|
}
|
|
493
497
|
},
|
|
@@ -498,11 +502,21 @@
|
|
|
498
502
|
},
|
|
499
503
|
"additionalProperties": false,
|
|
500
504
|
"if": {
|
|
501
|
-
"properties": {
|
|
502
|
-
|
|
505
|
+
"properties": {
|
|
506
|
+
"irreversibleEffect": {
|
|
507
|
+
"const": true
|
|
508
|
+
}
|
|
509
|
+
},
|
|
510
|
+
"required": [
|
|
511
|
+
"irreversibleEffect"
|
|
512
|
+
]
|
|
503
513
|
},
|
|
504
514
|
"then": {
|
|
505
|
-
"not": {
|
|
515
|
+
"not": {
|
|
516
|
+
"required": [
|
|
517
|
+
"compensation"
|
|
518
|
+
]
|
|
519
|
+
}
|
|
506
520
|
}
|
|
507
521
|
},
|
|
508
522
|
"FragmentEdge": {
|
|
@@ -291,6 +291,10 @@
|
|
|
291
291
|
"requiresApproval": {
|
|
292
292
|
"type": "boolean",
|
|
293
293
|
"description": "RFC 0151 \u00a7C \u2014 an inverse action can itself be harmful (RFC 0147 R9), so it may be gated behind the same approval surface as a forward effect."
|
|
294
|
+
},
|
|
295
|
+
"waiveRequiresApproval": {
|
|
296
|
+
"type": "boolean",
|
|
297
|
+
"description": "RFC 0151 \u00a7B/\u00a7E (S36, 2026-08-17) \u2014 OPTIONAL. When true, ABANDONING this inverse action (\u00a7E `skip with justification` or `terminate as uncompensated`) requires an RFC 0051 approval to have resolved `approved` first \u2014 if a human must authorize RUNNING an inverse, a human must authorize deciding it will NEVER run. DEFAULT = the obligation's EFFECTIVE `requiresApproval` (after the policy's `approvalScope` escalation, \u00a7B) \u2014 NOT false \u2014 so the field is purely additive: no existing document changes meaning. Stamped onto the obligation at MINT time like `requiresApproval` (a mid-flight redefinition cannot change who had to authorize). Does NOT apply to `substitute` (still an attempt to undo; a substitution is a new planVersion whose own `requiresApproval` governs it). No policy-level counterpart: because the default inherits the effective value, an `approvalScope` escalation escalates waives with it."
|
|
294
298
|
}
|
|
295
299
|
}
|
|
296
300
|
},
|
|
@@ -301,11 +305,21 @@
|
|
|
301
305
|
},
|
|
302
306
|
"additionalProperties": false,
|
|
303
307
|
"if": {
|
|
304
|
-
"properties": {
|
|
305
|
-
|
|
308
|
+
"properties": {
|
|
309
|
+
"irreversibleEffect": {
|
|
310
|
+
"const": true
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
"required": [
|
|
314
|
+
"irreversibleEffect"
|
|
315
|
+
]
|
|
306
316
|
},
|
|
307
317
|
"then": {
|
|
308
|
-
"not": {
|
|
318
|
+
"not": {
|
|
319
|
+
"required": [
|
|
320
|
+
"compensation"
|
|
321
|
+
]
|
|
322
|
+
}
|
|
309
323
|
}
|
|
310
324
|
},
|
|
311
325
|
"WorkflowEdge": {
|
|
@@ -828,7 +842,7 @@
|
|
|
828
842
|
},
|
|
829
843
|
"compensation": {
|
|
830
844
|
"$ref": "compensation-policy.schema.json",
|
|
831
|
-
"description": "RFC 0151
|
|
845
|
+
"description": "RFC 0151 \u00a7B \u2014 the workflow-level compensation policy (WHEN an unwind starts and HOW it runs). OPTIONAL and capability-gated: a host that advertises `capabilities.compensation` MUST validate it at registration; a host that does not MUST refuse the workflow with `capability_required` rather than accept a policy it will never honour. Node-level `nodes[].compensation` declarations remain valid without it \u2014 they describe the inverse action; this key requests the unwind."
|
|
832
846
|
}
|
|
833
847
|
}
|
|
834
848
|
}
|
|
@@ -124,6 +124,14 @@ describe('RFC 0151 §B — node compensation declaration', () => {
|
|
|
124
124
|
expect(ok, JSON.stringify(validate.errors)).toBe(true);
|
|
125
125
|
});
|
|
126
126
|
|
|
127
|
+
it('waiveRequiresApproval (S36) is an OPTIONAL boolean in the closed §B block — absent is valid (default = effective requiresApproval), non-boolean is refused', () => {
|
|
128
|
+
const decl = { nodeTypeId: 'vendor.shop.release', requiresApproval: true };
|
|
129
|
+
expect(validate({ ...base, compensation: { ...decl, waiveRequiresApproval: false } }), JSON.stringify(validate.errors)).toBe(true);
|
|
130
|
+
expect(validate({ ...base, compensation: { ...decl, waiveRequiresApproval: true } }), JSON.stringify(validate.errors)).toBe(true);
|
|
131
|
+
expect(validate({ ...base, compensation: { ...decl } }), 'absent MUST validate — the default is the obligation\'s effective requiresApproval, so no existing document changes meaning').toBe(true);
|
|
132
|
+
expect(validate({ ...base, compensation: { ...decl, waiveRequiresApproval: 'yes' } }), 'compensation.md §B: a plain boolean, not a policy language').toBe(false);
|
|
133
|
+
});
|
|
134
|
+
|
|
127
135
|
it('a node without compensation stays valid', () => {
|
|
128
136
|
// The profile is optional. Absent MUST NOT become a validation error, or
|
|
129
137
|
// every existing workflow in the corpus breaks.
|