@zhuoyuezs/ml-platform 0.2.8 → 0.2.10

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.
Files changed (36) hide show
  1. package/CI-ARTIFACT.md +2 -2
  2. package/checksums.json +74 -54
  3. package/package.json +1 -1
  4. package/release.json +19 -19
  5. package/runtime/business-client/README.md +64 -4
  6. package/runtime/business-client/package-lock.json +2 -2
  7. package/runtime/business-client/package.json +1 -1
  8. package/runtime/business-client/src/catalog.js +25 -6
  9. package/runtime/business-client/src/cli.js +177 -7
  10. package/runtime/business-client/src/http.js +192 -32
  11. package/skills/data-source-exploration/SKILL.md +12 -1
  12. package/skills/data-source-exploration/agents/openai.yaml +2 -2
  13. package/skills/data-source-exploration/references/data-platform.md +83 -0
  14. package/skills/feature-management/SKILL.md +29 -11
  15. package/skills/feature-management/agents/openai.yaml +2 -2
  16. package/skills/feature-management/references/commands.md +64 -7
  17. package/skills/feature-management/references/contracts.md +124 -6
  18. package/skills/feature-management/references/data-platform-mapping.md +104 -0
  19. package/skills/feature-management/references/operator-authoring.md +116 -8
  20. package/skills/feature-management/references/platform-capability-guide.md +6 -0
  21. package/skills/feature-management/references/supervised-datasets.md +13 -0
  22. package/skills/model-deployment-management/SKILL.md +7 -0
  23. package/skills/model-deployment-management/references/contracts.md +6 -0
  24. package/skills/model-deployment-management/references/operations.md +28 -1
  25. package/skills/model-deployment-management/references/troubleshooting.md +8 -0
  26. package/skills/model-lifecycle-management/SKILL.md +27 -5
  27. package/skills/model-lifecycle-management/agents/openai.yaml +2 -2
  28. package/skills/model-lifecycle-management/references/ablation.md +111 -0
  29. package/skills/model-lifecycle-management/references/discovery.md +18 -3
  30. package/skills/model-lifecycle-management/references/evaluation.md +188 -1
  31. package/skills/model-lifecycle-management/references/experiment-runs.md +59 -0
  32. package/skills/model-lifecycle-management/references/model-comparison.md +11 -9
  33. package/skills/model-lifecycle-management/references/packaging.md +46 -0
  34. package/skills/model-lifecycle-management/references/training-contracts.md +172 -1
  35. package/skills/model-lifecycle-management/references/training.md +60 -0
  36. package/skills/prediction-report-management/SKILL.md +43 -8
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: data-source-exploration
3
- description: Discover platform-configured PostgreSQL, MySQL, SQL Server, or InfluxDB objects and run bounded structured reads for local data and feature exploration. Use when an algorithm engineer wants to inspect visible databases, schemas, tables, measurements, fields, or limited rows before defining governed feature assets. Do not use for free-form SQL, bulk export, asset publication, dataset builds, or model training.
3
+ description: Discover platform-configured database objects or published external data-platform Mappings, and run bounded structured or Mapping snapshot reads for local data and feature exploration. Use when an algorithm engineer wants to inspect visible sources, Mapping outputs, time coverage or limited rows before defining governed feature assets. Do not use for free-form SQL, bulk export, asset publication, dataset builds, or model training.
4
4
  ---
5
5
 
6
6
  # Data Source Exploration
@@ -10,6 +10,15 @@ never request credentials in chat. The platform exposes managed connections and
10
10
  objects. Connection credentials are write-only control-plane input and are never returned by the
11
11
  platform.
12
12
 
13
+ ## External Data Platform
14
+
15
+ For external published mapping discovery and bounded query/snapshot reads, follow
16
+ [the external data platform reference](references/data-platform.md). This includes the complete
17
+ authorized query-candidate catalog, fixed Mapping revisions, asynchronous query runs and paged
18
+ snapshots. Keep that catalog separate from the direct database connections below; it has its own
19
+ IDs, permissions and query semantics. Use `$feature-management` to bind confirmed outputs to
20
+ Parameters and build features; discovery alone does not publish assets.
21
+
13
22
  ## Manage Connections
14
23
 
15
24
  Datasource connections are business-owned platform resources, not ConfigMap entries. An operator
@@ -48,6 +57,8 @@ Before discovery, verify the installed client and server target:
48
57
 
49
58
  ```bash
50
59
  command -v ml-platform
60
+ ml-platform version
61
+ ml-platform show-config
51
62
  ml-platform health
52
63
  ```
