mainsequence 4.4.8__tar.gz → 4.4.11__tar.gz

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 (161) hide show
  1. {mainsequence-4.4.8/mainsequence.egg-info → mainsequence-4.4.11}/PKG-INFO +1 -1
  2. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/AGENTS.md +28 -11
  3. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +14 -6
  4. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +40 -2
  5. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +4 -2
  6. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/connections/SKILL.md +26 -1
  7. {mainsequence-4.4.8/agent_scaffold/skills/command_center → mainsequence-4.4.11/agent_scaffold/skills/command_center/widgets}/app_components/SKILL.md +9 -5
  8. mainsequence-4.4.11/agent_scaffold/skills/command_center/widgets/tables/SKILL.md +333 -0
  9. mainsequence-4.4.11/agent_scaffold/skills/command_center/widgets/tabular_transform/SKILL.md +232 -0
  10. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +37 -3
  11. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +11 -2
  12. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +1 -1
  13. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +1 -1
  14. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +1 -1
  15. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/project_builder/SKILL.md +1 -1
  16. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/base.py +1 -1
  17. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/command_center/__init__.py +4 -0
  18. mainsequence-4.4.11/mainsequence/client/command_center/contracts/__init__.py +5 -0
  19. mainsequence-4.4.11/mainsequence/client/command_center/contracts/adapter_from_api.py +204 -0
  20. mainsequence-4.4.11/mainsequence/client/command_center/contracts/response_mapping.py +79 -0
  21. mainsequence-4.4.11/mainsequence/client/command_center/contracts/table_visuals.py +180 -0
  22. mainsequence-4.4.11/mainsequence/client/command_center/contracts/tabular.py +284 -0
  23. mainsequence-4.4.11/mainsequence/client/command_center/contracts/ui.py +23 -0
  24. mainsequence-4.4.11/mainsequence/client/command_center/providers/__init__.py +1 -0
  25. mainsequence-4.4.11/mainsequence/client/command_center/providers/adapter_from_api.py +153 -0
  26. mainsequence-4.4.11/mainsequence/client/command_center/widgets/__init__.py +5 -0
  27. mainsequence-4.4.11/mainsequence/client/command_center/widgets/bindings.py +78 -0
  28. mainsequence-4.4.11/mainsequence/client/command_center/widgets/connection_query.py +120 -0
  29. mainsequence-4.4.11/mainsequence/client/command_center/widgets/registry.py +46 -0
  30. mainsequence-4.4.11/mainsequence/client/command_center/widgets/table.py +455 -0
  31. mainsequence-4.4.11/mainsequence/client/command_center/widgets/tabular_transform.py +410 -0
  32. mainsequence-4.4.11/mainsequence/client/command_center/workspaces/__init__.py +2 -0
  33. mainsequence-4.4.11/mainsequence/client/command_center/workspaces/documents.py +43 -0
  34. mainsequence-4.4.11/mainsequence/client/command_center/workspaces/mounted_widgets.py +40 -0
  35. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/metatables/core.py +28 -9
  36. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/models_foundry.py +3 -1
  37. {mainsequence-4.4.8 → mainsequence-4.4.11/mainsequence.egg-info}/PKG-INFO +1 -1
  38. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence.egg-info/SOURCES.txt +22 -1
  39. {mainsequence-4.4.8 → mainsequence-4.4.11}/pyproject.toml +1 -1
  40. mainsequence-4.4.11/tests/test_command_center_table_contracts.py +177 -0
  41. mainsequence-4.4.11/tests/test_command_center_tabular_transform.py +212 -0
  42. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_pod_project_resolution.py +38 -0
  43. {mainsequence-4.4.8 → mainsequence-4.4.11}/LICENSE +0 -0
  44. {mainsequence-4.4.8 → mainsequence-4.4.11}/README.md +0 -0
  45. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  46. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  47. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  48. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  49. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  50. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  51. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  52. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  53. {mainsequence-4.4.8 → mainsequence-4.4.11}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  54. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/__init__.py +0 -0
  55. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/__main__.py +0 -0
  56. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/bootstrap.py +0 -0
  57. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/__init__.py +0 -0
  58. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/api.py +0 -0
  59. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/browser_auth.py +0 -0
  60. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/cli.py +0 -0
  61. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/config.py +0 -0
  62. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/docker_utils.py +0 -0
  63. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/doctor.py +0 -0
  64. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/local_ops.py +0 -0
  65. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/migrations.py +0 -0
  66. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/model_filters.py +0 -0
  67. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/project_status.py +0 -0
  68. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/pydantic_cli.py +0 -0
  69. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/sdk_utils.py +0 -0
  70. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/ssh_utils.py +0 -0
  71. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/cli/ui.py +0 -0
  72. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/__init__.py +0 -0
  73. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/agent_runtime_models.py +0 -0
  74. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/client.py +0 -0
  75. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/command_center/app_component.py +0 -0
  76. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/command_center/connections.py +0 -0
  77. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/command_center/data_models.py +0 -0
  78. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/command_center/workspace.py +0 -0
  79. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  80. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/compute_validation.py +0 -0
  81. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  82. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  83. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  84. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  85. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/dtype_codec.py +0 -0
  86. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/exceptions.py +0 -0
  87. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/fastapi/__init__.py +0 -0
  88. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/fastapi/auth.py +0 -0
  89. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/metatables/__init__.py +0 -0
  90. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/models_helpers.py +0 -0
  91. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/models_user.py +0 -0
  92. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/client/utils.py +0 -0
  93. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/defaults.py +0 -0
  94. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/instrumentation/__init__.py +0 -0
  95. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/instrumentation/utils.py +0 -0
  96. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/logconf.py +0 -0
  97. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/__init__.py +0 -0
  98. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/__main__.py +0 -0
  99. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  100. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  101. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  102. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  103. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  104. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  105. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  106. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  107. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  108. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  109. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/future_registry.py +0 -0
  110. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/hashing.py +0 -0
  111. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  112. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  113. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/env.py +0 -0
  114. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/provider.py +0 -0
  115. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/registry.py +0 -0
  116. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  117. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  118. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  119. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  120. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  121. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/schema_names.py +0 -0
  122. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  123. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/runtime_flags.py +0 -0
  124. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence/scaffold_skills.py +0 -0
  125. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence.egg-info/dependency_links.txt +0 -0
  126. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence.egg-info/entry_points.txt +0 -0
  127. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence.egg-info/requires.txt +0 -0
  128. {mainsequence-4.4.8 → mainsequence-4.4.11}/mainsequence.egg-info/top_level.txt +0 -0
  129. {mainsequence-4.4.8 → mainsequence-4.4.11}/setup.cfg +0 -0
  130. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_auth_precedence.py +0 -0
  131. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_build_operations_hashing.py +0 -0
  132. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_cli.py +0 -0
  133. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_cli_browser_auth.py +0 -0
  134. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_cli_migrations.py +0 -0
  135. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_client.py +0 -0
  136. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_command_center_app_component_models.py +0 -0
  137. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_command_center_data_models.py +0 -0
  138. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_command_center_models.py +0 -0
  139. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  140. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_data_node_storage_dimension_queries.py +0 -0
  141. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_data_node_update_flow.py +0 -0
  142. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_dependency_extras.py +0 -0
  143. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_duckdb_interface_dimensions.py +0 -0
  144. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_filter_normalization.py +0 -0
  145. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_instrumentation.py +0 -0
  146. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_logconf.py +0 -0
  147. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_meta_table_migrations.py +0 -0
  148. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_meta_tables_client_models.py +0 -0
  149. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  150. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_models_user_request_bound_auth.py +0 -0
  151. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_project_batch_jobs_from_file.py +0 -0
  152. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_run_configuration.py +0 -0
  153. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_scaffold_skills.py +0 -0
  154. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_schema_names.py +0 -0
  155. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_secret_client_model.py +0 -0
  156. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_source_table_configuration.py +0 -0
  157. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_sqlite_interface_dimensions.py +0 -0
  158. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_update_runner_uid_runtime.py +0 -0
  159. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_update_statistics.py +0 -0
  160. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_update_uid_guards.py +0 -0
  161. {mainsequence-4.4.8 → mainsequence-4.4.11}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.4.8
