@openwop/openwop-conformance 1.72.1 → 1.72.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.
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "conformance-workflow-variable-format-advisory",
|
|
3
|
+
"name": "Conformance: WorkflowVariable.format is advisory (RFC 0136)",
|
|
4
|
+
"version": "1.0",
|
|
5
|
+
"description": "RFC 0136 requirement 3 witness. A single-node workflow whose variable `recipientEmail` declares `format: \"email\"` but carries an off-format `defaultValue` (\"not-an-email\"). `format` is an ADVISORY presentational hint, never a validation constraint — a host MUST NOT reject the definition or fail the run on the value/format mismatch. The scenario runs this fixture via POST /v1/runs (the portable pre-registered-workflow pattern, no host-specific create endpoint) and asserts the run reaches `completed`; a host that validates a variable value against its advisory `format` reds. Vendored (not created via POST /v1/workflows) because registration is 'POST /v1/workflows or equivalent' per capabilities.md — the create path is not a mandated portable surface.",
|
|
6
|
+
"nodes": [
|
|
7
|
+
{
|
|
8
|
+
"id": "n1",
|
|
9
|
+
"typeId": "core.identity",
|
|
10
|
+
"name": "Noop (format-advisory witness)",
|
|
11
|
+
"position": { "x": 0, "y": 0 },
|
|
12
|
+
"config": {},
|
|
13
|
+
"inputs": {}
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"edges": [],
|
|
17
|
+
"triggers": [
|
|
18
|
+
{ "id": "manual", "type": "manual", "enabled": true }
|
|
19
|
+
],
|
|
20
|
+
"variables": [
|
|
21
|
+
{ "name": "recipientEmail", "type": "string", "format": "email", "defaultValue": "not-an-email" }
|
|
22
|
+
],
|
|
23
|
+
"metadata": {
|
|
24
|
+
"tags": ["conformance", "rfc-0136", "workflow-variable-format"]
|
|
25
|
+
},
|
|
26
|
+
"settings": { "timeout": 5000 }
|
|
27
|
+
}
|
package/fixtures.md
CHANGED
|
@@ -69,6 +69,7 @@ All fixtures MUST advertise:
|
|
|
69
69
|
| Agent Pack Export | `conformance-agent-pack-export` | Phase 2 — workspace agents project to AgentManifest at `GET /v1/packs/export` | `completed` | ≤ 5s |
|
|
70
70
|
| Agent Pack Provenance | `conformance-agent-pack-provenance` | Phase 2 — `sourceManifestId` provenance round-trip | `completed` | ≤ 10s |
|
|
71
71
|
| Agent Pack Handoff Schema Validation | `conformance-agent-pack-handoff-schema-validation` | Phase 2 / HV-1 — host validates dispatch payloads against `handoff.taskSchemaRef` AND return payloads against `handoff.returnSchemaRef` per RFC 0003 §D. Three branches: valid-task → `completed`; invalid-task → `failed` with structured violation; mock-return-violation → violation surfaced before persistence. | varies by scenario | ≤ 5s |
|
|
72
|
+
| WorkflowVariable format advisory | `conformance-workflow-variable-format-advisory` | RFC 0136 req 3 — a variable declares `format: "email"` with an off-format `defaultValue`; `format` is advisory, so the run MUST complete (a value/format mismatch MUST NOT fail the run). Run via `POST /v1/runs` (portable pre-registered pattern). `workflow-variable-format.test.ts` leg B2. | `completed` | ≤ 5s |
|
|
72
73
|
| Dispatch Input Mapping | `conformance-dispatch-input-mapping` | RFC 0022 §A / HVMAP-1a — host honors `inputMapping` on `core.dispatch`. Capability-gated on `capabilities.agents.dispatchMapping`. | `completed` | ≤ 5s |
|
|
73
74
|
| Dispatch Output Mapping | `conformance-dispatch-output-mapping` | RFC 0022 §A / HVMAP-1b — host harvests child variables via `outputMapping` on `core.dispatch`. Capability-gated on `capabilities.agents.dispatchMapping`. | `completed` | ≤ 5s |
|
|
74
75
|
| Dispatch Cross-Worker Handoff | `conformance-dispatch-cross-worker-handoff` | RFC 0022 §A / HVMAP-1c — sequential fan-out: child-a writes via `perWorkerOutputMappings`, child-b reads via `perWorkerInputMappings`. Capability-gated on `capabilities.agents.dispatchMapping`. | `completed` | ≤ 10s |
|
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.72.
|
|
4
|
-
"corpusCommit": "
|
|
3
|
+
"suiteVersion": "1.72.2",
|
|
4
|
+
"corpusCommit": "e58d3553617279966cb010b68d7ac4caf8110ec7"
|
|
5
5
|
}
|
|
@@ -18,10 +18,14 @@
|
|
|
18
18
|
* (req 2), a non-string param minting no `format` (req 1). Soft-skips (404 /
|
|
19
19
|
* absent `variables`) on a host that advertises the flag but hasn't wired the
|
|
20
20
|
* seam's `variables[]` extension.
|
|
21
|
-
* B2
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
21
|
+
* B2 runs the vendored fixture `conformance-workflow-variable-format-advisory`
|
|
22
|
+
* (a workflow whose variable declares `format:"email"` with an off-format
|
|
23
|
+
* `defaultValue`) via `POST /v1/runs` — the portable pre-registered pattern, NOT a
|
|
24
|
+
* `POST /v1/workflows` create (registration is "POST /v1/workflows or equivalent",
|
|
25
|
+
* capabilities.md, so the create path is not a mandated portable surface). It asserts
|
|
26
|
+
* the run COMPLETES — a value/format mismatch MUST NOT fail the run (requirement 3,
|
|
27
|
+
* `format` advisory not validating). Gated on fixture advertisement; a
|
|
28
|
+
* format-validating host reds.
|
|
25
29
|
*
|
|
26
30
|
* NON-VACUITY: leg A2 is the one that would silently pass if `format` were declared as an
|
|
27
31
|
* enum — it asserts that a value OUTSIDE the recognised table validates. Sabotage: adding
|
|
@@ -42,6 +46,7 @@ import addFormats from 'ajv-formats';
|
|
|
42
46
|
import { SCHEMAS_DIR } from '../lib/paths.js';
|
|
43
47
|
import { behaviorGate } from '../lib/behavior-gate.js';
|
|
44
48
|
import { readCapabilityFamily } from '../lib/discovery-capabilities.js';
|
|
49
|
+
import { isFixtureAdvertised } from '../lib/fixtures.js';
|
|
45
50
|
import { driver } from '../lib/driver.js';
|
|
46
51
|
|
|
47
52
|
const cite = (section: string, requirement: string): string => `${section} — ${requirement}`;
|
|
@@ -191,36 +196,23 @@ describe('workflow-variable-format §B: host behaviour (RFC 0136, capability-gat
|
|
|
191
196
|
expect(fmt('count'), cite('§WorkflowVariable', 'req 1: a NON-STRING param mints no `format`')).toBeUndefined();
|
|
192
197
|
});
|
|
193
198
|
|
|
194
|
-
|
|
195
|
-
if (!(await deferredParamsGateOpen())) return;
|
|
199
|
+
const B2_FIXTURE = 'conformance-workflow-variable-format-advisory';
|
|
196
200
|
|
|
197
|
-
|
|
198
|
-
//
|
|
199
|
-
//
|
|
200
|
-
//
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
variables: [{ name: 'recipientEmail', type: 'string', format: 'email', defaultValue: 'not-an-email' }],
|
|
209
|
-
metadata: { tags: ['conformance', 'rfc-0136'] },
|
|
210
|
-
settings: { timeout: 5000 },
|
|
211
|
-
};
|
|
212
|
-
const create = await driver.post('/v1/workflows', wf);
|
|
213
|
-
if (create.status === 404) return; // host exposes no workflow-registration surface — soft-skip
|
|
201
|
+
it('B2 — a run whose variable value does not match its declared `format` is accepted and completes (req 3: `format` is advisory, not validating)', async () => {
|
|
202
|
+
// Portable pre-registered-workflow pattern (cf. agentPackHandoffSchemaValidation): the
|
|
203
|
+
// fixture `conformance-workflow-variable-format-advisory` carries a variable declaring
|
|
204
|
+
// `format:"email"` with an off-format `defaultValue`, run via POST /v1/runs — NO create
|
|
205
|
+
// endpoint, since registration is "POST /v1/workflows or equivalent" (capabilities.md)
|
|
206
|
+
// and the create path is not a mandated portable surface. Gate on fixture advertisement:
|
|
207
|
+
// req 3 is universal (not deferred-mode-specific), so it rides the host loading the fixture.
|
|
208
|
+
if (!isFixtureAdvertised(B2_FIXTURE)) return;
|
|
209
|
+
|
|
210
|
+
const run = await driver.post('/v1/runs', { workflowId: B2_FIXTURE });
|
|
211
|
+
if (run.status === 404) return; // no run surface — soft-skip
|
|
214
212
|
expect(
|
|
215
213
|
[200, 201],
|
|
216
|
-
cite('POST /v1/
|
|
217
|
-
).toContain(
|
|
218
|
-
const created = create.json as { workflowId?: string; id?: string };
|
|
219
|
-
const workflowId = created.workflowId ?? created.id ?? wf.id;
|
|
220
|
-
|
|
221
|
-
const run = await driver.post('/v1/runs', { workflowId });
|
|
222
|
-
if (run.status === 404) return;
|
|
223
|
-
expect([200, 201], cite('POST /v1/runs', 'the run is accepted despite the off-format variable value')).toContain(run.status);
|
|
214
|
+
cite('POST /v1/runs', 'req 3: a run whose variable value violates its advisory `format` is accepted, not rejected'),
|
|
215
|
+
).toContain(run.status);
|
|
224
216
|
const runId = (run.json as { runId: string }).runId;
|
|
225
217
|
|
|
226
218
|
let snap: { status: string } | undefined;
|