53
64
 
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "数据源与特征探索"
3
- short_description: "逐层发现已连接数据源并执行受限数据查询"
4
- default_prompt: "使用 $data-source-exploration 从平台已连接数据源中发现可见库表字段,执行有限查询,并整理数据与特征假设。"
3
+ short_description: "发现已连接数据源或外部 Mapping,并执行有界查询"
4
+ default_prompt: "使用 $data-source-exploration 发现平台可见库表字段或外部数据平台已发布 Mapping,执行有界查询和快照读取,并整理覆盖率、数据与特征假设。"
@@ -0,0 +1,83 @@
1
+ # Read Published Mappings From The External Data Platform
2
+
3
+ Use this path when the user requests data owned by the external data platform. The modeling
4
+ server holds its login configuration; agents never need its credentials or database DSNs.
5
+ Discover available options with the installed `ml-platform --help`; an older CLI or unconfigured
6
+ server does not imply permission to fall back to a physical database.
7
+
8
+ 1. Run `ml-platform data-platform-status` and `ml-platform list-data-platform-connections`.
9
+ 2. Inspect connection metadata and objects with `get-data-platform-connection ID` and
10
+ `list-data-platform-objects ID`. These are catalogs, not a physical-query interface.
11
+ 3. Prefer `list-data-platform-query-candidates` for model data discovery. It requires the
12
+ integration account's upstream `query:run` capability and returns its complete authorized,
13
+ published, enabled and ready catalog as `candidates`, `complete: true`, and `total`, without
14
+ reading source data. Inspect business names, domains and output labels, keys, units, roles and
15
+ types; filter this complete set locally. It accepts no paging or filter flags. An empty complete
16
+ set is an honest empty result; domains are presentation metadata, not permission grants.
17
+ For an older upstream that lacks this endpoint, use
18
+ `list-data-platform-mappings --page 1 --page-size 50 [--scope-code CODE]`, follow every page
19
+ using `total`, and inspect `lifecycle.run_readiness`. This catalog alone does not prove query
20
+ authorization. Do not fall back on a permission error or to bypass blocked mappings.
21
+ 4. Inspect `get-data-platform-mapping-revision MAPPING_ID REVISION_ID`. Confirm output keys,
22
+ units and time semantics. Preserve `active_revision.mapping_revision_id` for reproducibility.
23
+ Execution rechecks authorization and revision state; discovery does not reserve access.
24
+ 5. Write a bounded query JSON in the user's workspace, outside the platform repository:
25
+
26
+ ```json
27
+ {
28
+ "mapping": {"mapping_revision_id": "33333333-3333-4333-8333-333333333333"},
29
+ "window_start": "2026-10-01T00:00:00+08:00",
30
+ "window_end": "2026-10-01T01:00:00+08:00",
31
+ "max_rows": 100,
32
+ "execution": "async"
33
+ }
34
+ ```
35
+
36
+ 6. Submit with `ml-platform query-data-platform query.json`. For async submission, poll
37
+ `get-data-platform-query RUN_ID` until terminal. Read `result.snapshot_id` on success;
38
+ a successful HTTP poll alone does not establish successful execution.
39
+ 7. Read `get-data-platform-snapshot SNAPSHOT_ID --offset 0 --limit 100`. Advance offset by the
40
+ returned row count until it reaches `captured_rows`. An empty page before that count is an
41
+ incomplete read, not successful completion. Record run ID,
42
+ snapshot ID, mapping revision, columns and their order,
43
+ window, warnings and `completeness`. Partial or truncated results cannot establish complete
44
+ coverage. An empty result is not evidence that the source has no data outside this window.
45
+
46
+ Do not resubmit uncertain POSTs automatically. Keep the returned run ID; after a timeout or
47
+ connection failure, inspect actual task state in the data platform before another submission.
48
+ For `SOURCE_SCHEMA_DRIFT`, ask the data owner to repair/revalidate the source mapping; never
49
+ bypass that gate with a physical ReadSpec or SQL.
50
+
51
+ For training or realtime inference, hand off confirmed outputs to `$feature-management` and its
52
+ Mapping binding workflow. `bind-data-platform-parameters SPEC_JSON` creates/reuses ordinary immutable
53
+ Parameters; exploration alone does not authorize that write. The adapter accepts single published
54
+ structured, unaggregated series, or SQL ReadSpecs, with no inputs/expressions composition. SQL remains
55
+ executed upstream. Mapping output contracts, coverage and causal semantics still require validation;
56
+ SQL-derived values do not prove historical visibility. Duplicate event times and partial snapshots fail.
57
+
58
+ Use the facade query commands for discovery and inspection. Use the Parameter adapter for dataset
59
+ builds and realtime reads; do not copy snapshot rows into catalogs or commit credentials.
60
+
61
+ ## Coverage, Visibility And Failure Evidence
62
+
63
+ Start with a short business-relevant window, then expand within the approved query scope when
64
+ checking history coverage. The query facade accepts `max_rows` up to 10000 and snapshot pages up
65
+ to 1000 rows. If a result is partial or truncated, split the time window rather than using the
66
+ captured subset as a complete dataset. Keep the same fixed revision and inspect every window's
67
+ warnings: source SQL may impose its own historical limit even when the snapshot is marked complete.
68
+ Check the requested time grid, first/last timestamps, missingness, duplicates and values; a small
69
+ successful sample does not prove the larger training window is usable.
70
+
71
+ Query/read timestamps describe when data was retrieved. They do not establish when each source row
72
+ first became available. Record whether the Mapping actually publishes a trustworthy availability
73
+ field, and hand this evidence to `$feature-management`; do not invent it from event time or query
74
+ completion time. Ordinary snapshot exploration can proceed without such a field, while strict
75
+ historical `as_of` correctness remains unproven.
76
+
77
+ Distinguish release/configuration failures from empty data. A missing CLI command requires checking
78
+ the installed release; a missing route requires checking the deployed API. A `503` with
79
+ `DATA_PLATFORM_NOT_CONFIGURED` means the server lacks integration configuration. Permission or
80
+ schema-drift failures need resolution in the upstream account/Mapping. Timeouts and disconnected
81
+ POSTs leave submission uncertain; inspect run state before retrying. API health alone does not prove
82
+ upstream authentication or dataset-build Worker support. Report the failed checkpoint and target
83
+ without exposing passwords, cookies, CSRF tokens or Secret contents.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: feature-management
3
- description: Manage projects, versioned business feature assets and their lifecycle, dataset rowsets and endpoint eligibility, and causal realtime row or sequence-context reads through the deployed ML Platform API using the ml-platform CLI installed with the same release. Use when a business user asks an agent to manage an empty Project, define or change Parameter source contracts, author/package/register an Operator wheel, define single-column Features, order a FeatureSet, create a DatasetManifest or catalog, inspect references, soft-delete or restore a Parameter/Feature/FeatureSet version, configure training/validation/test rowsets or abnormal-data endpoint exclusion, configure realtime freshness policy, run catalog dry-run/apply, build a dataset, fetch inference data, or inspect an artifact without downloading the platform source repository. Do not use for model training, Operator/Dataset deletion, image builds, or Kubernetes deployment.
3
+ description: Manage projects, versioned business feature assets and their lifecycle, dataset rowsets and endpoint eligibility, and causal realtime row or sequence-context reads through the deployed ML Platform API using the ml-platform CLI installed with the same release. Use when a business user asks an agent to manage an empty Project, define or change Parameter source contracts, bind published external data-platform Mapping outputs to Parameters, author/package/register an Operator wheel, define single-column Features, order a FeatureSet, create a DatasetManifest or catalog, inspect references, soft-delete or restore a Parameter/Feature/FeatureSet version, configure training/validation/test rowsets or abnormal-data endpoint exclusion, configure realtime freshness policy, run catalog dry-run/apply, build a dataset, fetch inference data, or inspect an artifact without downloading the platform source repository. Do not use for model training, Operator/Dataset deletion, image builds, or Kubernetes deployment.
4
4
  ---