3
+ Version: 4.4.11
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License: MainSequence GmbH SDK License Agreement
@@ -17,17 +17,25 @@ uses them to update only the Main Sequence section below.
17
17
  <!-- mainsequence-agent-scaffold:start schema=1 source=agent_scaffold -->
18
18
  ## Main Sequence Instructions
19
19
 
20
- Before any non-trivial Main Sequence work, update the project SDK first and then refresh the
21
- installed Main Sequence scaffold files so the local CLI surface, `AGENTS.md`, and
22
- `.agents/skills/mainsequence/` match the installed SDK version:
20
+ Before any non-trivial Main Sequence work, update the project SDK first, then compare the
21
+ installed SDK version with the managed skills pin:
23
22
 
24
23
  - `mainsequence project update-sdk --path .`
24
+
25
+ After the SDK update, inspect `.agents/skills/mainsequence/PINNED_FROM.txt`.
26
+ Its `pinned_version=...` value records the SDK version that supplied the copied
27
+ Main Sequence skills. Compare that value with the installed SDK version reported
28
+ by `mainsequence --version`.
29
+
30
+ Refresh the managed scaffold only when `PINNED_FROM.txt` is missing or its
31
+ `pinned_version` differs from the installed SDK version:
32
+
25
33
  - `mainsequence project update AGENTS.md --path .`
26
34
  - `mainsequence project update_agent_skills --path .`
27
35
 
