mainsequence 8.1.20.dev3__tar.gz → 8.1.20.dev4__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 (141) hide show
  1. {mainsequence-8.1.20.dev3/mainsequence.egg-info → mainsequence-8.1.20.dev4}/PKG-INFO +1 -1
  2. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +10 -5
  3. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +13 -9
  4. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +9 -4
  5. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4/mainsequence.egg-info}/PKG-INFO +1 -1
  6. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/pyproject.toml +1 -1
  7. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_code_repository_documentation_contract.py +53 -4
  8. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/LICENSE +0 -0
  9. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/MANIFEST.in +0 -0
  10. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/README.md +0 -0
  11. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/AGENTS.md +0 -0
  12. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  13. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  14. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  15. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
  16. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  17. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
  18. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  19. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
  20. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/__init__.py +0 -0
  21. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/__main__.py +0 -0
  22. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/bootstrap.py +0 -0
  23. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/__init__.py +0 -0
  24. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/api.py +0 -0
  25. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/browser_auth.py +0 -0
  26. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/cli.py +0 -0
  27. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/code_repository_status.py +0 -0
  28. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/config.py +0 -0
  29. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/docker_utils.py +0 -0
  30. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/doctor.py +0 -0
  31. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/local_ops.py +0 -0
  32. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/migrations.py +0 -0
  33. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/model_filters.py +0 -0
  34. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/pydantic_cli.py +0 -0
  35. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/sdk_utils.py +0 -0
  36. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/ssh_utils.py +0 -0
  37. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/cli/ui.py +0 -0
  38. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/__init__.py +0 -0
  39. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/agent_runtime_models.py +0 -0
  40. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/base.py +0 -0
  41. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/client.py +0 -0
  42. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/compute_validation.py +0 -0
  43. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  44. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  45. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  46. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  47. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/dtype_codec.py +0 -0
  48. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/exceptions.py +0 -0
  49. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/github_issues.py +0 -0
  50. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/metatables/__init__.py +0 -0
  51. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/metatables/core.py +0 -0
  52. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/models_foundry.py +0 -0
  53. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/models_helpers.py +0 -0
  54. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/models_user.py +0 -0
  55. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/observability.py +0 -0
  56. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/client/utils.py +0 -0
  57. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/code_repository_context.py +0 -0
  58. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/code_repository_skills.py +0 -0
  59. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/defaults.py +0 -0
  60. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/instrumentation/__init__.py +0 -0
  61. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/instrumentation/utils.py +0 -0
  62. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/logconf.py +0 -0
  63. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/__init__.py +0 -0
  64. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/__main__.py +0 -0
  65. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  66. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  67. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/future_registry.py +0 -0
  68. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/hashing.py +0 -0
  69. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  70. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  71. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/migrations/env.py +0 -0
  72. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/migrations/provider.py +0 -0
  73. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/migrations/registry.py +0 -0
  74. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  75. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  76. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  77. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  78. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  79. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/schema_names.py +0 -0
  80. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  81. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
  82. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
  83. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
  84. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
  85. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
  86. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
  87. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
  88. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
  89. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
  90. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/repository_identity_security.py +0 -0
  91. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/runtime_flags.py +0 -0
  92. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence/scaffold_skills.py +0 -0
  93. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence.egg-info/SOURCES.txt +0 -0
  94. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence.egg-info/dependency_links.txt +0 -0
  95. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence.egg-info/entry_points.txt +0 -0
  96. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence.egg-info/requires.txt +0 -0
  97. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/mainsequence.egg-info/top_level.txt +0 -0
  98. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/setup.cfg +0 -0
  99. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
  100. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_auth_precedence.py +0 -0
  101. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_canonical_api_route_contract.py +0 -0
  102. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_cli.py +0 -0
  103. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_cli_browser_auth.py +0 -0
  104. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_cli_migrations.py +0 -0
  105. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_client.py +0 -0
  106. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
  107. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_code_repository_branch_contract.py +0 -0
  108. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_code_repository_runtime_context.py +0 -0
  109. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_code_repository_skills.py +0 -0
  110. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_dependency_extras.py +0 -0
  111. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_dev_release_version.py +0 -0
  112. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_duckdb_interface_dimensions.py +0 -0
  113. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_environment_resource_context.py +0 -0
  114. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_environment_response_contracts.py +0 -0
  115. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_filter_normalization.py +0 -0
  116. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_github_issues_client.py +0 -0
  117. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_instrumentation.py +0 -0
  118. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_local_ops.py +0 -0
  119. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_logconf.py +0 -0
  120. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_meta_table_migrations.py +0 -0
  121. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_meta_tables_client_models.py +0 -0
  122. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  123. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_models_user_request_bound_auth.py +0 -0
  124. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_notification_uid_contract.py +0 -0
  125. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_observability_client.py +0 -0
  126. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_pod_project_resolution.py +0 -0
  127. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_scaffold_skills.py +0 -0
  128. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_schema_names.py +0 -0
  129. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_secret_client_model.py +0 -0
  130. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_source_table_configuration.py +0 -0
  131. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_sqlite_interface_dimensions.py +0 -0
  132. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_ssh_utils.py +0 -0
  133. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_time_index_table_access_dimension_audit.py +0 -0
  134. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_time_index_table_dimension_queries.py +0 -0
  135. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_time_index_table_update_configuration.py +0 -0
  136. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_time_index_table_update_configuration_client.py +0 -0
  137. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_time_index_table_update_flow.py +0 -0
  138. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_time_index_table_update_hard_cut.py +0 -0
  139. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_update_runner_uid_runtime.py +0 -0
  140. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_update_statistics.py +0 -0
  141. {mainsequence-8.1.20.dev3 → mainsequence-8.1.20.dev4}/tests/test_update_uid_guards.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.1.20.dev3