5
5
 
6
6
  # Feature Management
@@ -52,7 +52,8 @@ Keep these evidence rules active in every workflow:
52
52
  4. Read [references/operator-authoring.md](references/operator-authoring.md) whenever creating or changing Operator code or a wheel.
53
53
  5. Read [references/commands.md](references/commands.md) immediately before a platform CLI action: discovery, validation, publication, build, realtime fetch, or artifact download. A local-only draft that is forbidden to call the CLI does not need this reference.
54
54
  6. Use [assets/catalog-template](assets/catalog-template) as a copyable starting point for a new end-to-end catalog. Rename every `example_*` identifier and update every referenced path before validation.
55
- 7. Read [references/platform-capability-guide.md](references/platform-capability-guide.md) only when selecting an asset type or explaining a platform capability. Do not load it merely to write a confirmed local draft; it is never evidence for unresolved business semantics.
55
+ 7. Read [references/data-platform-mapping.md](references/data-platform-mapping.md) when binding published external data-platform Mapping outputs to Parameters.
56
+ 8. Read [references/platform-capability-guide.md](references/platform-capability-guide.md) only when selecting an asset type or explaining a platform capability. Do not load it merely to write a confirmed local draft; it is never evidence for unresolved business semantics.
56
57
 
57
58
  ## Initialize The Client
58
59
 
@@ -82,8 +83,9 @@ Use the global `--profile server` form shown above, before the business
82
83
  command. Do not append `--profile` after a business command. Before discovery,
83
84
  check the installed release with `ml-platform --help` and the relevant
84
85
  subcommand's `--help`; CLI releases may differ in supported flags. In the
85
- deployed 0.6.x CLI, registry `list-*` commands emit JSON by default and do not
86
- accept a `--json` flag.
86
+ current CLI release line (`@zhuoyuezs/ml-platform` 0.8.x; confirm with
87
+ `ml-platform version`), registry `list-*` commands emit JSON by default and
88
+ reject an unknown `--json` flag.
87
89
 
88
90
  If the installed release rejects the global `--profile server` form shown above,
89
91
  record the CLI syntax error and inspect `show-config`/subcommand help before
@@ -109,14 +111,18 @@ Confirm:
109
111
  - the target project (namespace) for the assets; use the built-in `default` only when the user has no dedicated project. After the target is confirmed, write its explicit `project` field in every Parameter, Operator, Feature, FeatureSet and DatasetManifest draft; never rely on the schema default. Reads and filters use the `--project` command option;
110
112
  - business meaning, stable asset names, owner, and intended consumers;
111
113
  - Parameter source adapter (`postgresql_direct`, `mysql_direct`,
112
- `sqlserver_direct`, or `influxdb_direct`) and credential-free source mapping;
114
+ `sqlserver_direct`, `influxdb_direct`, or `data_platform_mapping`) and credential-free
115
+ source mapping; for external Mappings, confirm the published revision and output keys;
113
116
  - feature formula, exact Parameter dependencies, windows, inclusion rules, rounding, null behavior, and output dtype;
114
117
  - whether an approved Operator already implements the formula;
115
118
  - FeatureSet column order;
116
119
  - dataset mode, read policy, time range, grid, prediction horizon/cutoff contract, and explicit Parameter outputs;
117
120
  - named training/validation/test rowsets, abnormal windows, endpoint-policy scope,
118
121
  and the model context lookback used to decide endpoint eligibility;
119
- - realtime freshness and missing-input policy when serving inference data;
122
+ - realtime freshness and missing-input policy when serving inference data,
123
+ chosen per model and per Parameter from the data owner's answers on
124
+ timestamp meaning, arrival schedule and ingestion-time columns (see the
125
+ realtime policy questions in [references/contracts.md](references/contracts.md));
120
126
  - target profile/API and whether the user authorizes publish and/or build actions.
121
127
 
122
128
  Separate preparation from mutation. Creating files and running local tests or `apply --dry-run` does not authorize publishing a wheel, changing the Registry, or submitting a build Job.
@@ -260,7 +266,13 @@ unit, time/availability semantics and missing policy in the semantic review.
260
266
  Never infer a source table, column, measurement, tag, unit or timezone from a
261
267
  Parameter name.
262
268
 
263
- Create one stable, versioned source contract for each independently readable value. Keep credentials out of JSON. Use only supported direct adapters (`postgresql_direct`, `mysql_direct`, `sqlserver_direct`, and `influxdb_direct`) and explicit source identity. For PostgreSQL, keep `source.adapter=postgresql_direct` and put the configured alias in `source.connection_id` (for example `postgresql_bf_monitoring`); never put the connection alias in `source.adapter`. The server supplies database DSNs from managed Secrets; never add them to CLI arguments or Catalog JSON. A missing `connection_id` on a historical PostgreSQL Parameter uses the compatibility default `postgresql`. Put source data validity in `quality_rules`; put dataset-specific transformations in preprocess Operators.
269
+ Create one stable, versioned source contract for each independently readable value. Keep credentials out of JSON. Direct database sources use `postgresql_direct`, `mysql_direct`, `sqlserver_direct`, or `influxdb_direct` and explicit source identity. For PostgreSQL, keep `source.adapter=postgresql_direct` and put the configured alias in `source.connection_id` (for example `postgresql_bf_monitoring`); never put the connection alias in `source.adapter`. The server supplies database DSNs from managed Secrets; never add them to CLI arguments or Catalog JSON. A missing `connection_id` on a historical PostgreSQL Parameter uses the compatibility default `postgresql`. Put source data validity in `quality_rules`; put dataset-specific transformations in preprocess Operators.
270
+
271
+ For an approved external Mapping, use `bind-data-platform-parameters` to create or reuse
272
+ `data_platform_mapping` Parameters and retain the returned Feature input references. Follow
273
+ [the Mapping reference](references/data-platform-mapping.md) for revision pinning, visibility,
274
+ read budgets and Worker acceptance. The Mapping owns its database connection and SQL; do not
275
+ copy them into the Parameter or add a second public binding resource.
264
276
 