28
- After refreshing skills, `.agents/skills/mainsequence/PINNED_FROM.txt` records
29
- the installed SDK version that supplied the copied Main Sequence skills. Inspect
30
- that sentinel when checking whether the managed skills are current.
36
+ If `pinned_version` already matches the installed SDK version, do not refresh
37
+ `AGENTS.md` or `.agents/skills/mainsequence/` as a startup ritual; continue with
38
+ the task.
31
39
 
32
40
  Canonical Main Sequence documentation root:
33
41
  `https://mainsequence-sdk.github.io/mainsequence-sdk/`
@@ -183,7 +191,13 @@ Typical routing:
183
191
  - Command Center workspace JSON creation/update and mounted widget mutation:
184
192
  `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
185
193
  - AppComponents, custom forms, and widget input or output contracts:
186
- `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
194
+ `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
195
+ - Command Center table/pro-table widgets, tabular frames, table visual metadata, formulas,
196
+ selections, and live merge mappings:
197
+ `.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
198
+ - Command Center tabular transform widgets, projection, filtering, aggregate, pivot, unpivot,
199
+ computed columns, and seed/live update bindings:
200
+ `.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
187
201
  - predeployment AppComponent/API contract testing through `apiTargetMode: "mock-json"`:
188
202
  `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md`
189
203
  - jobs, schedules, images, project resources, releases, and Artifacts:
@@ -211,12 +225,15 @@ For any non-trivial Main Sequence task:
211
225
  `mainsequence project open-signed-terminal <PROJECT_ID>`
212
226
  11. Before proceeding with non-trivial Main Sequence work, update the project SDK:
213
227
  `mainsequence project update-sdk --path .`
214
- 12. After updating the SDK, refresh the installed Main Sequence scaffold files:
228
+ 12. After updating the SDK, compare `mainsequence --version` with
229
+ `.agents/skills/mainsequence/PINNED_FROM.txt` field `pinned_version=...`.
230
+ 13. If `PINNED_FROM.txt` is missing or `pinned_version` differs from the installed
231
+ SDK version, refresh the managed scaffold files:
215
232
  `mainsequence project update AGENTS.md --path .`
216
233
  `mainsequence project update_agent_skills --path .`
217
- 13. Check `.agents/skills/mainsequence/PINNED_FROM.txt` when you need to verify
218
- which SDK version supplied the copied Main Sequence skills.
219
- 14. Verify platform state with the CLI or platform tooling instead of guessing.
234
+ 14. If `pinned_version` already matches the installed SDK version, do not refresh
235
+ `AGENTS.md` or `.agents/skills/mainsequence/` as a startup ritual.
236
+ 15. Verify platform state with the CLI or platform tooling instead of guessing.
220
237
 
221
238
  ## Orchestrator Rule
222
239
 
@@ -51,7 +51,11 @@ This skill must not claim ownership of:
51
51
  - Command Center workspaces:
52
52
  `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
53
53
  - AppComponents and custom forms:
54
- `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
54
+ `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
55
+ - Command Center table/pro-table response contracts:
56
+ `.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
57
+ - Command Center tabular transform consumers:
58
+ `.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
55
59
  - Adapter from API provider-side Command Center connection endpoints:
56
60
  `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md`
57
61
  - predeployment mock API contract validation:
@@ -69,14 +73,18 @@ This skill must not claim ownership of:
69
73
  4. `docs/knowledge/fastapi/index.md`
70
74
  5. `docs/knowledge/command_center/widget_data_contracts.md`
71
75
  6. `docs/knowledge/command_center/forms.md`
72
- 7. `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
76
+ 7. `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
73
77
 
74
78
  Also load:
75
79
 
76
80
  8. `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md` when the API is tied to mounted widgets, workspace payloads, or workspace mutation
77
- 9. `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md` when the API must be consumed through a Command Center Adapter from API connection
78
- 10. `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md` when the contract should be validated in AppComponent mock mode before backend deployment
79
- 11. `.agents/skills/mainsequence/platform_operations/orchestration_and_releases/SKILL.md` when the API must become usable from Command Center or an AppComponent
81
+ 9. `.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md` when the API returns
82
+ `core.tabular_frame@v1`, `meta.tableVisuals`, or table/pro-table widget-facing data
83
+ 10. `.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md` when the API
84
+ response will be reshaped by `core__tabular-transform`
85
+ 11. `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md` when the API must be consumed through a Command Center Adapter from API connection
86
+ 12. `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md` when the contract should be validated in AppComponent mock mode before backend deployment
87
+ 13. `.agents/skills/mainsequence/platform_operations/orchestration_and_releases/SKILL.md` when the API must become usable from Command Center or an AppComponent
80
88
 
81
89
  Do not wait for the user to say "Command Center" explicitly if the API is being built as a platform UI surface. That is the default assumption in Main Sequence projects.
82
90
 
@@ -138,7 +146,7 @@ In a Main Sequence project, assume API work is for Command Center unless the use
138
146
  That means:
139
147
 
140
148
  - prefer widget-facing contracts by default
