Skip to content

Commit 40bcd33

Browse files
Conformance finding: Waterline namespace operator visibility remains unproved (#179)
1 parent 1fb6e2c commit 40bcd33

4 files changed

Lines changed: 93 additions & 34 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# Changelog
22

3-
## 2.0.0-alpha.65
3+
## Unreleased
44

5-
Waterline 2.0.0-alpha.65 keeps the Durable Workflow 2.0 Waterline
6-
conformance claim aligned to platform conformance suite version 12. Upgrade-path
7-
migration visibility remains outside the release claim until Durable Workflow
8-
publishes a versioned migration scenario manifest and published-artifact
9-
conformance evidence exists for that category.
5+
Waterline keeps the Durable Workflow 2.0 conformance claim aligned to
6+
platform conformance suite version 15 and the current published artifact
7+
tuple: server 0.2.202, CLI 0.1.70, Workflow 2.0.0-alpha.185, Python SDK
8+
0.4.83, and Waterline 2.0.0-alpha.68. Migration runtime and skew refusal
9+
matrix evidence are now load-bearing Waterline release categories.

CONFORMANCE.md

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
Waterline participates in the public platform conformance suite specified
44
at <https://durable-workflow.github.io/docs/2.0/platform-conformance>,
5-
schema `durable-workflow.v2.platform-conformance.suite`, version `12`,
5+
schema `durable-workflow.v2.platform-conformance.suite`, version `15`,
66
and mirrored by `Workflow\V2\Support\PlatformConformanceSuite`. This
77
document is the per-repo claim: it lists the conformance targets
88
Waterline claims, the categories it covers, and the release gate that
@@ -25,13 +25,15 @@ Waterline claims one target from the suite's matrix:
2525
| `namespace_runtime_contract` | public namespace runtime scenario manifest at `/platform-conformance/namespace-runtime-scenarios.json` plus Waterline list, detail, health, and operator API captures | stable |
2626
| `saga_runtime_contract` | public saga runtime scenario manifest at `/platform-conformance/saga-runtime-scenarios.json` plus in-progress and terminal compensation detail captures | stable |
2727
| `worker_versioning_runtime_contract` | public worker-versioning runtime scenario manifest at `/platform-conformance/worker-versioning-runtime-scenarios.json` plus worker and run compatibility captures | stable |
28+
| `migration_runtime_contract` | public migration runtime scenario manifest at `/platform-conformance/migration-runtime-scenarios.json` plus Waterline operator visibility for migrated histories, schedules, worker registrations, and rollback state | stable |
29+
| `skew_refusal_matrix_contract` | public skew refusal scenario manifest at `/platform-conformance/skew-refusal-matrix-scenarios.json` plus Waterline render classification and version-pair evidence | stable |
2830
| `waterline_observer_envelopes` | selected-run detail `observer_state` envelope | provisional |
2931

3032
The stable `signal_query_runtime_contract` category is load-bearing for
3133
Waterline's observer comparison: a conformance run must be able to
3234
compare selected-run detail and the advertised query action path against
3335
public signal/query client results. The standalone observer-envelope
34-
fixture set remains **provisional** in suite version `12`. Waterline does
36+
fixture set remains **provisional** in suite version `15`. Waterline does
3537
not yet vendor a standalone public fixture directory; the existing
3638
per-repo tests under `tests/Feature/` and `tests/Unit/` exercise the
3739
`/waterline/api/v2/*` shapes against in-process fakes. Selected-run detail
@@ -51,7 +53,7 @@ detail envelope is the only observer surface captured.
5153

5254
Namespace-scoped Waterline list, detail, health, and operator API
5355
visibility are load-bearing evidence for the stable
54-
`namespace_runtime_contract` category in suite version `12`. A release
56+
`namespace_runtime_contract` category in suite version `15`. A release
5557
result must evaluate the public namespace runtime scenario manifest
5658
published at `/platform-conformance/namespace-runtime-scenarios.json`
5759
against published Waterline artifacts; in-repo feature coverage remains
@@ -61,7 +63,7 @@ evidence, namespace lifecycle cleanup and recreate coverage, workflow and
6163
worker isolation, CLI and SDK namespace selection, search-attribute and
6264
schedule isolation, Waterline operator namespace visibility, explicit
6365
Nexus cross-namespace calls, reserved-name refusal, and result-record
64-
routing for product findings. Suite version `12` also binds the lifecycle
66+
routing for product findings. Suite version `15` also binds the lifecycle
6567
cleanup criteria that preserve cross-namespace external payload ownership:
6668
cleanup may remove only payload references owned by the deleted namespace,
6769
must keep tenant-owned cross-namespace workflow and service-call records
@@ -81,11 +83,11 @@ visibility cell:
8183

8284
```bash
8385
php artisan waterline:namespace-conformance \
84-
--artifact-version=server=0.2.N \
85-
--artifact-version=cli=0.1.N \
86-
--artifact-version=workflow=2.0.0-alpha.N \
87-
--artifact-version=sdk-python=0.4.N \
88-
--artifact-version=waterline=2.0.0-alpha.N \
86+
--artifact-version=server=0.2.202 \
87+
--artifact-version=cli=0.1.70 \
88+
--artifact-version=workflow=2.0.0-alpha.185 \
89+
--artifact-version=sdk-python=0.4.83 \
90+
--artifact-version=waterline=2.0.0-alpha.68 \
8991
--artifact-source=server=docker_image \
9092
--artifact-source=cli=official_install_script \
9193
--artifact-source=workflow=packagist_package \
@@ -101,8 +103,9 @@ routes, emits a
101103
`durable-workflow.v2.namespace-runtime.result` document with
102104
`waterline_operator_namespace_visibility` populated, includes the scoped and
103105
unscoped API and dashboard response captures used by the pass/fail checks,
104-
records the conformance suite version and rejects missing, local, source, or
105-
development artifact metadata, adds an `operator_surface_matrix` verdict for
106+
records the conformance suite version and rejects missing, placeholder,
107+
local, source, or development artifact metadata, adds an
108+
`operator_surface_matrix` verdict for
106109
scoped workflow lists, workflow details, schedule views,
107110
search-attribute values, dashboard scope, stats/operator APIs, and documented
108111
unscoped authority, and removes its fixture rows unless `--keep-fixtures` is
@@ -128,11 +131,18 @@ evidence for `worker_versioning_runtime_contract`. A result must compare
128131
worker build IDs, drain/resume state, no-compatible-worker diagnostics,
129132
and run compatibility fields through public Waterline surfaces.
130133

131-
Upgrade-path migration visibility is outside this suite-12 claim until
132-
the public conformance origin publishes a stable runtime manifest for
133-
that category. Waterline release evidence must not treat in-repo upgrade
134-
smoke coverage as a substitute for a downloadable public scenario
135-
manifest.
134+
Migration runtime visibility is part of this suite-15 claim. Waterline
135+
release evidence must compare the public migration runtime scenario
136+
manifest against the resolved published artifact tuple and prove operator
137+
visibility for migrated histories, in-flight progress, schedules, worker
138+
registrations, new v2 starts, rollback state, and version-skew refusal.
139+
In-repo upgrade smoke coverage remains implementation evidence, not a
140+
substitute for a downloadable public scenario manifest result.
141+
142+
Skew refusal matrix coverage is also part of this suite-15 claim. A
143+
release result must compare the public skew refusal scenario manifest
144+
against published artifacts and show how Waterline classifies compatible,
145+
backward-skewed, and unsupported server or worker protocol combinations.
136146

137147
The standalone observer-envelope fixture set is promoted to **required**
138148
in a future suite version once the contract slice for the operator
@@ -147,10 +157,12 @@ tag.
147157
| Field | Value |
148158
| --- | --- |
149159
| Required claimed targets | `waterline_contract_surface` |
150-
| Required suite version | `PlatformConformanceSuite::VERSION` / public suite manifest version `12` |
151-
| Namespace runtime source | `/platform-conformance/namespace-runtime-scenarios.json` from the public docs origin, with `suite_version` `12` |
152-
| Saga runtime source | `/platform-conformance/saga-runtime-scenarios.json` from the public docs origin, with `suite_version` `12` |
153-
| CI job | `platform-conformance` (blocks on stable runtime categories including `signal_query_runtime_contract`, `search_attribute_runtime_contract`, `namespace_runtime_contract`, `saga_runtime_contract`, and `worker_versioning_runtime_contract`; advisory only for `waterline_observer_envelopes` while it is provisional) |
160+
| Required suite version | `PlatformConformanceSuite::VERSION` / public suite manifest version `15` |
161+
| Namespace runtime source | `/platform-conformance/namespace-runtime-scenarios.json` from the public docs origin, with `suite_version` `15` |
162+
| Saga runtime source | `/platform-conformance/saga-runtime-scenarios.json` from the public docs origin, with `suite_version` `15` |
163+
| Migration runtime source | `/platform-conformance/migration-runtime-scenarios.json` from the public docs origin, with `suite_version` `15` |
164+
| Skew refusal source | `/platform-conformance/skew-refusal-matrix-scenarios.json` from the public docs origin, with `suite_version` `15` |
165+
| CI job | `platform-conformance` (blocks on stable runtime categories including `signal_query_runtime_contract`, `search_attribute_runtime_contract`, `namespace_runtime_contract`, `saga_runtime_contract`, `worker_versioning_runtime_contract`, `migration_runtime_contract`, and `skew_refusal_matrix_contract`; advisory only for `waterline_observer_envelopes` while it is provisional) |
154166
| Block on `nonconforming` | yes |
155167
| Artifact attached to release | harness result document, schema `durable-workflow.v2.platform-conformance.result` |
156168

app/Console/NamespaceConformanceCommand.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1839,10 +1839,18 @@ private static function unpublishedVersionReason(string $version): ?string
18391839
return 'placeholder_label';
18401840
}
18411841

1842+
if (preg_match('/(^|[._+~\/-])(?:n|x|xx|xxx)(?=$|[._+~\/-])/', $normalized) === 1) {
1843+
return 'placeholder_version_segment';
1844+
}
1845+
18421846
if (str_contains($normalized, '*')) {
18431847
return 'wildcard_version';
18441848
}
18451849

1850+
if (preg_match('/(^|[,\s])(?:[~^]|[<>]=?|=)/', $normalized) === 1) {
1851+
return 'version_constraint';
1852+
}
1853+
18461854
if (
18471855
$normalized === 'self.version'
18481856
|| preg_match($localVersionPattern, $normalized) === 1

tests/Feature/NamespaceConformanceCommandTest.php

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ public function testCommandEmitsWaterlineOperatorNamespaceVisibilityShard(): voi
2222
'--shared-namespace' => 'shared',
2323
'--run-id' => 'waterline-ns-test',
2424
'--artifact-version' => [
25-
'server=0.2.186',
26-
'cli=0.1.67',
27-
'workflow=2.0.0-alpha.177',
28-
'sdk-python=0.4.78',
29-
'waterline=2.0.0-alpha.61',
25+
'server=0.2.202',
26+
'cli=0.1.70',
27+
'workflow=2.0.0-alpha.185',
28+
'sdk-python=0.4.83',
29+
'waterline=2.0.0-alpha.68',
3030
],
3131
'--artifact-source' => [
3232
'server=docker_image',
@@ -59,9 +59,9 @@ public function testCommandEmitsWaterlineOperatorNamespaceVisibilityShard(): voi
5959
$this->assertSame(PlatformConformanceSuite::VERSION, $report['suite_version']);
6060
$this->assertSame('waterline-operator-namespace-shard', $report['coverage_scope']);
6161
$this->assertSame('non_passing', $report['outcome']);
62-
$this->assertSame('2.0.0-alpha.61', $report['artifact_versions']['waterline']);
63-
$this->assertSame('2.0.0-alpha.177', $report['artifact_versions']['workflow']);
64-
$this->assertSame('2.0.0-alpha.177', $report['artifact_versions']['workflow-php']);
62+
$this->assertSame('2.0.0-alpha.68', $report['artifact_versions']['waterline']);
63+
$this->assertSame('2.0.0-alpha.185', $report['artifact_versions']['workflow']);
64+
$this->assertSame('2.0.0-alpha.185', $report['artifact_versions']['workflow-php']);
6565
$this->assertSame('published_package', $report['artifact_sources']['waterline']);
6666
$this->assertSame('published_composer_package', $report['artifact_sources']['workflow']);
6767
$this->assertSame('published_composer_package', $report['artifact_sources']['workflow-php']);
@@ -201,6 +201,45 @@ public function testCommandFailsWhenPublishedArtifactTupleIsNotProven(): void
201201
);
202202
}
203203

204+
public function testCommandRejectsPlaceholderPublishedArtifactVersions(): void
205+
{
206+
$reportPath = $this->ephemeralPath('waterline-namespace-conformance');
207+
208+
$this->artisan('waterline:namespace-conformance', [
209+
'--namespace-a' => 'billing',
210+
'--namespace-b' => 'shipping',
211+
'--run-id' => 'waterline-ns-placeholder-artifact-test',
212+
'--artifact-version' => [
213+
'server=0.2.N',
214+
'cli=0.1.N',
215+
'workflow=2.0.0-alpha.N',
216+
'sdk-python=0.4.N',
217+
'waterline=2.0.0-alpha.N',
218+
],
219+
'--artifact-source' => [
220+
'server=docker_image',
221+
'cli=published_install_script',
222+
'workflow=published_composer_package',
223+
'sdk-python=published_pypi_package',
224+
'waterline=published_package',
225+
],
226+
'--output' => $reportPath,
227+
])->assertExitCode(1);
228+
229+
$report = $this->readJson($reportPath);
230+
$scenarios = array_column($report['scenario_results'], null, 'scenario_id');
231+
$rejectedVersions = $scenarios['published_artifact_install_only']['observed_outputs']['rejected_versions'];
232+
233+
$this->assertSame('fail', $report['outcome']);
234+
$this->assertSame('fail', $scenarios['published_artifact_install_only']['status']);
235+
$this->assertSame([], $scenarios['published_artifact_install_only']['observed_outputs']['missing_artifact_versions']);
236+
$this->assertSame('placeholder_version_segment', $rejectedVersions['server']['reason']);
237+
$this->assertSame('placeholder_version_segment', $rejectedVersions['cli']['reason']);
238+
$this->assertSame('placeholder_version_segment', $rejectedVersions['workflow-php']['reason']);
239+
$this->assertSame('placeholder_version_segment', $rejectedVersions['sdk-python']['reason']);
240+
$this->assertSame('placeholder_version_segment', $rejectedVersions['waterline']['reason']);
241+
}
242+
204243
/**
205244
* @param array<string, mixed> $visibility
206245
*/

0 commit comments

Comments
 (0)