265
277
  When historical and live systems expose the same value, keep one Parameter and add an optional
266
278
  `online_source`. Batch/as-of reads always use `source`; realtime causal reads use `online_source`
@@ -380,9 +392,15 @@ for the cutoff formula, half-open overlap boundaries, scope behavior, and
380
392
 
381
393
  For realtime inference, declare `realtime_fetch` only when its effective policy
382
394
  must be part of the contract; leaving it unset preserves existing manifest
383
- hashes. Keep `allow_missing=false` unless the user explicitly accepts missing
384
- required inputs. Read [references/contracts.md](references/contracts.md) for the
385
- freshness, tail-edge, gap-fill, and rowset contracts.
395
+ hashes. The environment defaults are strict and suit short-horizon
396
+ forecasting; for a new model whose Features are served online, choose the
397
+ policy deliberately and declare every field it relies on. Keep
398
+ `allow_missing=false` unless the user explicitly accepts missing required
399
+ inputs. Read [references/contracts.md](references/contracts.md) for the
400
+ freshness, tail-edge, gap-fill, and rowset contracts and the policy method.
401
+ An Operator served online, especially one that aggregates a whole period,
402
+ must follow the Online Period Aggregates method in
403
+ [references/operator-authoring.md](references/operator-authoring.md).
386
404
 
387
405
  ## Validate Before Publishing
388
406
 
@@ -405,7 +423,7 @@ Stop on any error. Do not weaken schema validation, fabricate a missing dependen
405
423
 
406
424
  Publish only after the user explicitly approves Registry and wheel changes. Use catalog `apply` so publication follows Parameter -> Operator -> Feature -> FeatureSet -> Dataset order.
407
425
 
408
- After publication, resolve every new DatasetManifest and compare its exact Parameter, Operator, Feature, and FeatureSet versions with the pre-publication mapping. Stop if an affected old key or any unexpected version remains. Resolve the manifest before building. Submit a build only when requested. Before choosing partition controls, use the build command's read-only `--plan` capability described in [commands.md](references/commands.md), inspect its estimates and warnings, and prefer platform automatic sizing over a copied daily example. Explicit overrides need source/resource evidence; preserve the submitted Job's concrete plan when resuming. For the current partitioned materialization runtime, use `--max-parallelism 1` unless a separately verified platform capability says otherwise; do not retry or resubmit a failed Job until its error and already-completed partitions are understood. For server builds, wait for the terminal Job state and download the exact artifact by `dataset_id + manifest_hash`.
426
+ After publication, resolve every new DatasetManifest and compare its exact Parameter, Operator, Feature, and FeatureSet versions with the pre-publication mapping. Stop if an affected old key or any unexpected version remains. Resolve the manifest before building. Submit a build only when requested. Before choosing partition controls, use the build command's read-only `--plan` capability described in [commands.md](references/commands.md), inspect its estimates and warnings, and prefer platform automatic sizing over a copied daily example. Explicit overrides need source/resource evidence; preserve the submitted Job's concrete plan when resuming. For the current partitioned materialization runtime, use `--max-parallelism 1` unless a separately verified platform capability says otherwise. If any selected Operator needs the complete requested window (for example full-window interpolation or smoothing), build with `--partition-duration none --max-parallelism 1` and confirm an unpartitioned `--plan` first, because the CLI default is `auto`; do not retry or resubmit a failed Job until its error and already-completed partitions are understood. For server builds, wait for the terminal Job state and download the exact artifact by `dataset_id + manifest_hash`.
409
427
 
410
428
  Do not delete versioned Registry assets, cancel Jobs, rebuild images, modify Kubernetes, or change service configuration as part of this workflow unless the user separately and explicitly requests that action. An empty Project may be soft-deleted only on an explicit request; rely on the server to reject deletion when resources still exist.