3
+ Version: 8.1.20.dev4
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -17,11 +17,16 @@ platform-managed application tables outside the migration workflow.
17
17
 
18
18
  ## Read First
19
19
 
20
- 1. `docs/tutorial/metatable_migrations.md`
21
- 2. `docs/knowledge/meta_tables/migrations.md`
22
- 3. `docs/knowledge/meta_tables/api.md`
23
- 4. `docs/adr/0020-metatable-migration-artifact-registry.md`
24
- 5. `docs/adr/0026-sdk-owned-migration-scaffolding.md`
20
+ 1. `docs/knowledge/meta_tables/migrations.md`
21
+ 2. `docs/knowledge/meta_tables/api.md`
22
+ 3. `docs/adr/0020-metatable-migration-artifact-registry.md`
23
+ 4. `docs/adr/0026-sdk-owned-migration-scaffolding.md`
24
+
25
+ `docs/knowledge/meta_tables/migrations.md` is the authoritative SDK reference for
26
+ provider behavior and migration contracts. The runnable beginner migration
27
+ walkthrough is maintained in the separate canonical tutorial CodeRepository at
28
+ <https://github.com/mainsequence-projects/mainsequence-sdk-tutorial>; read it
29
+ only when a runnable end-to-end example is needed.
25
30
 
26
31
  ## Required Decisions
27
32
 
@@ -49,15 +49,19 @@ If the user is still in the discovery process and does not yet know what data ex
49
49
 
50
50
  ## Read First
51
51
 
52
- 1. `docs/tutorial/working_with_meta_tables.md`
53
- 2. For migration work, use
52
+ 1. `docs/knowledge/meta_tables/index.md`
53
+ 2. `docs/knowledge/meta_tables/sqlalchemy.md`
54
+ 3. `docs/knowledge/meta_tables/compiled_sql.md`
55
+ 4. `docs/knowledge/meta_tables/migrations.md`
56
+ 5. `docs/knowledge/meta_tables/api.md`
57
+ 6. For migration work, use
54
58
  `.agents/skills/mainsequence/data_publishing/meta_table_migrations/SKILL.md`
55
- and `docs/tutorial/metatable_migrations.md`
56
- 3. `docs/knowledge/meta_tables/index.md`
57
- 4. `docs/knowledge/meta_tables/sqlalchemy.md`
58
- 5. `docs/knowledge/meta_tables/compiled_sql.md`
59
- 6. `docs/knowledge/meta_tables/migrations.md`
60
- 7. `docs/knowledge/meta_tables/api.md`
59
+
60
+ The knowledge pages above are the authoritative SDK reference for MetaTables.
61
+ The runnable beginner walkthrough is maintained in the separate canonical
62
+ tutorial CodeRepository at
63
+ <https://github.com/mainsequence-projects/mainsequence-sdk-tutorial>; read it
64
+ only when a runnable end-to-end example is needed.
61
65
 
62
66
  ## Inputs This Skill Needs
63
67
 
@@ -310,7 +314,7 @@ asset_meta_table = MetaTable.register(asset_request)
310
314
 
311
315
  When doing migration work, use
312
316
  `.agents/skills/mainsequence/data_publishing/meta_table_migrations/SKILL.md`
313
- and read `docs/tutorial/metatable_migrations.md`. The migration skill owns the
317
+ and read `docs/knowledge/meta_tables/migrations.md`. The migration skill owns the
314
318
  provider-based Alembic lifecycle.
315
319
 
316
320
  Do not apply in-place contract changes by changing a `PlatformManagedMetaTable`