141
- - load `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
149
+ - load `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
142
150
  - also load `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md` when the API is coupled to mounted workspace widgets or workspace payloads
143
151
  - load `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md` when the API will be consumed by connection-first workspace dataflow
144
152
  - try to use the existing Command Center SDK response model before inventing a new response shape
@@ -99,6 +99,39 @@ connection/query flow directly. This avoids constant API deployments while itera
99
99
  contract, operation metadata, response shape, and widget behavior. Switch to `--api-base-url` only
100
100
  when the deployed API is ready to be the stable backend target.
101
101
 
102
+ ## SDK Helper Modules
103
+
104
+ Provider code should use the Command Center SDK helpers instead of hand-building the well-known
105
+ contract when the project can depend on `mainsequence-sdk`:
106
+
107
+ ```python
108
+ from mainsequence.client.command_center.contracts.adapter_from_api import (
109
+ AdapterFromApiConfigVariable,
110
+ AdapterFromApiParameter,
111
+ AdapterFromApiSecretInjection,
112
+ AdapterFromApiSecretVariable,
113
+ )
114
+ from mainsequence.client.command_center.contracts.response_mapping import (
115
+ make_tabular_response_mapping,
116
+ )
117
+ from mainsequence.client.command_center.contracts.tabular import make_tabular_frame
118
+ from mainsequence.client.command_center.providers.adapter_from_api import (
119
+ make_health_operation,
120
+ make_provider_contract,
121
+ make_query_operation,
122
+ )
123
+ ```
124
+
125
+ Use:
126
+
127
+ - `contracts.adapter_from_api` for strict provider contract, operation, config variable, and secret
128
+ variable models
129
+ - `providers.adapter_from_api` for `make_health_operation`, `make_query_operation`, and
130
+ `make_provider_contract`
131
+ - `contracts.response_mapping` for optional `responseMappings` metadata
132
+ - `contracts.tabular` for canonical `core.tabular_frame@v1` response helpers such as
133
+ `make_tabular_frame`
134
+
102
135
  ## Scope
103
136
 
104
137
  This skill owns:
@@ -131,8 +164,10 @@ Route those concerns to the adjacent skills below.
131
164
  `.agents/skills/mainsequence/command_center/connections/SKILL.md`
132
165
  - Workspace widgets and binding:
133
166
  `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
167
+ - Table/pro-table output contracts and `meta.tableVisuals` metadata:
168
+ `.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
134
169
  - AppComponent form-driven actions:
135
- `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
170
+ `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
136
171
  - API mock/prototype validation before deployment:
137
172
  `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md`
138
173
  - FastAPI resources, images, jobs, and releases:
@@ -330,6 +365,7 @@ For FastAPI providers in Main Sequence repos, full canonical frame endpoints mus
330
365
 
331
366
  ```python
332
367
  from mainsequence.client.command_center.data_models import TabularFrameResponse
368
+ from mainsequence.client.command_center.contracts.tabular import make_tabular_frame
333
369
  ```
334
370
 
335
371
  Declare `response_model=TabularFrameResponse` instead of recreating the canonical frame shape
@@ -420,7 +456,9 @@ Before implementing or revising an API for Adapter from API consumption, decide:
420
456
 
421
457
  For a FastAPI provider:
422
458
 
423
- - define strict Pydantic models for the Command Center contract
459
+ - use the SDK provider helpers in `mainsequence.client.command_center.providers.adapter_from_api`
460
+ and strict models in `mainsequence.client.command_center.contracts.adapter_from_api` when the
461
+ dependency is available
424
462
  - set explicit `operation_id` values on routes
425
463
  - expose `GET /.well-known/command-center/connection-contract`
426
464
  - expose a zero-argument health route
@@ -44,9 +44,11 @@ This skill must not claim ownership of:
44
44
  ## Route Adjacent Work
45
45
 
46
46
  - AppComponents and custom forms:
47
- `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
47
+ `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
48
48
  - Command Center workspaces and widget mutation:
49
49
  `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
50
+ - Tabular transform widgets for downstream reshaping in mock validation:
51
+ `.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
50
52
  - APIs and FastAPI:
51
53
  `.agents/skills/mainsequence/application_surfaces/api_surfaces/SKILL.md`
52
54
  - Jobs, images, resources, and releases:
@@ -61,7 +63,7 @@ This skill must not claim ownership of:
61
63
  2. The SDK client models:
62
64
  - `mainsequence/client/command_center/app_component.py`
63
65
  - `mainsequence/client/command_center/workspace.py`