411
429
 
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "特征与实时取数管理"
3
- short_description: "管理版本化 Parameter、Operator、Feature、数据集与实时推理取数"
4
- default_prompt: "Use $feature-management to manage versioned feature assets, build datasets, or fetch one causal realtime inference row through the platform API."
3
+ short_description: "绑定外部 Mapping,管理特征、数据集与实时推理取数"
4
+ default_prompt: "Use $feature-management to bind published external Mapping outputs to Parameters, manage versioned feature assets, build datasets, or fetch causal realtime inference data through the platform API."
@@ -51,8 +51,9 @@ ml-platform --profile server list-datasets -q <stable-dataset-id>
51
51
  ```
52
52
 
53
53
  Run each command separately. Check `ml-platform --help` and the specific
54
- subcommand help before adding flags. In the deployed 0.6.x CLI, `list-*`
55
- commands print JSON by default and do not accept a `--json` flag.
54
+ subcommand help before adding flags. In the current CLI release line
55
+ (`@zhuoyuezs/ml-platform` 0.8.x; confirm with `ml-platform version`), `list-*`
56
+ commands print JSON by default and reject an unknown `--json` flag.
56
57
  If a deployed release rejects the global `--profile server` prefix, treat that
57
58
  as CLI compatibility drift: record the syntax error, inspect `show-config` and
58
59
  the subcommand help, then retry the same read-only command without the rejected
@@ -107,8 +108,8 @@ empty project. Project commands are server-only and do not modify local storage.
107
108
  - `apply --project <project>` scopes the comparison snapshot the catalog is
108
109
  validated against (omit to compare against `default`);
109
110
  - `list-* --project <project>` filters discovery to that project;
110
- - `get-dataset-artifact` / `download-dataset-artifact` take the project as their
111
- first positional argument (defaults to `default`).
111
+ - `get-dataset-artifact` / `download-dataset-artifact` take `--project <project>`
112
+ (defaults to `default`).
112
113
 
113
114
  Before choosing names, discover within the target project: identical names in a
114
115
  different project are unrelated and must not be reused across projects to mean the
@@ -247,6 +248,25 @@ sizing is not a resource guarantee. Final merge memory is not bounded by a
247
248
  partition's estimated rows. A long prediction horizon is not itself a reason to
248
249
  use daily partitions: inspect the reported source read amplification.
249
250
 
251
+ Partitioned execution gives each partition only its declared
252
+ `history_requirements` lookback and label overlap. An Operator whose result for
253
+ one row depends on the complete requested window (for example full-window
254
+ interpolation, smoothing, normalization or ranking) is not partition-invariant,
255
+ and no Operator field tells the planner so. Build such a manifest with
256
+ `--partition-duration none --max-parallelism 1`, because both build commands
257
+ default to `auto`. First run the same command with `--plan` and confirm
258
+ `execution_spec.partition_duration` is `null`, `estimated_partition_count` is
259
+ `1`, and the reasons report unpartitioned execution; then submit with the same
260
+ flags. Prefer reformulating the Operator as a causal, bounded-lookback
261
+ calculation when the business rule allows it.
262
+
263
+ ```bash
264
+ ml-platform --profile server \
265
+ build-registered-dataset <dataset_id> <dataset_version> \
266
+ --project <project> \
267
+ --partition-duration none --max-parallelism 1 --plan
268
+ ```
269
+
250
270
  `--partition-duration` is an execution control and does not change the
251
271
  DatasetManifest hash. The current implementation is sequential, so keep
252
272
  `--max-parallelism 1`. Completed partitions are checkpointed and resumed by
@@ -255,8 +275,12 @@ resolved partition duration. Changing it requires a new execution, rather than
255
275
  reusing old checkpoint boundaries. Changing partition size does not authorize
256
276
  cancelling or resubmitting an already-running Job.
257
277
 
258
- Record the returned `job_id`, `dataset_id`, and resolved `manifest_hash`; for a registered Dataset
259
- also retain `registered_manifest_hash` for FeatureRetrievalSpec binding. If a separate wait is needed:
278
+ Record the returned `job_id`, `dataset_id`, and the artifact manifest hash; for a registered Dataset
279
+ also retain `registered_manifest_hash` for FeatureRetrievalSpec binding. A succeeded
280
+ `--wait` or `wait-job` result carries `artifact.manifest_hash`, the DatasetArtifact key used by
281
+ `get-dataset-artifact`, `download-dataset-artifact` and training/evaluation dataset bindings. The
282
+ Job's top-level `manifest_hash` identifies the submitted manifest; it is not an artifact key and
283
+ returns `artifact_not_found` there. If a separate wait is needed:
260
284
 
261
285
  ```bash
262
286
  ml-platform --profile server wait-job <job_id>
@@ -294,6 +318,23 @@ write parquet, or publish a DatasetArtifact. Treat HTTP `503` as retryable sourc
294
318
  freshness/missing-data failure and HTTP `400` as a contract error that requires a
295
319
  manifest or request change.
296
320
 
321
+ Before choosing `realtime_fetch` lag budgets or a schedule time, observe how far
322
+ each Parameter's source has arrived:
323
+
324
+ ```bash
325
+ ml-platform --profile server get-parameter-freshness <name> <version> \
326
+ --project <project> [--lookback 7d] [--end 2026-10-28T00:30:00+08:00] [--online]
327
+ ```
328
+
329
+ It reads `[end - lookback, end]` (end inclusive, `lookback` at most `31d`) through
330
+ the Parameter's source adapter without cache, build, or artifact, and returns
331
+ `latest_event_time`, `lag_hours` (the value a realtime read compares with its lag
332
+ budget at that cutoff), `latest_value_event_time`, `missing_trailing_points`,
333
+ `available_at_watermark`/`ingested_at_watermark` when the Parameter declares
334
+ availability, and `source_field_checks`. `--online` reads `online_source` when
335
+ declared. Run it at the intended schedule time on several days; one reading does
336
+ not establish a publication pattern.
337
+
297
338
  For a deployment-bound row or full sequence context, prepare one JSON object
298
339
  containing `feature_retrieval`, `cutoff_time`, and `entity_keys`, then run:
299
340
 