@@ -61,11 +61,16 @@ This skill only reasons about access to deployed resources such as `ResourceRele
61
61
 
62
62
  ## Read First
63
63
 
64
- 1. `docs/tutorial/role_based_access_control.md`
65
- 2. `docs/knowledge/infrastructure/users_and_access.md`
66
- 3. `docs/knowledge/infrastructure/constants_and_secrets.md`
64
+ 1. `docs/knowledge/infrastructure/users_and_access.md`
65
+ 2. `docs/knowledge/infrastructure/constants_and_secrets.md`
67
66
 
68
- If the task is specifically about a resource type, also read the corresponding knowledge or tutorial page for that resource.
67
+ If the task is specifically about a resource type, also read the corresponding knowledge or CLI page for that resource.
68
+
69
+ The knowledge pages above are the authoritative SDK reference for access control
70
+ and sharing. The runnable beginner walkthrough is maintained in the separate
71
+ canonical tutorial CodeRepository at
72
+ <https://github.com/mainsequence-projects/mainsequence-sdk-tutorial>; read it
73
+ only when a runnable end-to-end example is needed.
69
74
 
70
75
  ## Inputs This Skill Needs
71
76
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.1.20.dev3
3
+ Version: 8.1.20.dev4
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "8.1.20.dev3"
7
+ version = "8.1.20.dev4"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -23,6 +23,14 @@ STREAMLIT_REMOVAL_LINK_PATHS = {
23
23
  Path("docs/SUMMARY.md"),
24
24
  Path("docs/index.md"),
25
25
  }
26
+ SKILL_ROOT = REPOSITORY_ROOT / "agent_scaffold" / "skills"
27
+ # Skills ship inside the wheel but reference repository documentation by its
28
+ # repository-relative path, so every referenced path must exist in the tree that
29
+ # produced the release.
30
+ SKILL_DOCUMENTATION_REFERENCE = re.compile(r"`(docs/[A-Za-z0-9_./-]+\.md)`")
31
+ # Skills are copied into a CodeRepository under `.agents/skills/<namespace>/`, so
32
+ # a cross-skill reference maps back to a shipped `agent_scaffold/skills` path.
33
+ SKILL_CROSS_REFERENCE = re.compile(r"`\.agents/skills/[A-Za-z0-9_]+/([A-Za-z0-9_./-]+/SKILL\.md)`")
26
34
  RETIRED_PUBLIC_IDENTIFIERS = {
27
35
  "project_context": re.compile(r"(?<![A-Za-z0-9_])project_context(?![A-Za-z0-9_])"),
28
36
  "project-context": re.compile(r"(?<![A-Za-z0-9_])project-context(?![A-Za-z0-9_])"),
@@ -46,6 +54,10 @@ RETIRED_PUBLIC_IDENTIFIERS = {
46
54
  }
47
55
 
48
56
 
57
+ def _skill_files() -> tuple[Path, ...]:
58
+ return tuple(sorted(SKILL_ROOT.rglob("SKILL.md")))
59
+
60
+
49
61
  def _documentation_files() -> tuple[Path, ...]:
50
62
  files = {REPOSITORY_ROOT / "README.md", REPOSITORY_ROOT / "CHANGELOG.md"}
51
63
  for root in DOCUMENTATION_ROOTS:
@@ -74,10 +86,7 @@ def test_current_documentation_excludes_retired_project_identifiers(path: Path)
74
86
 
75
87
  def test_code_repository_context_adr_describes_the_current_cutover() -> None:
76
88
  adr = (
77
- REPOSITORY_ROOT
78
- / "docs"
79
- / "adr"
80
- / "0031-process-lifetime-code-repository-branch-context.md"
89
+ REPOSITORY_ROOT / "docs" / "adr" / "0031-process-lifetime-code-repository-branch-context.md"
81
90
  ).read_text(encoding="utf-8")
82
91
 
83
92
  assert "get_code_repository_context()" in adr
@@ -121,3 +130,43 @@ def test_current_documentation_does_not_advertise_streamlit_support(path: Path)
121
130
  assert "streamlit" not in text.lower()
122
131
  assert "create_dashboard" not in text
123
132
  assert "delete_dashboard" not in text
133
+
134
+
135
+ @pytest.mark.parametrize(
136
+ "path",
137
+ _skill_files(),
138
+ ids=lambda path: str(path.relative_to(REPOSITORY_ROOT)),
139
+ )
140
+ def test_skill_documentation_references_resolve(path: Path) -> None:
141
+ relative_path = path.relative_to(REPOSITORY_ROOT)
142
+ text = path.read_text(encoding="utf-8")
143
+
144
+ missing = sorted(
145
+ {
146
+ reference
147
+ for reference in SKILL_DOCUMENTATION_REFERENCE.findall(text)
148
+ if not (REPOSITORY_ROOT / reference).is_file()
149
+ }
150
+ )
151
+
152
+ assert not missing, f"{relative_path} references documentation that does not exist: {missing}"
153
+
154
+
155
+ @pytest.mark.parametrize(
156
+ "path",
157
+ _skill_files(),
158
+ ids=lambda path: str(path.relative_to(REPOSITORY_ROOT)),
159
+ )
160
+ def test_skill_cross_references_resolve(path: Path) -> None:
161
+ relative_path = path.relative_to(REPOSITORY_ROOT)
162
+ text = path.read_text(encoding="utf-8")
163
+
164
+ missing = sorted(
165
+ {
166
+ reference
167
+ for reference in SKILL_CROSS_REFERENCE.findall(text)
168
+ if not (SKILL_ROOT / reference).is_file()
169
+ }
170
+ )
171
+
172
+ assert not missing, f"{relative_path} references skills that are not shipped: {missing}"