64
- 3. `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
66
+ 3. `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
65
67
  4. `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
66
68
 
67
69
  Only after the mock contract is stable:
@@ -24,6 +24,11 @@ connection instance and query model are known.
24
24
  ## This Skill Can Do
25
25
 
26
26
  - discover connection types and instances through `mainsequence.client.command_center.connections`
27
+ - use `mainsequence.client.command_center.widgets.connection_query` for connection-query source
28
+ widget payload drafts
29
+ - use `mainsequence.client.command_center.contracts.*` and
30
+ `mainsequence.client.command_center.providers.*` when validating Adapter from API provider
31
+ contracts
27
32
  - decide whether an existing connection instance can support the requested workspace data
28
33
  - inspect `ConnectionType.queryModels` and `usageGuidance`
29
34
  - verify that a query model can publish the required output contract
@@ -48,10 +53,14 @@ This skill must not claim ownership of:
48
53
  `.agents/skills/mainsequence/command_center/workspace_design/SKILL.md`
49
54
  - Workspace JSON creation and widget mutation:
50
55
  `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
56
+ - Table/pro-table consumer contracts, table visual metadata, selection, and live update behavior:
57
+ `.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
58
+ - Tabular transform consumer contracts and source/live update bindings:
59
+ `.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
51
60
  - Adapter from API connection workflow:
52
61
  `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md`
53
62
  - AppComponent forms and action API contracts:
54
- `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
63
+ `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
55
64
  - API implementation:
56
65
  `.agents/skills/mainsequence/application_surfaces/api_surfaces/SKILL.md`
57
66
  - Jobs, images, resources, and releases:
@@ -63,6 +72,22 @@ This skill must not claim ownership of:
63
72
  - `mainsequence/client/command_center/connections.py`
64
73
  - `mainsequence/client/command_center/data_models.py` when validating `core.tabular_frame@v1`
65
74
  output shape
75
+ - `mainsequence/client/command_center/contracts/adapter_from_api.py` when validating provider
76
+ discovery contracts
77
+ - `mainsequence/client/command_center/contracts/response_mapping.py` when validating
78
+ response-mapping metadata
79
+ - `mainsequence/client/command_center/contracts/tabular.py` when building or checking canonical
80
+ tabular frames
81
+ - `mainsequence/client/command_center/contracts/table_visuals.py` when table-specific visual
82
+ defaults travel with `meta.tableVisuals`
83
+ - `mainsequence/client/command_center/providers/adapter_from_api.py` when a provider should use
84
+ SDK contract builders
85
+ - `mainsequence/client/command_center/widgets/connection_query.py` when creating
86
+ connection-query source widget payloads
87
+ - `mainsequence/client/command_center/widgets/tabular_transform.py` when a connection-backed
88
+ flow needs a `core__tabular-transform` widget
89
+ - `mainsequence/client/command_center/widgets/bindings.py` when binding seed data or live updates
90
+ into the transform
66
91
  2. Widget registry detail for the source and consumer widgets:
67
92
  - `mainsequence cc registered_widget_type list --json`
68
93
  - `mainsequence cc registered_widget_type detail <WIDGET_ID> --json`
@@ -47,6 +47,8 @@ This skill must not claim ownership of:
47
47
 
48
48
  - Command Center workspaces:
49
49
  `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
50
+ - Command Center table/pro-table output contracts and table visual metadata:
51
+ `.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
50
52
  - predeployment mock API contract validation:
51
53
  `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md`
52
54
  - APIs and FastAPI:
@@ -71,17 +73,19 @@ This skill must not claim ownership of:
71
73
  2. `docs/knowledge/command_center/forms.md`
72
74
  3. `docs/knowledge/command_center/widget_data_contracts.md`
73
75
  4. `mainsequence/client/command_center/app_component.py`
74
- 5. `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md` when API-shaped data must become a connection-backed tabular dataset
75
- 6. `.agents/skills/mainsequence/command_center/connections/SKILL.md` when AppComponent output will be consumed by generic tabular widgets or must align with connection-first dataflow
76
+ 5. `.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md` when AppComponent output will feed
77
+ a table/pro-table widget or needs `core.tabular_frame@v1` plus table visual metadata
78
+ 6. `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md` when API-shaped data must become a connection-backed tabular dataset
79
+ 7. `.agents/skills/mainsequence/command_center/connections/SKILL.md` when AppComponent output will be consumed by generic tabular widgets or must align with connection-first dataflow
76
80
 
77
81
  If the AppComponent is backed by project APIs, also read:
78
82
 
79
- 7. `.agents/skills/mainsequence/application_surfaces/api_surfaces/SKILL.md`
80
- 8. `.agents/skills/mainsequence/platform_operations/orchestration_and_releases/SKILL.md`
83
+ 8. `.agents/skills/mainsequence/application_surfaces/api_surfaces/SKILL.md`
84
+ 9. `.agents/skills/mainsequence/platform_operations/orchestration_and_releases/SKILL.md`
81
85
 
82
86
  If the task is about validating the API contract before deployment, also read:
83
87
 
84
- 9. `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md`
88
+ 10. `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md`
85
89
 
86
90
  ## Inputs This Skill Needs
87
91
 