@@ -359,7 +400,9 @@ ml-platform --profile server \
359
400
  ```
360
401
 
361
402
  `--project` defaults to `default`; pass the owning project when the dataset lives
362
- elsewhere, or the lookup returns `artifact_not_found`.
403
+ elsewhere, or the lookup returns `artifact_not_found`. `<manifest_hash>` is the
404
+ artifact manifest hash (`list-dataset-artifacts`, or `artifact.manifest_hash`
405
+ from a succeeded build wait), not the registered manifest hash.
363
406
 
364
407
  The download command writes progress to stderr after response headers arrive.
365
408
  Interpret a timeout with no progress line as a request/header or first-byte
@@ -393,3 +436,17 @@ Use a structured Parquet reader for schema, row count, column order, and missing
393
436
  - Do not claim a successful publication from `--dry-run` output.
394
437
  - Do not claim Chronon compile/backfill from a successful first-phase Operator build.
395
438
  - Do not use `build-dataset` to serve a single realtime inference cutoff.
439
+
440
+ ## Bind Published Data Platform Outputs
441
+
442
+ When source semantics and publication are confirmed, use the existing external Mapping directly.
443
+ This creates ordinary immutable Parameters; it does not publish Mapping assets or execute a dataset
444
+ build:
445
+
446
+ ```bash
447
+ ml-platform bind-data-platform-parameters --help
448
+ ml-platform bind-data-platform-parameters binding.json
449
+ ```
450
+
451
+ See [data-platform-mapping.md](data-platform-mapping.md) for the request, returned Feature input
452
+ references, visibility requirements, Worker requirements and acceptance checks.
@@ -139,6 +139,17 @@ supported field.
139
139
  当前严格 `as_of` 只接受 `exact` 或有合同支撑的 `upper_bound`;修改这些语义需要发布
140
140
  新的 Parameter 业务版本。
141
141
 
142
+ `time_semantics.ingested_at_field` 和 `event_time_field` 只是标签:读取时不会查询它们,
143
+ 除非 `availability.field` 指向同一列。没有 `availability` 时,读取既没有
144
+ `ingested_at`/`available_at` 证据,严格可见性读取(`as_of` 回放、
145
+ `availability_boundary=cutoff_time`)也会拒绝该 Parameter。只把源表真实存在的入库列写进
146
+ `availability`;源表没有入库时间时,保持 `availability` 为空或使用经数据 owner 确认的
147
+ `fixed_delay`,不要声明不存在的列。发布新 Parameter 时,若 `source.connection_id` 是平台
148
+ 托管连接,平台会检查实际查询的列(`time_column`、`value_column`、metric/unit 列、
149
+ `filters` 键、`availability.field`、`availability.revision_id_field`):缺列直接拒绝
150
+ (`source_fields_missing`),不存在的 `ingested_at_field`/`event_time_field` 只作为警告
151
+ 返回在 `source_field_checks` 中。已发布版本可用 `get-parameter-freshness` 查看同一检查。
152
+
142
153
  未来预报、排程、日历等 known-future 数据允许 `available_at < event_time`。这不是时钟错误:
143
154
  `event_time` 是未来目标时刻,`available_at` 是该修订何时已可读取。模型
144
155
  `feature_lookup` 会读取 cutoff 后的未来事件窗口,但仍严格过滤
@@ -380,8 +391,14 @@ Current schema rules:
380
391
  - Use `parameters` only to request explicit Parameter output columns.
381
392
  - Declare one dataset-wide `prediction` contract for forecast Features. `horizon`
382
393
  accepts non-negative whole-minute durations such as `0min`, `10min`, or `2h`.
383
- The platform always derives `cutoff_times = target_times - horizon` and records
384
- that derivation in resolved lineage; it is not a user-configurable policy.
394
+ For Operator inputs, each materialized row's `event_time` is its causal
395
+ feature cutoff (`context.cutoff_times` equals `context.target_times`), and the
396
+ horizon sets `label_time = event_time + horizon` without moving those reads.
397
+ `endpoint_policy` eligibility is separate and uses the `cutoff = t - h` rule
398
+ documented in its section. The platform records this in resolved
399
+ lineage (`prediction_time_semantics: event_time_is_causal_cutoff`,
400
+ `label_time_derivation: prediction_time_plus_horizon`); it is not a
401
+ user-configurable policy.
385
402
 
386
403
  ### Optional sections
387
404
 
@@ -442,11 +459,14 @@ attempts, rows, and elapsed time land in
442
459
  ```json
