diff --git a/infra/deploy-runner/README.md b/infra/deploy-runner/README.md index 144f802..969e58e 100644 --- a/infra/deploy-runner/README.md +++ b/infra/deploy-runner/README.md @@ -92,7 +92,7 @@ deleted. The active predecessor is package version `0.1.4` at immutable release `0.1.4-59dc9f7882721d6a`. Package `0.1.5` adds the provider-neutral complete -snapshot replace mode used by `map.zones.current.v1`; its Platform staging +snapshot replace mode used by `map.zones.current.v2`; its Platform staging remains inert until a separately reviewed Engine-owned transition selects the exact digest and accepts the updated MCP node schema. diff --git a/packages/external-provider-contract/providers/gelios/v6/README.md b/packages/external-provider-contract/providers/gelios/v6/README.md index 246a99c..1f70d0d 100644 --- a/packages/external-provider-contract/providers/gelios/v6/README.md +++ b/packages/external-provider-contract/providers/gelios/v6/README.md @@ -4,5 +4,5 @@ Adds the bounded, offset-paged `gelios.geozone` read capability and maps a complete account generation into `map.gelios-geofences.current.v1`. Gelios account geo-objects are deliberately not published into the normative -`map.zones.current.v1` Department of Transport dataset. Independent authorities +`map.zones.current.v2` Department of Transport dataset. Independent authorities must never share one replace generation. diff --git a/packages/external-provider-contract/test/provider-package.test.mjs b/packages/external-provider-contract/test/provider-package.test.mjs index fe30be3..f7f396a 100644 --- a/packages/external-provider-contract/test/provider-package.test.mjs +++ b/packages/external-provider-contract/test/provider-package.test.mjs @@ -46,12 +46,12 @@ assert.deepEqual(validateProviderPackage(geliosProviderPackageV6), { ok: true, e const zonesProduct = geliosProviderPackageV6.dataProducts.find((product) => product.id === "map.gelios-geofences.current.v1"); const registeredZonesProduct = JSON.parse(await readFile(new URL( - "../../../services/external-data-plane/definitions/map.zones.current.v1.json", + "../../../services/external-data-plane/definitions/map.zones.current.v2.json", import.meta.url, ), "utf8")); assert.deepEqual(zonesProduct.semanticTypes, ["map.zone"]); assert.equal(zonesProduct.fieldContracts.geometry.type, "geometry"); -assert.equal(registeredZonesProduct.version, "1.1.0"); +assert.equal(registeredZonesProduct.version, "2.0.0"); assert.deepEqual(registeredZonesProduct.fieldContracts.dataset_authority.enum, ["moscow-department-of-transport"]); assert.deepEqual(registeredZonesProduct.fieldContracts.source_adapter.enum, [ "depttrans-mmap-snapshot-v1", diff --git a/services/external-data-plane/definitions/map.zones.current.v1.json b/services/external-data-plane/definitions/map.zones.current.v1.json index 2786182..0bff86b 100644 --- a/services/external-data-plane/definitions/map.zones.current.v1.json +++ b/services/external-data-plane/definitions/map.zones.current.v1.json @@ -1,50 +1,32 @@ { "id": "map.zones.current.v1", - "version": "1.1.0", + "version": "1.0.0", "ontologyRevision": "ontology.map.zone.v1", "deliveryMode": "snapshot+patch", "semanticTypes": ["map.zone"], "fields": [ "area_square_meters", - "applies_to_couriers", - "applies_to_kicksharing", - "dataset_authority", - "dataset_id", "description", "display_name", "geometry", "geometry_kind", "max_speed_kph", "perimeter_meters", - "schedule_timezone", - "source_adapter", - "source_created_at", "source_kind", "source_revision", - "source_updated_at", - "style_color", - "weekly_speed_schedule" + "style_color" ], "fieldContracts": { "area_square_meters": { "type": "number", "required": false, "minimum": 0 }, - "applies_to_couriers": { "type": "boolean", "required": false }, - "applies_to_kicksharing": { "type": "boolean", "required": false }, - "dataset_authority": { "type": "string", "required": true, "enum": ["moscow-department-of-transport"] }, - "dataset_id": { "type": "string", "required": true, "enum": ["pmd-slow-zones"] }, "description": { "type": "string", "required": false }, "display_name": { "type": "string", "required": true }, "geometry": { "type": "geometry", "required": true }, "geometry_kind": { "type": "string", "required": true, "enum": ["circle", "corridor", "polygon"] }, "max_speed_kph": { "type": "number", "required": false, "minimum": 0 }, "perimeter_meters": { "type": "number", "required": false, "minimum": 0 }, - "schedule_timezone": { "type": "string", "required": false, "enum": ["Europe/Moscow"] }, - "source_adapter": { "type": "string", "required": true, "enum": ["depttrans-mmap-snapshot-v1", "depttrans-api-snapshot-v1"] }, - "source_created_at": { "type": "string", "required": false }, - "source_kind": { "type": "string", "required": true, "enum": ["versioned_snapshot"] }, + "source_kind": { "type": "string", "required": true, "enum": ["live_api", "versioned_snapshot"] }, "source_revision": { "type": "string", "required": true }, - "source_updated_at": { "type": "string", "required": false }, - "style_color": { "type": "string", "required": false }, - "weekly_speed_schedule": { "type": "string_array", "required": false } + "style_color": { "type": "string", "required": false } }, "history": { "mode": "none", "retentionDays": 1 } } diff --git a/services/external-data-plane/definitions/map.zones.current.v2.json b/services/external-data-plane/definitions/map.zones.current.v2.json new file mode 100644 index 0000000..770e07f --- /dev/null +++ b/services/external-data-plane/definitions/map.zones.current.v2.json @@ -0,0 +1,50 @@ +{ + "id": "map.zones.current.v2", + "version": "2.0.0", + "ontologyRevision": "ontology.map.zone.v1", + "deliveryMode": "snapshot+patch", + "semanticTypes": ["map.zone"], + "fields": [ + "area_square_meters", + "applies_to_couriers", + "applies_to_kicksharing", + "dataset_authority", + "dataset_id", + "description", + "display_name", + "geometry", + "geometry_kind", + "max_speed_kph", + "perimeter_meters", + "schedule_timezone", + "source_adapter", + "source_created_at", + "source_kind", + "source_revision", + "source_updated_at", + "style_color", + "weekly_speed_schedule" + ], + "fieldContracts": { + "area_square_meters": { "type": "number", "required": false, "minimum": 0 }, + "applies_to_couriers": { "type": "boolean", "required": false }, + "applies_to_kicksharing": { "type": "boolean", "required": false }, + "dataset_authority": { "type": "string", "required": true, "enum": ["moscow-department-of-transport"] }, + "dataset_id": { "type": "string", "required": true, "enum": ["pmd-slow-zones"] }, + "description": { "type": "string", "required": false }, + "display_name": { "type": "string", "required": true }, + "geometry": { "type": "geometry", "required": true }, + "geometry_kind": { "type": "string", "required": true, "enum": ["circle", "corridor", "polygon"] }, + "max_speed_kph": { "type": "number", "required": false, "minimum": 0 }, + "perimeter_meters": { "type": "number", "required": false, "minimum": 0 }, + "schedule_timezone": { "type": "string", "required": false, "enum": ["Europe/Moscow"] }, + "source_adapter": { "type": "string", "required": true, "enum": ["depttrans-mmap-snapshot-v1", "depttrans-api-snapshot-v1"] }, + "source_created_at": { "type": "string", "required": false }, + "source_kind": { "type": "string", "required": true, "enum": ["versioned_snapshot"] }, + "source_revision": { "type": "string", "required": true }, + "source_updated_at": { "type": "string", "required": false }, + "style_color": { "type": "string", "required": false }, + "weekly_speed_schedule": { "type": "string_array", "required": false } + }, + "history": { "mode": "none", "retentionDays": 1 } +} diff --git a/services/external-data-plane/test/definitions.test.mjs b/services/external-data-plane/test/definitions.test.mjs index f3ef34d..9e9bd1b 100644 --- a/services/external-data-plane/test/definitions.test.mjs +++ b/services/external-data-plane/test/definitions.test.mjs @@ -12,6 +12,7 @@ assert.deepEqual(bundled.map((definition) => definition.id), [ "fleet.positions.current.v3", "fleet.positions.current.v4", "map.zones.current.v1", + "map.zones.current.v2", ]); assert.deepEqual(bundled[0].semanticTypes, ["map.moving_object"]); assert.equal(bundled[0].ontologyRevision, "ontology.map.moving_object.v1"); @@ -46,12 +47,19 @@ assert.deepEqual(bundled[3].fieldContracts.movement_state, { required: true, enum: ["moving", "stopped"], }); -assert.equal(bundled[4].version, "1.1.0"); +assert.equal(bundled[4].version, "1.0.0"); assert.equal(bundled[4].ontologyRevision, "ontology.map.zone.v1"); assert.deepEqual(bundled[4].semanticTypes, ["map.zone"]); assert.deepEqual(bundled[4].fieldContracts.geometry, { type: "geometry", required: true }); +assert.equal(bundled[4].fields.includes("dataset_authority"), false); +assert.equal(bundled[5].version, "2.0.0"); +assert.equal(bundled[5].ontologyRevision, "ontology.map.zone.v1"); +assert.deepEqual(bundled[5].semanticTypes, ["map.zone"]); +assert.deepEqual(bundled[5].fieldContracts.geometry, { type: "geometry", required: true }); +assert.deepEqual(bundled[5].fieldContracts.dataset_authority.enum, ["moscow-department-of-transport"]); assert.equal(Object.keys(bundled[3].fieldContracts).length, bundled[3].fields.length); assert.equal(Object.keys(bundled[4].fieldContracts).length, bundled[4].fields.length); +assert.equal(Object.keys(bundled[5].fieldContracts).length, bundled[5].fields.length); const directory = await mkdtemp(join(tmpdir(), "nodedc-edp-definitions-")); try {