@@ -0,0 +1,333 @@
1
+ ---
2
+ name: command-center-tables
3
+ description: Use this skill when the task is about Command Center table or pro-table widgets, canonical `core.tabular_frame@v1` responses, table-specific frame visual metadata, table widget column schema, formula columns, conditional formatting, selection outputs, or live merge key mappings. This skill owns the boundary between source-owned tabular frame contracts and persisted table widget props. It does not own workspace layout, connection creation, generic API architecture, AppComponent forms, MetaTable schema design, or DataNode storage design.
4
+ ---
5
+
6
+ # Command Center Tables
7
+
8
+ ## Overview
9
+
10
+ Use this skill when a Command Center table surface needs exact contract work.
11
+
12
+ There are two table-related surfaces that must stay separate:
13
+
14
+ - source-owned data contract:
15
+ `core.tabular_frame@v1` plus optional `meta.tableVisuals`
16
+ - widget-owned presentation contract:
17
+ `core__table` or `core__pro-table` mounted widget props
18
+
19
+ Do not mix these contracts. A data producer should return a canonical tabular frame. A workspace
20
+ table widget should define persisted presentation choices, bindings, formulas, selection behavior,
21
+ and live update mappings.
22
+
23
+ ## This Skill Can Do
24
+
25
+ - design or review a `core.tabular_frame@v1` response intended for table consumption
26
+ - use `make_tabular_frame`, `make_tabular_field`, and related helpers
27
+ - add or review source-owned `meta.tableVisuals` metadata
28
+ - decide whether display semantics belong in `meta.tableVisuals` or table widget props
29
+ - build or review `core__table` mounted widget payloads
30
+ - build or review `core__pro-table` mounted widget payloads
31
+ - define `TableWidgetColumnSchema`
32
+ - define `TableWidgetColumnOverride`
33
+ - define conditional rules and value labels
34
+ - use formula helpers and `make_formula_column` for pro-table only
35
+ - define selection mode and selection key fields
36
+ - define live merge key mappings for incremental table updates
37
+ - verify table/pro-table widget registry details before mounting or mutating a table widget
38
+
39
+ ## This Skill Must Not Claim
40
+
41
+ This skill must not claim ownership of:
42
+
43
+ - workspace narrative, layout, or widget selection strategy
44
+ - workspace JSON mutation or widget-scoped patch execution
45
+ - connection type selection or connection instance creation
46
+ - Adapter from API provider discovery contracts outside table-specific frame output decisions
47
+ - AppComponent request forms, editable forms, or notification responses
48
+ - generic FastAPI route architecture
49
+ - MetaTable schema, DataNode storage, migrations, or governed operations
50
+ - resource releases, jobs, images, RBAC, or sharing
51
+
52
+ ## Route Adjacent Work
53
+
54
+ - Workspace design and deciding whether the view should be a table:
55
+ `.agents/skills/mainsequence/command_center/workspace_design/SKILL.md`
56
+ - Workspace JSON creation, table mounting, and widget mutation:
57
+ `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
58
+ - Connection-backed source data and query model selection:
59
+ `.agents/skills/mainsequence/command_center/connections/SKILL.md`
60
+ - Adapter from API provider contracts:
61
+ `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md`
62
+ - Tabular transform widgets that reshape data before table consumption:
63
+ `.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
64
+ - AppComponent custom forms and action contracts:
65
+ `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
66
+ - APIs and FastAPI:
67
+ `.agents/skills/mainsequence/application_surfaces/api_surfaces/SKILL.md`
68
+ - MetaTables:
69
+ `.agents/skills/mainsequence/data_publishing/meta_tables/SKILL.md`
70
+ - DataNodes:
71
+ `.agents/skills/mainsequence/data_publishing/data_nodes/SKILL.md`
72
+
73
+ ## Read First
74
+
75
+ 1. Verify the table widget catalog through the CLI:
76
+ - `mainsequence cc registered_widget_type list --json`
77
+ - identify `core__table` or `core__pro-table`
78
+ - `mainsequence cc registered_widget_type detail <WIDGET_ID> --json`
79
+ 2. `docs/knowledge/command_center/widget_data_contracts.md`
80
+ 3. SDK table and tabular models:
81
+ - `mainsequence/client/command_center/contracts/tabular.py`
82
+ - `mainsequence/client/command_center/contracts/table_visuals.py`
83
+ - `mainsequence/client/command_center/widgets/table.py`
84
+ - `mainsequence/client/command_center/data_models.py`
85
+ 4. If the table consumes connection-backed data:
86
+ - `.agents/skills/mainsequence/command_center/connections/SKILL.md`
87
+ - `mainsequence/client/command_center/widgets/connection_query.py`
88
+ - `mainsequence/client/command_center/widgets/bindings.py`
89
+ 5. If the table consumes transformed data:
90
+ - `.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
91
+ - `mainsequence/client/command_center/widgets/tabular_transform.py`
92
+ 6. If mounting or mutating a table widget:
93
+ - `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
94
+ - `mainsequence/client/command_center/workspaces/mounted_widgets.py`
95
+
96
+ Use the SDK helper files above before opening frontend implementation files.
97
+
98
+ ## Inputs This Skill Needs
99
+
100
+ Before changing a table contract or payload, collect or infer:
101
+
102
+ - target widget id: `core__table` or `core__pro-table`
103
+ - registry detail for that widget id
104
+ - source mode: bound, connection, connection-stream, or manual
105
+ - source frame shape: columns, rows, fields, source, and meta
106
+ - whether the source emits a full `core.tabular_frame@v1` response
107
+ - which fields are stable identity keys
108
+ - which columns should be visible, hidden, pinned, aligned, formatted, or resized
109
+ - which formatting is source-owned default metadata versus workspace-specific override
110
+ - whether formulas are needed
111
+ - whether row/cell selection is needed and which outputs downstream widgets consume
112
+ - whether live updates need merge mappings from seed fields to live-update fields
113
+
114
+ ## Required Decisions
115
+
116
+ For every non-trivial table task, decide:
117
+
118
+ 1. Should the data be represented as `core.tabular_frame@v1` before it reaches the table?
119
+ 2. Does the table need `core__table` or `core__pro-table`?
120
+ 3. Are formula columns required? If yes, use `core__pro-table`.
121
+ 4. Which display semantics should be emitted by the source in `meta.tableVisuals`?
122
+ 5. Which display choices should remain widget-owned props or user/workspace overrides?
123
+ 6. Should column descriptions live in frame `fields`, table widget `schema`, or both?
124
+ 7. Does selection need stable `selectionKeyFields` and published selection outputs?
125
+ 8. Does incremental/live updating need `liveMergeKeyMappings`?
126
+ 9. Is a Tabular Transform widget needed before the table?
127
+ 10. Has the exact widget registry detail been checked before authoring payloads?
128
+
129
+ ## Build Rules
130
+
131
+ ### 1. Use Canonical Tabular Frames At The Consumption Boundary
132
+
133
+ Table and pro-table widgets should consume `core.tabular_frame@v1` for generic tabular data.
134
+
135
+ Use:
136
+
137
+ ```python
138
+ from mainsequence.client.command_center.contracts.tabular import (
139
+ make_tabular_field,
140
+ make_tabular_frame,
141
+ )
142
+ ```
143
+
144
+ Do not bind raw arrays, paginated provider JSON, nested objects, or provider-native payloads
145
+ directly into generic table consumers unless a dedicated widget contract explicitly supports that
146
+ shape.
147
+
148
+ ### 2. Keep Source-Owned Table Defaults In `meta.tableVisuals`
149
+
150
+ Use `meta.tableVisuals` for source-owned display metadata that should travel with the frame:
151
+
152
+ ```python
153
+ from mainsequence.client.command_center.contracts.table_visuals import (
154
+ make_table_visual_column,
155
+ make_table_visuals,
156
+ )
157
+ from mainsequence.client.command_center.contracts.tabular import make_tabular_frame
158
+
159
+ frame = make_tabular_frame(
160
+ rows=[{"asset": "BTC", "price": 101.25, "change": 0.015}],
161
+ columns=["asset", "price", "change"],
162
+ table_visuals=make_table_visuals(
163
+ {
164
+ "price": make_table_visual_column(format="currency", decimals=2),
165
+ "change": make_table_visual_column(format="percent", decimals=2),
166
+ }
167
+ ),
168
+ )
169
+ ```
170
+
171
+ Use `meta.tableVisuals` for stable source semantics such as:
172
+
173
+ - source-recommended labels
174
+ - numeric, currency, percent, bps, or formula result format hints
175
+ - default decimals
176
+ - default heatmap, bar, gradient, gauge, or threshold hints
177
+ - inline series encoding hints for sparkline-like columns
178
+
179
+ Do not put user-specific layout, workspace-local overrides, credentials, connection ids, or runtime
180
+ view state into `meta.tableVisuals`.
181
+
182
+ ### 3. Keep Widget-Owned Presentation In Table Props
183
+
184
+ Use table widget props for persisted workspace presentation:
185
+
186
+ ```python
187
+ from mainsequence.client.command_center.widgets.table import (
188
+ TableWidgetColumnOverride,
189
+ TableWidgetColumnSchema,
190
+ make_table_widget_payload,
191
+ )
192
+
193
+ payload = make_table_widget_payload(
194
+ title="Prices",
195
+ schema=[
196
+ TableWidgetColumnSchema(key="asset", label="Asset", format="text"),
197
+ TableWidgetColumnSchema(key="price", label="Price", format="currency"),
198
+ ],
199
+ column_overrides={
200
+ "price": TableWidgetColumnOverride(format="currency", decimals=2, align="right")
201
+ },
202
+ )
203
+ ```
204
+
205
+ Use widget props for:
206
+
207
+ - table source mode
208
+ - column schema and persistent column overrides
209
+ - toolbar/search/filter/pagination options
210
+ - value labels and conditional rules
211
+ - selection mode and selection output behavior
212
+ - live merge key mappings
213
+ - workspace-specific formatting choices
214
+
215
+ ### 4. Formula Columns Require Pro Table
216
+
217
+ Normal table payloads reject formula columns. If the table needs formula columns, use
218
+ `core__pro-table` and `make_pro_table_widget_payload`.
219
+
220
+ ```python
221
+ from mainsequence.client.command_center.widgets.table import (
222
+ formula_percent_change,
223
+ make_formula_column,
224
+ make_pro_table_widget_payload,
225
+ )
226
+
227
+ payload = make_pro_table_widget_payload(
228
+ title="Returns",
229
+ schema=[
230
+ make_formula_column(
231
+ key="return_pct",
232
+ label="Return %",
233
+ expression=formula_percent_change("price", "previous_price"),
234
+ result_format="percent",
235
+ )
236
+ ],
237
+ )
238
+ ```
239
+
240
+ Do not force formula props into `core__table`.
241
+
242
+ ### 5. Do Not Confuse Frame Fields With Widget Schema
243
+
244
+ Frame `fields` describe the data contract:
245
+
246
+ - key
247
+ - label
248
+ - type
249
+ - nullable
250
+ - provenance
251
+
252
+ Table widget `schema` describes persisted table presentation and table runtime behavior:
253
+
254
+ - format
255
+ - formula expression
256
+ - min width, flex, pinning
257
+ - compactness
258
+ - heatmap eligibility
259
+
260
+ It is valid to use both, but they serve different owners. Do not replace a canonical frame field
261
+ description with widget props, and do not put table runtime-only props into frame fields.
262
+
263
+ ### 6. Connection-Backed Tables Must Stay Connection-First
264
+
265
+ If a table consumes backend-owned data:
266
+
267
+ 1. resolve the connection instance and query model
268
+ 2. use a Connection Query source widget
269
+ 3. bind the table input to the source widget output
270
+ 4. use a Tabular Transform widget before the table when reshaping is needed
271
+
272
+ Do not store endpoint URLs, credentials, raw provider ids, or route fragments in table widget props.
273
+
274
+ ### 7. Live Merge Keys Must Be Stable
275
+
276
+ Use `TableLiveMergeKeyMapping` only when seed-frame rows and live-update rows have stable fields
277
+ that identify the same logical row.
278
+
279
+ Do not configure live merge mappings from display labels, mutable names, timestamps alone, or
280
+ non-unique values.
281
+
282
+ ### 8. Selection Outputs Need Stable Keys
283
+
284
+ When the table should drive downstream widgets, define:
285
+
286
+ - `selectionMode`
287
+ - `selectionKeyFields`
288
+ - `publishSelectionOutputs`
289
+
290
+ Selection key fields must identify rows stably enough for downstream consumers.
291
+
292
+ ## Review Rules
293
+
294
+ When reviewing table work, look for:
295
+
296
+ - raw provider JSON bound into a generic table
297
+ - table widget props carrying credentials, endpoint URLs, or backend route fragments
298
+ - display defaults that should be source-owned but were hardcoded as workspace overrides
299
+ - workspace-local overrides pushed into `meta.tableVisuals`
300
+ - formula columns mounted on `core__table` instead of `core__pro-table`
301
+ - duplicate table schema column keys
302
+ - conditional rules referencing missing schema columns
303
+ - selection outputs without stable key fields
304
+ - live merge mappings based on unstable or non-unique fields
305
+ - frame `fields` being used as a substitute for widget runtime schema, or the reverse
306
+ - table payloads authored before registry detail was checked
307
+
308
+ ## Validation Checklist
309
+
310
+ Do not claim the table contract is ready until:
311
+
312
+ - the target widget id was verified through registry detail
313
+ - data consumed by generic table widgets is `core.tabular_frame@v1`
314
+ - frame columns and row keys are aligned
315
+ - important field types are represented in `fields`
316
+ - source-specific runtime details live in `source.context`
317
+ - source-owned display defaults, if any, live under `meta.tableVisuals`
318
+ - table widget props serialize through `make_table_widget_payload` or `make_pro_table_widget_payload`
319
+ - formula columns use `core__pro-table`
320
+ - selection and live merge keys are stable when configured
321
+ - the workspace handoff identifies bindings from source outputs to table inputs
322
+
323
+ ## Stop Conditions
324
+
325
+ Stop and route to the adjacent skill when:
326
+
327
+ - the task is deciding whether a table is the right widget
328
+ - the table needs a connection instance or query model that does not exist
329
+ - the API cannot emit `core.tabular_frame@v1` but the table needs generic tabular data
330
+ - table widget registry detail is unavailable or contradicts the SDK model
331
+ - formulas are required but `core__pro-table` is unavailable
332
+ - stable selection or live merge keys cannot be identified
333
+ - the task has moved into workspace JSON mutation or backend API implementation