443
460
  "realtime_fetch": {
444
461
  "max_workers": 4,
462
+ "deadline_seconds": 30.0,
463
+ "chunk_days": null,
445
464
  "min_lookback": "1h",
446
465
  "validate_freshness": true,
447
466
  "max_source_lag_hours": 3.0,
448
467
  "max_source_lag_hours_by_parameter": {},
449
468
  "allow_missing": false,
469
+ "allow_missing_by_parameter": {},
450
470
  "allow_tail_edge_missing": true,
451
471
  "max_tail_edge_missing": 1,
452
472
  "tail_edge_missing_max_age_minutes": 65.0,
@@ -467,11 +487,109 @@ offline `source` instead.
467
487
 
468
488
  Keep the default strict: `allow_missing=false`. Tail-edge and bounded internal
469
489
  gap-fill tolerance may return a row, but the response must mark
470
- `freshness.degraded=true` and include validation evidence. A freshness or
490
+ `freshness.degraded=true` and include validation evidence.
491
+
492
+ Per-Parameter keys in `max_source_lag_hours_by_parameter` and
493
+ `allow_missing_by_parameter` are full Parameter keys (`project/name:version`);
494
+ other spellings are ignored with a validation warning. `allow_missing_by_parameter`
495
+ overrides `allow_missing` for one Parameter in either direction and is omitted
496
+ from the manifest while empty, so adding the field does not change existing
497
+ hashes. A tolerated Parameter still marks the read degraded, and a deployment
498
+ with `freshness_policy=strict` rejects degraded reads.
499
+
500
+ The tail-edge and internal-gap-fill allowances are absolute lag ceilings measured
501
+ from the cutoff, not additions to the lag budget: a source past its budget is
502
+ tolerated when its lag is at most `max(tail_edge_missing_max_age_minutes,
503
+ max_tail_edge_missing * expected_frequency)` or at most
504
+ `internal_gap_fill_max_age_hours`. With the defaults (5h gap-fill ceiling) a
505
+ Parameter budget below 5h therefore degrades rather than fails; set
506
+ `allow_internal_gap_fill=false` (per manifest) when a budget must be hard.
507
+ Neither allowance changes values: realtime rows use the same alignment and
508
+ Operator code as a batch build, so these settings cannot create
509
+ training/serving skew. Choose budgets from observed arrival with
510
+ `get-parameter-freshness`. A freshness or
471
511
  missing-data condition that may recover returns HTTP `503`; an invalid contract
472
512
  returns HTTP `400`. Declaring `realtime_fetch` changes the manifest hash; leaving
473
513
  it unset preserves older contract hashes and uses environment fallbacks.
474
514
 
515
+ `deadline_seconds` bounds the whole read. `chunk_days` pages long source reads
516
+ and falls back to `source_read.chunk_days` when unset.
517
+
518
+ #### Choosing a realtime fetch policy
519
+
520
+ The values above are also the environment defaults (`DATA_PLATFORM_REALTIME_*`).
521
+ They are strict and suit short-horizon forecasting on minute-level data. They
522
+ are a process fallback, not a decision for a particular model. Choose the
523
+ policy for each model from its data and its use, and per Parameter where
524
+ sources differ.
525
+
526
+ How the checks work:
527
+
528
+ - For each Parameter, the platform takes the newest source row at or before
529
+ the cutoff (the watermark) and computes `lag = cutoff - watermark`.
530
+ - The read is normal when the lag is within `max_source_lag_hours`, or within
531
+ the Parameter's entry in `max_source_lag_hours_by_parameter` (keyed
532
+ `project/name:version`).
533
+ - A larger lag is still accepted, marked `freshness.degraded=true`, when
534
+ `allow_tail_edge_missing` is on and the lag is within the larger of
535
+ `tail_edge_missing_max_age_minutes` and `max_tail_edge_missing` times the
536
+ Parameter's `expected_frequency`, or when `allow_internal_gap_fill` is on and
537
+ the lag is within `internal_gap_fill_max_age_hours`. With the defaults, a
538
+ source up to 5 hours behind is accepted as degraded. Set
539
+ `allow_internal_gap_fill: false` when the lag budget must be a hard limit.
540
+ - A Parameter with no rows in its window fails unless `allow_missing` is true.
541
+ `allow_missing` applies to every Parameter and also accepts any stale
542
+ source; there is no per-Parameter switch. Do not turn it on to tolerate one
543
+ optional input.
544
+ - None of these settings changes values. Holes inside the lookback reach the
545
+ Operator unchanged, so the Operator's frozen missing-data rule
546
+ ([operator-authoring.md](operator-authoring.md), Online Period Aggregates)
547
+ is what keeps batch builds and realtime reads equal.
548
+
549
+ Decide with the user:
550
+
551
+ - Whether a late or missing source should fail visibly (HTTP `503`, rerun after
552
+ the data recovers) or return a degraded row. A long aggregate (for example a
553
+ daily mean) may barely change when one point is late, but a period that is
554
+ missing its last hours because a source stalled usually should fail.
555
+ - When the read runs relative to each source's arrival. The lag budget must
556
+ cover the latest normal arrival: schedule the read after a batch-loaded
557
+ source is complete, or give that Parameter a larger budget.
558
+ - Whether the read finishes within `deadline_seconds`. A long lookback over
559
+ several Parameters may need more than 30 seconds; measure it with
560
+ `fetch-inference-data` at a historical cutoff before choosing.
561
+
562
+ Record the decision in the inference DatasetManifest. Declare every field the
563
+ model relies on, even when it equals the current default: resolution is per
564
+ field, and an omitted field takes the process environment value, which can
565
+ differ between deployments. Note the reason for each value in the catalog
566
+ review. Changing the policy needs a new inference manifest and package
567
+ version, but not retraining. In each response, `policy.resolved_from` shows
568
+ whether a field came from `manifest` or `environment`; check that nothing you
569
+ meant to declare came from `environment`.
570
+
571
+ The `fetch-inference-data` options `--max-source-lag-hours`,
572
+ `--no-validate-freshness` and `--allow-missing` replace the manifest's whole
573
+ `realtime_fetch` section for that request; fields you do not pass fall back to
574
+ the environment, not to the manifest. Use them for diagnosis only.
575
+
576
+ Ask the data owner, and do not guess:
577
+
578
+ 1. What each source timestamp means: interval start, interval end, or the
579
+ measurement instant, and in which timezone. This decides period boundaries
580
+ and the expected lag (an hourly record stamped at the hour start has a
581
+ watermark one hour before a midnight cutoff even when the day is complete).
582
+ 2. How data arrives: streaming or batch loads, when the previous period is
583
+ complete on a normal day, and how late it can be.
584
+ 3. Whether late corrections or backfills are written after first arrival;
585
+ these make a rerun at the same cutoff return a different row.
586
+ 4. Whether the table has a trustworthy ingestion-time column. Confirm the
587
+ column exists (for example with the `data-source-exploration` Skill) before
588
+ declaring `time_semantics.ingested_at_field` or an availability strategy
589
+ that reads it; never copy that field from a template.
590
+ 5. Which inputs may legitimately be absent (for example one faulty sensor) and
591
+ which must never be (for example a state indicator used by a business rule).
592
+
475
593
  `abnormal_windows` excludes target windows whose data must not be trusted. The
476
594
  policy and the lookback apply to the whole window set, not to individual
477
595
  windows: a dataset is either a filtered rowset or a marked full rowset.
@@ -494,9 +612,9 @@ windows: a dataset is either a filtered rowset or a marked full rowset.
494
612
  | `mark_only` | Drop nothing; record what is affected in lineage and validation. |
495
613
 
496
614
  How far past a window to drop is derived from the widest resolved Operator history
497
- requirement. Cutoff-relative history contributes `prediction.horizon + lookback`;
498
- target-time-relative history contributes its declared lookback directly. The
499
- maximum is used for source fetch and abnormal-window propagation. Do not restate
615
+ requirement: the larger of the cutoff-anchored and target-time-anchored
616
+ lookbacks (the horizon is not added, because the Operator cutoff is the row's
617
+ `event_time`). The maximum is used for source fetch and abnormal-window propagation. Do not restate
500
618
  that number unless you want it asserted: an optional `input_lookback_hours` is
501
619
  checked against the derived value and a mismatch is rejected. Note that a window
502
620
  near the end of the target range can have its lookback clipped by the range end,
