@zhuoyuezs/ml-platform 0.1.18 → 0.2.0

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/checksums.json CHANGED
@@ -2,17 +2,17 @@
2
2
  "files": [
3
3
  {
4
4
  "path": "runtime/business-client/README.md",
5
- "sha256": "sha256:69a21686d3b27682ad9864646f59353ca188454851941e63a88175951f516450",
6
- "size_bytes": 7326
5
+ "sha256": "sha256:61708adaee4479fe138ac5e6df1adc02be09cfeb6c30a7f9211ccc372c0e8ced",
6
+ "size_bytes": 7553
7
7
  },
8
8
  {
9
9
  "path": "runtime/business-client/package-lock.json",
10
- "sha256": "sha256:386e8b46ae8e6d7fd83e247b0412560710bee263c2545b593c5442b8f1363765",
10
+ "sha256": "sha256:ff46c68537d57d95b324318ab10a0b70847afa6db15a9223b74b6bc074925a5c",
11
11
  "size_bytes": 381
12
12
  },
13
13
  {
14
14
  "path": "runtime/business-client/package.json",
15
- "sha256": "sha256:83e60780d91abc78420a533ba0f8ea184f31886f963ca6f1554da819530a6335",
15
+ "sha256": "sha256:3a82339cbb18e0e205647860f72a4a1ecbaf3182e22431c7810dd5e3e32bac19",
16
16
  "size_bytes": 501
17
17
  },
18
18
  {
@@ -22,8 +22,8 @@
22
22
  },
23
23
  {
24
24
  "path": "runtime/business-client/src/cli.js",
25
- "sha256": "sha256:566ce8f224b74f03fcf168f5f2c8102505f1041b85862e8c407ce9103c96424f",
26
- "size_bytes": 53638
25
+ "sha256": "sha256:255c1ddf9521f7d6b336122a4678b1e9aab34e1ff4e894395a9e69316bacb4ad",
26
+ "size_bytes": 54119
27
27
  },
28
28
  {
29
29
  "path": "runtime/business-client/src/config.js",
@@ -117,8 +117,8 @@
117
117
  },
118
118
  {
119
119
  "path": "skills/model-deployment-management/SKILL.md",
120
- "sha256": "sha256:a78f492b95258e2111e8f410f4bf731cb2fa71997f39d236d9bf75dda3e0ad18",
121
- "size_bytes": 3082
120
+ "sha256": "sha256:d50f64fa709c8ff36da97c60ce0d20b1217d1d9f78f602048f49c0c4bbab7ea2",
121
+ "size_bytes": 3927
122
122
  },
123
123
  {
124
124
  "path": "skills/model-deployment-management/agents/openai.yaml",
@@ -127,18 +127,18 @@
127
127
  },
128
128
  {
129
129
  "path": "skills/model-deployment-management/references/contracts.md",
130
- "sha256": "sha256:49a2595106b9b0cb5a305acbd285cdccad2bf4aa7627d6fb6b966783372ea724",
131
- "size_bytes": 3543
130
+ "sha256": "sha256:de9fd3de8d88179b09108ee0778fb83fbffa304353706a3bbc14ae3d9276ac01",
131
+ "size_bytes": 5417
132
132
  },
133
133
  {
134
134
  "path": "skills/model-deployment-management/references/operations.md",
135
- "sha256": "sha256:4407d87c1debbc865095b2857a6ece7a728d04b25fd8772d4a79a0361b0724ea",
136
- "size_bytes": 3474
135
+ "sha256": "sha256:93977ec65a8b1ac51a5134ab98ac095e177de537c81f0db447ad97fb8a7e910f",
136
+ "size_bytes": 4455
137
137
  },
138
138
  {
139
139
  "path": "skills/model-deployment-management/references/troubleshooting.md",
140
- "sha256": "sha256:fcdd4b244d670513fe14a3f343af2074a24cac0e3b07645ad455658564314e95",
141
- "size_bytes": 2852
140
+ "sha256": "sha256:08762d603b938375cd3a76539c1d0320337d48f5bcd5ba061b8f16eaf35f9268",
141
+ "size_bytes": 3555
142
142
  },
143
143
  {
144
144
  "path": "skills/model-lifecycle-management/SKILL.md",
@@ -162,8 +162,8 @@
162
162
  },
163
163
  {
164
164
  "path": "skills/model-lifecycle-management/references/packaging.md",
165
- "sha256": "sha256:ad4e519f895d121202f99ed038a0ac6a6db3d97bdf95473e942399163d7062a3",
166
- "size_bytes": 5640
165
+ "sha256": "sha256:1e3c5080fa085255b29223890c333333ee6011326b56f1b2e0b859b0d73d2ec0",
166
+ "size_bytes": 6146
167
167
  },
168
168
  {
169
169
  "path": "skills/model-lifecycle-management/references/training-contracts.md",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhuoyuezs/ml-platform",
3
- "version": "0.1.18",
3
+ "version": "0.2.0",
4
4
  "description": "ML 数据平台 business CLI 与 Agent Skills 管理工具",
5
5
  "bin": {
6
6
  "ml-platform": "scripts/main.js"
package/release.json CHANGED
@@ -13,8 +13,8 @@
13
13
  "entrypoint": "src/cli.js",
14
14
  "name": "ml-platform",
15
15
  "path": "runtime/business-client",
16
- "sha256": "sha256:4304c1a26444c60408541217bc252e871a2950d1e3d6259dc0bf6b27d294bf09",
17
- "version": "0.7.8"
16
+ "sha256": "sha256:41f143a9451dbd740ec08070a33e21d4580e246cf4b282e0ffda6d9f6f9f880a",
17
+ "version": "0.8.0"
18
18
  },
19
19
  "policy_sha256": "sha256:02fbde0134696b78c0c365d6e0b76c9814227208da5b2b3d4e5dbd82dc4a3606",
20
20
  "public_schema_versions": [
@@ -25,7 +25,7 @@
25
25
  "ml_data_platform.feature_set/v1",
26
26
  "ml_data_platform.dataset_manifest/v1"
27
27
  ],
28
- "release_version": "0.1.18",
28
+ "release_version": "0.2.0",
29
29
  "runtime_requirements": {
30
30
  "node": ">=18",
31
31
  "os": [
@@ -37,22 +37,22 @@
37
37
  "skills": {
38
38
  "feature-management": {
39
39
  "path": "skills/feature-management",
40
- "requires_cli": ">=0.7.8 <0.8.0",
41
- "revision": "0.1.18",
40
+ "requires_cli": ">=0.8.0 <0.9.0",
41
+ "revision": "0.2.0",
42
42
  "sha256": "sha256:d32f0306f129d7bf76eb037fe239c84dd3c29c64b61600799d6e40320784bb10"
43
43
  },
44
44
  "model-deployment-management": {
45
45
  "path": "skills/model-deployment-management",
46
- "requires_cli": ">=0.7.8 <0.8.0",
47
- "revision": "0.1.18",
48
- "sha256": "sha256:b09f84d5270406d918cb5fe5818f84424ff41c1167c1b18f8d2b18f2e9b4a047"
46
+ "requires_cli": ">=0.8.0 <0.9.0",
47
+ "revision": "0.2.0",
48
+ "sha256": "sha256:d81becca0076d0513e7b8277e7584d9f810db755aa56e79235df68d0f7a7659b"
49
49
  },
50
50
  "model-lifecycle-management": {
51
51
  "path": "skills/model-lifecycle-management",
52
- "requires_cli": ">=0.7.8 <0.8.0",
53
- "revision": "0.1.18",
54
- "sha256": "sha256:7c79a6393e302579e2aa48c6e20754aa992776d0f8936f897bb0feeafc84e508"
52
+ "requires_cli": ">=0.8.0 <0.9.0",
53
+ "revision": "0.2.0",
54
+ "sha256": "sha256:5a911eff6a4c188d8e3709f37e4f37819effea61db9f5a015e6ec4dddd4a0ec7"
55
55
  }
56
56
  },
57
- "source_commit": "ec29c26"
57
+ "source_commit": "aa4c64af0715b168edd4d50766f7b6bf851763ff"
58
58
  }
@@ -76,10 +76,13 @@ ml-platform get-deployment-events <deployment-id> --limit 100 --offset 0
76
76
  ml-platform predict-deployment <deployment-id> /absolute/path/to/request.json
77
77
  ```
78
78
 
79
- 部署文件可用 `inference_policy` 配置默认执行 horizon 和半开输出窗口。例如 15 分钟频率、
79
+ 部署文件可用 `inference_policy` 配置默认执行 horizon 和输出窗口。`boundary` 默认
80
+ `[start,end)`,也可显式使用 `(start,end]`。例如 15 分钟频率、
80
81
  当天 00:00 cutoff、只返回次日全天时,配置 `horizon=2d` 和 `[1d,2d)`;模型必须具备
81
82
  192 点输出能力,响应返回 96 点。请求可省略 `horizon` 和 `output_window` 使用部署默认值,
82
- 也可携带其中任意一项覆盖;覆盖值仍受模型长度、频率和窗口边界校验。
83
+ 也可携带其中任意一项覆盖;覆盖值仍受模型长度、频率和窗口边界校验。8 天、768 点模型要
84
+ 返回次日 00:15 至第八天 24:00,可配置
85
+ `{"start_offset":"1d","end_offset":"8d","boundary":"(start,end]"}`,仍返回 672 点。
83
86
 
84
87
  直接访问已知外部 Serving URL 时仍可使用 `predict-model`。Chronos-2 v2 的
85
88
  `known_future` 协变量放在 inline 请求的 `inputs.future_covariates` 中;每个预测步一行,
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@zhuoyuezs/ml-platform-business-client",
3
- "version": "0.7.8",
3
+ "version": "0.8.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@zhuoyuezs/ml-platform-business-client",
9
- "version": "0.7.8",
9
+ "version": "0.8.0",
10
10
  "license": "UNLICENSED",
11
11
  "bin": {
12
12
  "ml-platform": "src/cli.js"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhuoyuezs/ml-platform-business-client",
3
- "version": "0.7.8",
3
+ "version": "0.8.0",
4
4
  "private": true,
5
5
  "description": "JavaScript implementation of the ML Platform business client",
6
6
  "bin": {
@@ -29,7 +29,7 @@ const BUSINESS_COMMANDS = new Set([
29
29
  "add-dataset", "update-dataset", "delete-dataset", "list-dataset-artifacts",
30
30
  "register-operator", "show-operator-specs", "delete-operator", "run-operator",
31
31
  "get-job", "wait-job", "retry-job", "cancel-job", "get-dataset-artifact", "download-dataset-artifact", "fetch-inference-data", "fetch-inference-context", "predict-model", "apply",
32
- "register-trainer", "list-trainer-definitions", "get-trainer-definition", "register-training-run", "validate-training-run", "submit-training-job", "get-training-job", "retry-training-job", "cancel-training-job",
32
+ "list-system-models", "get-system-model", "list-trainer-definitions", "get-trainer-definition", "register-training-run", "validate-training-run", "submit-training-job", "get-training-job", "retry-training-job", "cancel-training-job",
33
33
  "register-evaluation-config", "get-evaluation-config", "register-metric-definition", "get-metric-definition",
34
34
  "register-executable-package", "verify-executable-package", "publish-executable-package",
35
35
  "validate-evaluation-run", "submit-evaluation", "get-evaluation-run", "get-evaluation-job", "retry-evaluation-job", "cancel-evaluation-job", "list-evaluation-attempts",
@@ -110,7 +110,8 @@ const COMMAND_USAGE = {
110
110
  "fetch-inference-data": "fetch-inference-data MANIFEST --cutoff-time TIMESTAMP [--max-workers N] [--max-source-lag-hours HOURS] [--no-validate-freshness] [--allow-missing]",
111
111
  "fetch-inference-context": "fetch-inference-context REQUEST_JSON",
112
112
  "predict-model": "predict-model REQUEST_JSON --serving-url URL",
113
- "register-trainer": "register-trainer DEFINITION_JSON",
113
+ "list-system-models": "list-system-models",
114
+ "get-system-model": "get-system-model NAME VERSION [--project PROJECT]",
114
115
  "list-trainer-definitions": "list-trainer-definitions",
115
116
  "get-trainer-definition": "get-trainer-definition NAME VERSION [--project PROJECT]",
116
117
  "register-training-run": "register-training-run RUN_JSON",
@@ -598,18 +599,23 @@ async function runBusinessCli(argv) {
598
599
  } else if (options.command === "get-executable-package") {
599
600
  const name = positional(rest, "package name"); const version = positional(rest, "package version");
600
601
  result = await client(options).get(`/executable-packages/${encodeURIComponent(name)}/${encodeURIComponent(version)}`);
602
+ } else if (options.command === "list-system-models") {
603
+ result = await client(options).get("/system-models");
604
+ } else if (options.command === "get-system-model") {
605
+ const name = positional(rest, "system model name"); const version = positional(rest, "system model version"); const project = take(rest, "--project", "default");
606
+ result = await client(options).get(`/system-models/${encodeURIComponent(project)}/${encodeURIComponent(name)}/${encodeURIComponent(version)}`);
601
607
  } else if (options.command === "list-trainer-definitions") {
602
608
  result = await client(options).get("/trainer-definitions");
603
609
  } else if (options.command === "get-trainer-definition") {
604
610
  const name = positional(rest, "trainer name"); const version = positional(rest, "trainer version"); const project = take(rest, "--project", "default");
605
611
  result = await client(options).get(`/trainer-definitions/${encodeURIComponent(project)}/${encodeURIComponent(name)}/${encodeURIComponent(version)}`);
606
612
  } else if ({
607
- "register-trainer": "/trainer-definitions", "register-training-run": "/training-runs", "validate-training-run": "/training-runs/validate",
613
+ "register-training-run": "/training-runs", "validate-training-run": "/training-runs/validate",
608
614
  "validate-training-job": "/training-jobs/validate", "validate-model-package": "/model-packages/validate", "submit-training-job": "/training-jobs", "register-evaluation-config": "/evaluation-configs", "register-metric-definition": "/metric-definitions",
609
615
  "register-executable-package": "/executable-packages", "validate-evaluation-run": "/evaluation-runs/validate", "submit-evaluation": "/evaluation-runs",
610
616
  "create-model-package": "/model-packages",
611
617
  }[options.command]) {
612
- const endpoint = { "register-trainer": "/trainer-definitions", "register-training-run": "/training-runs", "validate-training-run": "/training-runs/validate", "validate-training-job": "/training-jobs/validate", "validate-model-package": "/model-packages/validate", "submit-training-job": "/training-jobs", "register-evaluation-config": "/evaluation-configs", "register-metric-definition": "/metric-definitions", "register-executable-package": "/executable-packages", "validate-evaluation-run": "/evaluation-runs/validate", "submit-evaluation": "/evaluation-runs", "create-model-package": "/model-packages" }[options.command];
618
+ const endpoint = { "register-training-run": "/training-runs", "validate-training-run": "/training-runs/validate", "validate-training-job": "/training-jobs/validate", "validate-model-package": "/model-packages/validate", "submit-training-job": "/training-jobs", "register-evaluation-config": "/evaluation-configs", "register-metric-definition": "/metric-definitions", "register-executable-package": "/executable-packages", "validate-evaluation-run": "/evaluation-runs/validate", "submit-evaluation": "/evaluation-runs", "create-model-package": "/model-packages" }[options.command];
613
619
  result = await client(options).post(endpoint, readSpec(positional(rest, "request JSON")));
614
620
  } else if (/^(get|retry|cancel)-training-job$/.test(options.command)) {
615
621
  const jobId = positional(rest, "training job id"); const endpoint = `/training-jobs/${encodeURIComponent(jobId)}`;
@@ -29,7 +29,8 @@ deployment does not reach `READY` or an operation is rejected.
29
29
  - Use only a `READY` ModelPackage image with an immutable `@sha256:` digest and
30
30
  the package-bound FeatureRetrievalSpec and smoke request.
31
31
  - When `DeploymentSpec.inference_policy` is configured, treat its horizon and
32
- half-open output window as request defaults. Prediction requests may omit or
32
+ output window as request defaults. The window boundary defaults to
33
+ `[start,end)` and may explicitly use `(start,end]`. Prediction requests may omit or
33
34
  override `horizon` and `output_window`; every effective combination must fit
34
35
  the model capacity and sampling grid. In `feature_lookup` mode, never send
35
36
  `future_covariates`; the platform retrieves the complete known-future Feature
@@ -42,9 +43,20 @@ deployment does not reach `READY` or an operation is rejected.
42
43
  returned an ambiguous result.
43
44
  - Treat `READY` as valid only when `ReplicasReady`, `ArtifactsVerified`, and
44
45
  `SmokePredictionPassed` are all true for the current revision.
45
- - Use `predict-deployment`; it routes through the control plane to the recorded
46
- deployment endpoint. Do not infer Kubernetes Service names or require the
47
- user to reach a cluster-local URL.
46
+ - Use `predict-deployment` for governed deployment verification. Do not infer
47
+ Kubernetes Service names from a deployment ID.
48
+ - Treat every prediction response `target_time` as China Standard Time in RFC
49
+ 3339 `+08:00` form. The represented instant remains identical to the UTC
50
+ cutoff and output-window calculations.
51
+ - `DeploymentSpec.service_exposure` defaults to `ClusterIP`. An explicit
52
+ `NodePort` value creates one deployment-level direct Serving Service that
53
+ follows the current revision; it does not replace validation, approval,
54
+ rollout, READY gates, or audit history.
55
+ - Every model Serving process publishes that model's Swagger UI at `/docs`,
56
+ OpenAPI JSON at `/openapi.json`, and ReDoc at `/redoc`. The document embeds
57
+ the deployed artifact identity and its actual input modes, ordered columns,
58
+ horizon semantics, known-future contract, and output schema. These are model
59
+ data-plane documents, not the control-plane API documentation.
48
60
  - Never create, modify, or delete NetworkPolicy. Cluster operators own that
49
61
  boundary.
50
62
 
@@ -16,10 +16,21 @@ load-bearing fields:
16
16
  "package_version": "1",
17
17
  "image": "registry.example/model-serving@sha256:<64-hex>",
18
18
  "target": {"type": "kubernetes", "namespace": "itsmp-model-serving"},
19
+ "service_exposure": {
20
+ "type": "NodePort",
21
+ "port": 80,
22
+ "node_port": 32080,
23
+ "advertised_host": "10.36.9.212",
24
+ "scheme": "http"
25
+ },
19
26
  "feature_retrieval": {},
20
27
  "inference_policy": {
21
28
  "horizon": {"duration": "2d"},
22
- "output_window": {"start_offset": "1d", "end_offset": "2d"},
29
+ "output_window": {
30
+ "start_offset": "1d",
31
+ "end_offset": "2d",
32
+ "boundary": "[start,end)"
33
+ },
23
34
  "allow_request_override": true
24
35
  },
25
36
  "replicas": 1,
@@ -35,18 +46,21 @@ The server normalizes an omitted lookup test from the package during
35
46
  validation and creation.
36
47
 
37
48
  `inference_policy` is optional. When present, its horizon and offsets must be
38
- whole-minute durations aligned to the model sampling frequency. The half-open
39
- window `[cutoff+start_offset, cutoff+end_offset)` must be non-empty, end within
40
- the configured horizon, and fit the model's maximum sequence output. A 15-minute
41
- model using `horizon=2d` and `[1d,2d)` therefore needs at least 192 output steps
42
- and returns 96 steps. This is a response projection, not extra model capacity.
49
+ whole-minute durations aligned to the model sampling frequency. `boundary`
50
+ defaults to `[start,end)` and may be `(start,end]`. The selected interval must
51
+ be non-empty, end within the configured horizon, and fit the model's maximum
52
+ sequence output. A 15-minute model using `horizon=2d` and `[1d,2d)` therefore
53
+ needs at least 192 output steps and returns 96 steps. An 8-day, 768-step model
54
+ using `(1d,8d]` returns step 97 through step 768: next-day 00:15 through day-eight
55
+ 24:00, 672 points total. This is a response projection, not extra model capacity.
43
56
 
44
57
  The deployment values are defaults. Calls may omit `horizon` and
45
58
  `output_window`, override either one, or override both. Serving validates the
46
59
  effective values again; an output window must remain non-empty, aligned, inside
47
60
  the effective horizon, and within model capacity. Set
48
61
  `allow_request_override=false` only when the endpoint must reject non-equivalent
49
- request values.
62
+ request values. An override that omits `boundary` uses `[start,end)`; include
63
+ `boundary` explicitly to preserve `(start,end]` semantics.
50
64
 
51
65
  Known-future covariates still cover the model's complete prediction length,
52
66
  including points outside a shorter returned window. In `feature_lookup` mode,
@@ -59,6 +73,22 @@ The first deployment starts at `staging`. A replacement for an existing
59
73
  service/environment declares the active leaf in `previous_deployment_id`.
60
74
  Production is reached only by staging to canary to production promotion.
61
75
 
76
+ `service_exposure` is optional and defaults to `{"type":"ClusterIP"}`. Set
77
+ `type=NodePort` only when direct node access is required. `node_port` is
78
+ optional; when omitted Kubernetes allocates it, and the observed endpoint
79
+ reports the assigned value. An explicit value must be in `30000..32767`.
80
+ `advertised_host` is also optional: provide it only when that node address is
81
+ known to be reachable by callers. Without it, the endpoint returns a URL
82
+ template rather than claiming external reachability.
83
+
84
+ The controller keeps preview, stable, and canary Services as ClusterIP for
85
+ verification and Gateway traffic. NodePort exposure uses one fixed-name Service
86
+ per DeploymentSpec and creates or updates it only after the revision passes all
87
+ READY gates. Retained revisions of that deployment share the Service, while a
88
+ replacement deployment receives a different Service so staging cannot rewrite
89
+ the existing production route. When replacement deployments request explicit
90
+ ports, their values must not collide while both deployments exist.
91
+
62
92
  ## Revision State
63
93
 
64
94
  `DeploymentSpec` is immutable. Its inference policy and full deployment contract
@@ -77,6 +107,12 @@ The detail response includes `endpoints`. Cluster-local endpoints have
77
107
  when rollout hostname metadata exists. `available=true` means the current
78
108
  revision passed all READY gates.
79
109
 
110
+ Each endpoint advertises `inference_path=/v1/inference`, `docs_url`,
111
+ `openapi_url`, and `redoc_url`. When no reviewed host is available, the
112
+ NodePort endpoint returns corresponding URL templates instead. The Serving
113
+ OpenAPI document is generated for the deployed ModelArtifact and embeds the
114
+ effective model contract; it is not a generic platform API schema.
115
+
80
116
  Successful smoke verification is cached durably by revision, image digest,
81
117
  FeatureRetrieval contract hash, deployment contract hash, and frozen lookup-test
82
118
  hash. A new revision or changed identity must run smoke again.
@@ -29,6 +29,22 @@ Use `get-deployment` to inspect the full revision history and endpoints. Use
29
29
  `list-deployments` for discovery and `get-deployment-events` for paginated
30
30
  audit evidence.
31
31
 
32
+ For direct model access, declare `service_exposure.type=NodePort` in the same
33
+ validated DeploymentSpec. After the revision is `READY`, read the observed
34
+ `nodeport` endpoint instead of constructing a Service name. Given an observed
35
+ base URL such as `http://<node-ip>:<node-port>`:
36
+
37
+ ```bash
38
+ curl http://<node-ip>:<node-port>/v1/model
39
+ curl http://<node-ip>:<node-port>/openapi.json
40
+ ```
41
+
42
+ Open `http://<node-ip>:<node-port>/docs` for that model's Swagger UI or
43
+ `http://<node-ip>:<node-port>/redoc` for ReDoc. The schemas describe the exact
44
+ deployed model. NodePort network reachability remains an environment concern;
45
+ do not report it as reachable unless `advertised_host` was reviewed and the
46
+ client can connect.
47
+
32
48
  ## Promotion And Approval
33
49
 
34
50
  ```bash
@@ -87,10 +103,18 @@ the deployment horizon but returns its first day:
87
103
  "input_mode": "feature_lookup",
88
104
  "cutoff_time": "2026-09-14T00:00:00+08:00",
89
105
  "entity": {},
90
- "output_window": {"start_offset": "0min", "end_offset": "1d"}
106
+ "output_window": {
107
+ "start_offset": "0min",
108
+ "end_offset": "1d",
109
+ "boundary": "[start,end)"
110
+ }
91
111
  }
92
112
  ```
93
113
 
114
+ For the storage-power deployment that predicts eight days but returns only
115
+ next-day 00:15 through day-eight 24:00, use the deployment default or override
116
+ with `{"start_offset":"1d","end_offset":"8d","boundary":"(start,end]"}`.
117
+
94
118
  Do not send `future_covariates` in `feature_lookup` mode. Serving derives the
95
119
  declared known-future columns and full model prediction length from the
96
120
  ModelArtifact, then the platform retrieves visible future Feature revisions.
@@ -14,6 +14,13 @@ Interpret conditions before considering a reconcile:
14
14
  readiness through the platform/cluster diagnostic boundary.
15
15
  - `ArtifactsVerified=false`: the Serving `/model` identity does not match the
16
16
  revision, or the endpoint is unavailable.
17
+ - A NodePort endpoint with `url=null` is not a failed deployment. Kubernetes
18
+ assigned or will assign the port, but the DeploymentSpec did not declare a
19
+ reviewed `advertised_host`; use the returned `node_port` with a reachable
20
+ cluster node address.
21
+ - `/docs` or `/openapi.json` showing the wrong artifact identity indicates that
22
+ traffic is reaching a different Serving revision. Compare the document's
23
+ top-level `x-itsmp-model.artifact_id` with the observed DeploymentRevision.
17
24
  - `SmokePredictionPassed=false`: preserve the frozen package smoke request and
18
25
  error. Do not replace it with a current-time request to force success.
19
26
  - `request horizon cannot override deployment inference_policy` or
@@ -35,6 +42,9 @@ Interpret conditions before considering a reconcile:
35
42
  - An unexpected output point count usually indicates frequency/target-time
36
43
  drift or an incomplete runtime trajectory. Inspect `output_window.boundary`,
37
44
  UTC `start_time`/`end_time`, `point_count`, and the model sampling interval.
45
+ - If a right-closed deployment unexpectedly returns next-day 00:00 and omits
46
+ day-eight 24:00, check whether a request-level `output_window` omitted
47
+ `boundary`; omission intentionally falls back to `[start,end)`.
38
48
  - `SUPERSEDED`: operate on the active deployment leaf.
39
49
  - `SUSPENDED`: resume only with explicit authorization and a reason.
40
50
  - `UNDEPLOYED`: create a governed deployment or rollback as supported; resume
@@ -24,6 +24,14 @@ do not guess registries or pass deployment secrets. A mismatch needs the approve
24
24
  runtime contract, not repeated package versions. Unknown request keys return 422; do not add `runtime`, `image`, or `resources`
25
25
  fields. Inspect the returned resolved package.
26
26
 
27
+ Chronos-2 LoRA packages also require exactly one platform-managed
28
+ `chronos2-checkpoint` runtime artifact for the selected trainer/device binding.
29
+ It must set `DATA_PLATFORM_CHRONOS2_MODEL_PATH`; otherwise
30
+ `validate-model-package` fails before a Kubernetes Job is created. Cache-hit
31
+ messages for `adapter_model.safetensors` or `model.chronos2` do not prove that
32
+ the base checkpoint is present. Full fine-tuned Chronos-2 artifacts contain
33
+ their complete weights and do not require this external checkpoint.
34
+
27
35
  `input_modes` must be unique, include `inline`, and may additionally include
28
36
  `feature_lookup` or `tabular_forecast` only when supported by the selected
29
37
  runtime. `feature_lookup` still requires artifact lineage