@@ -0,0 +1,104 @@
1
+ # Bind And Build From External Data Platform Mappings
2
+
3
+ Use after the user has authorized publishing confirmed source contracts. Discovery remains in
4
+ `data-source-exploration`; this workflow writes existing Parameter resources through the modeling API.
5
+ Verify the installed CLI and configured API using the main Skill, then inspect command help.
6
+
7
+ 1. Discover a ready published Mapping with `list-data-platform-query-candidates`, then inspect
8
+ its pinned `active_revision.mapping_revision_id` with
9
+ `get-data-platform-mapping-revision ID REVISION`. Discovery returns the complete catalog
10
+ authorized for the integration account; it does not prove data coverage or reserve query access.
11
+ For older upstreams, follow the discovery reference's paged Mapping workflow.
12
+ 2. Confirm numeric value output keys, the unique event-time output, units, source timezone,
13
+ frequency, precision, entity scope and historical coverage. Do not treat Mapping readiness or a
14
+ complete snapshot as proof of causal correctness. SQL may already compute values or limit history.
15
+ 3. Write a binding JSON outside the platform repository:
16
+
17
+ ```json
18
+ {
19
+ "project": "default",
20
+ "mapping_id": "11111111-1111-4111-8111-111111111111",
21
+ "mapping_revision_id": "22222222-2222-4222-8222-222222222222",
22
+ "output_keys": ["out_value"],
23
+ "expected_frequency": "10min",
24
+ "event_time_precision": "s"
25
+ }
26
+ ```
27
+
28
+ Substitute confirmed IDs and settings. `output_keys` contains value outputs only. Source timezone
29
+ comes from the ReadSpec; if missing, supply `time_semantics`. Optional `time_semantics`,
30
+ `quality_rules`, `owner`, `partition_seconds`, `max_rows`, `timeout_seconds` follow the existing
31
+ contracts. Never infer availability from request time. Strict `as_of` requires the Mapping to
32
+ expose the trustworthy availability field declared in `time_semantics.availability`.
33
+ 4. Run `ml-platform bind-data-platform-parameters binding.json`. Preserve each returned `reference`
34
+ as a Feature input (`project`, `parameter`, `version`). The response also contains the full
35
+ Parameter. Do not manually recreate its source, SQL, credentials or version.
36
+ 5. Continue normal Operator → Feature → FeatureSet → DatasetManifest publication. Operator history
37
+ requirements govern source lookback; binding does not add a shared fixed window. Build and realtime
38
+ reads use `source_mode=direct`.
39
+ 6. For a DatasetManifest build, distinguish CLI submission from Worker execution. Inspect `get-job`
40
+ until a terminal status, then retrieve the DatasetArtifact. Confirm row and column counts against
41
+ the requested grid, Parquet column order, missing values, time coverage, and source-read evidence
42
+ (`mapping_revision_id`, `run_id`, `snapshot_id`, plan/window and actual read times) before handing
43
+ the dataset to model training. A submitted or running Kubernetes Job is not build evidence.
44
+
45
+ Repeated identical binding requests reuse deterministic Parameter identities. Changed Mapping revision
46
+ or effective configuration creates a new immutable version. Existing manually named Parameters are not
47
+ searched or merged. Multiple outputs are validated before writing, but each Parameter persists
48
+ independently; there is no cross-resource transaction. After an uncertain response, repeating the same
49
+ binding safely converges to the same Parameter contents. This does not mean uncertain upstream query
50
+ POSTs may be retried: inspect those runs separately.
51
+
52
+ Supported sources are single structured, unaggregated series, or SQL ReadSpecs without composed
53
+ inputs/expressions. SQL executes in the data platform. Ambiguous duplicate event times, partial snapshots and
54
+ revision/window mismatches fail. The adapter preserves source warnings, run, snapshot, Mapping
55
+ revision, plan, window and actual read times. Fixed definitions do not freeze mutable upstream rows
56
+ or make expiring snapshots permanent.
57
+
58
+ `read_started_at`/`read_finished_at` record when the adapter performed this read. They are audit
59
+ metadata, not per-row source availability evidence. A Mapping without a trustworthy published
60
+ availability output can be used for ordinary snapshot reads, but it cannot establish strict
61
+ historical `as_of` visibility. Do not substitute request/read time, event time, or `ingested_at`
62
+ for `available_at` unless the Parameter contract explicitly identifies that source field as the
63
+ trusted availability boundary. A complete snapshot proves transfer completeness, not historical
64
+ visibility or business coverage.
65
+
66
+ Mapping reads bypass ITSMP source cache so each read retains its upstream snapshot lineage.
67
+ `partition_seconds` defaults to 86400 (range 1–86400); each partition's `max_rows` defaults to and
68
+ cannot exceed 10000. One source read accepts at most 1024 partitions. `timeout_seconds` defaults
69
+ to 180 and accepts at most 600; it is checked between HTTP calls, whose own client timeout also
70
+ applies. These are source-adapter budgets, separate from Dataset build execution partitions.
71
+ If coverage exceeds a budget, choose a justified source partition or build window; never accept
72
+ truncation or remove required Operator history to make a read succeed. The adapter converts
73
+ upstream half-open windows into the closed source observation boundary, including its end instant;
74
+ the Dataset target grid remains half-open.
75
+
76
+ ## Worker Runtime Requirements And Failures
77
+
78
+ The business CLI does not configure Kubernetes, publish images or mount credentials. The platform
79
+ operator must configure the modeling API with the upstream integration Secret and configure the
80
+ dataset-build Job template to mount that Secret read-only and set
81
+ `DATA_PLATFORM_UPSTREAM_CONFIG_FILE`. Build Workers must receive the updated dataset-build image
82
+ containing the `data_platform_mapping` source adapter; changing only the API image is insufficient.
83
+ The API and Worker must use compatible platform code, but training and serving images do not need
84
+ this data-source adapter unless they themselves read Mapping data.
85
+
86
+ After catalog publication and build submission:
87
+
88
+ - On terminal success, inspect and download the artifact before reporting data success.
89
+ - If the job is accepted but remains queued, check Worker scheduling, quotas and active Jobs with
90
+ the platform operator; do not resubmit while its durable state is uncertain.
91
+ - If the Worker reports `unsupported source adapter` for `data_platform_mapping`, verify the
92
+ deployed dataset-build image includes the adapter. A healthy API or successful catalog `apply`
93
+ does not prove the Worker image was updated.
94
+ - If the Worker cannot load `DATA_PLATFORM_UPSTREAM_CONFIG_FILE`, or upstream authentication/network
95
+ fails, have the platform operator verify the Secret key/path, read-only mount, Worker namespace,
96
+ egress and integration-account permissions. Never copy credentials into the Parameter, Manifest,
97
+ CLI arguments or logs.
98
+ - For an uncertain query POST, inspect the upstream run before retrying. For a failed build, inspect
99
+ the durable Job and Worker logs, correct the identified cause, and submit a new attempt only after
100
+ confirming the previous attempt is terminal; do not blindly repeat the same request.
101
+
102
+ The Skill can guide asset authoring and API/CLI evidence collection, but it cannot diagnose container
103
+ exit causes from `get-job` alone or safely change the cluster. Keep Kubernetes events, pod reason,
104
+ container exit code and log tail as separate operational evidence.