metaobjects 0.21.6__tar.gz → 0.22.0__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 (409) hide show
  1. {metaobjects-0.21.6 → metaobjects-0.22.0}/PKG-INFO +2 -2
  2. {metaobjects-0.21.6 → metaobjects-0.22.0}/pyproject.toml +1 -1
  3. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/core_types.py +176 -19
  4. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/errors.py +8 -0
  5. metaobjects-0.22.0/src/metaobjects/meta/core/requirement/meta_requirement.py +71 -0
  6. metaobjects-0.22.0/src/metaobjects/meta/core/requirement/requirement_constants.py +72 -0
  7. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/template/prompt_provider.py +28 -17
  8. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/registry.py +42 -0
  9. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/shared/base_types.py +1 -0
  10. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/__init__.py +1 -0
  11. metaobjects-0.22.0/src/metaobjects/spec_metamodel/prompt.json +99 -0
  12. metaobjects-0.22.0/src/metaobjects/spec_metamodel/requirement.json +140 -0
  13. metaobjects-0.22.0/src/metaobjects/spec_metamodel/template.json +295 -0
  14. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/conformance_adapter.py +4 -3
  15. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/fixture_discovery.py +9 -7
  16. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_fr010_loader_attrs.py +5 -3
  17. metaobjects-0.22.0/tests/unit/__init__.py +0 -0
  18. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_common_attrs.py +18 -2
  19. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_registry_extend.py +62 -0
  20. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_template_toolcall.py +5 -3
  21. {metaobjects-0.21.6 → metaobjects-0.22.0}/uv.lock +1 -1
  22. metaobjects-0.21.6/src/metaobjects/spec_metamodel/prompt.json +0 -77
  23. metaobjects-0.21.6/src/metaobjects/spec_metamodel/template.json +0 -31
  24. {metaobjects-0.21.6 → metaobjects-0.22.0}/.gitignore +0 -0
  25. {metaobjects-0.21.6 → metaobjects-0.22.0}/LICENSE +0 -0
  26. {metaobjects-0.21.6 → metaobjects-0.22.0}/README.md +0 -0
  27. {metaobjects-0.21.6 → metaobjects-0.22.0}/hatch_build.py +0 -0
  28. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/__init__.py +0 -0
  29. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/agent_context/__init__.py +0 -0
  30. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/agent_context/scaffold.py +0 -0
  31. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/__init__.py +0 -0
  32. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/api_model.py +0 -0
  33. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/builder.py +0 -0
  34. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/naming.py +0 -0
  35. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/paths.py +0 -0
  36. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/renderer.py +0 -0
  37. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/attr_class_map.py +0 -0
  38. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/cli.py +0 -0
  39. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
  40. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/__init__.py +0 -0
  41. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/collision_names.py +0 -0
  42. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/config.py +0 -0
  43. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/constants.py +0 -0
  44. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
  45. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
  46. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/format.py +0 -0
  47. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
  48. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generator.py +0 -0
  49. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generator_registry.py +0 -0
  50. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/__init__.py +0 -0
  51. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/entity_model.py +0 -0
  52. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
  53. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
  54. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
  55. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
  56. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
  57. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
  58. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -0
  59. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
  60. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/router_generator.py +0 -0
  61. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/template_generator.py +0 -0
  62. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
  63. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
  64. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/instance_artifacts.py +0 -0
  65. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/metaobjects-config.schema.json +0 -0
  66. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
  67. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/overwrite_policy.py +0 -0
  68. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/project_config.py +0 -0
  69. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/runner.py +0 -0
  70. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/runtime/__init__.py +0 -0
  71. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
  72. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
  73. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
  74. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
  75. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
  76. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/type_map.py +0 -0
  77. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/datatype.py +0 -0
  78. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/documentation/__init__.py +0 -0
  79. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/documentation/doc_constants.py +0 -0
  80. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/documentation/doc_provider.py +0 -0
  81. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/documentation/doc_schema.py +0 -0
  82. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/__init__.py +0 -0
  83. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/merge.py +0 -0
  84. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/meta_data_loader.py +0 -0
  85. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/registered_validation.py +0 -0
  86. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/__init__.py +0 -0
  87. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/directory_source.py +0 -0
  88. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/file_source.py +0 -0
  89. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
  90. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/uri_source.py +0 -0
  91. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_discriminator.py +0 -0
  92. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +0 -0
  93. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_field_readonly.py +0 -0
  94. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_source_escapes.py +0 -0
  95. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
  96. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
  97. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validation_passes.py +0 -0
  98. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/__init__.py +0 -0
  99. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/__init__.py +0 -0
  100. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/attr/__init__.py +0 -0
  101. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
  102. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
  103. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/field/__init__.py +0 -0
  104. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/field/field_constants.py +0 -0
  105. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/field/meta_field.py +0 -0
  106. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/identity/__init__.py +0 -0
  107. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
  108. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
  109. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/index/__init__.py +0 -0
  110. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/index/index_constants.py +0 -0
  111. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/index/meta_index.py +0 -0
  112. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/__init__.py +0 -0
  113. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/meta_object.py +0 -0
  114. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
  115. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
  116. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/object_constants.py +0 -0
  117. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/object_extract.py +0 -0
  118. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/value_object.py +0 -0
  119. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
  120. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
  121. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
  122. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
  123. {metaobjects-0.21.6/src/metaobjects/meta/core/validator → metaobjects-0.22.0/src/metaobjects/meta/core/requirement}/__init__.py +0 -0
  124. {metaobjects-0.21.6/src/metaobjects/meta/persistence → metaobjects-0.22.0/src/metaobjects/meta/core/validator}/__init__.py +0 -0
  125. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
  126. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/meta_data.py +0 -0
  127. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/meta_root.py +0 -0
  128. {metaobjects-0.21.6/src/metaobjects/meta/persistence/origin → metaobjects-0.22.0/src/metaobjects/meta/persistence}/__init__.py +0 -0
  129. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
  130. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
  131. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
  132. {metaobjects-0.21.6/src/metaobjects/meta/persistence/source → metaobjects-0.22.0/src/metaobjects/meta/persistence/origin}/__init__.py +0 -0
  133. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
  134. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
  135. {metaobjects-0.21.6/src/metaobjects/meta/presentation → metaobjects-0.22.0/src/metaobjects/meta/persistence/source}/__init__.py +0 -0
  136. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
  137. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
  138. {metaobjects-0.21.6/src/metaobjects/meta/presentation/layout → metaobjects-0.22.0/src/metaobjects/meta/presentation}/__init__.py +0 -0
  139. {metaobjects-0.21.6/src/metaobjects/meta/presentation/ui → metaobjects-0.22.0/src/metaobjects/meta/presentation/layout}/__init__.py +0 -0
  140. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
  141. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
  142. {metaobjects-0.21.6/src/metaobjects/meta/presentation/view → metaobjects-0.22.0/src/metaobjects/meta/presentation/ui}/__init__.py +0 -0
  143. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
  144. {metaobjects-0.21.6/src/metaobjects/meta/template → metaobjects-0.22.0/src/metaobjects/meta/presentation/view}/__init__.py +0 -0
  145. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
  146. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
  147. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/provider_extends.py +0 -0
  148. {metaobjects-0.21.6/src/metaobjects/shared → metaobjects-0.22.0/src/metaobjects/meta/template}/__init__.py +0 -0
  149. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/template/meta_template.py +0 -0
  150. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/template/template_constants.py +0 -0
  151. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/naming_refs.py +0 -0
  152. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/parser.py +0 -0
  153. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/parser_yaml.py +0 -0
  154. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/provider.py +0 -0
  155. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/py.typed +0 -0
  156. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/registry_manifest.py +0 -0
  157. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/__init__.py +0 -0
  158. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/email_document.py +0 -0
  159. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/escapers.py +0 -0
  160. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
  161. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/__init__.py +0 -0
  162. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/coerce.py +0 -0
  163. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/extract.py +0 -0
  164. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/extract_map.py +0 -0
  165. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
  166. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/locate.py +0 -0
  167. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/normalize.py +0 -0
  168. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/strip.py +0 -0
  169. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/types.py +0 -0
  170. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
  171. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/filesystem_provider.py +0 -0
  172. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/__init__.py +0 -0
  173. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
  174. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
  175. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/prompt_field.py +0 -0
  176. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
  177. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/prompt_style.py +0 -0
  178. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/renderer.py +0 -0
  179. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/verify.py +0 -0
  180. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/__init__.py +0 -0
  181. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/llm_recorder.py +0 -0
  182. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/n2m_resolver.py +0 -0
  183. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/object_manager.py +0 -0
  184. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/tph.py +0 -0
  185. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/serializer_json.py +0 -0
  186. {metaobjects-0.21.6/tests → metaobjects-0.22.0/src/metaobjects/shared}/__init__.py +0 -0
  187. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/shared/separators.py +0 -0
  188. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/shared/structural.py +0 -0
  189. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/__init__.py +0 -0
  190. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/error_source.py +0 -0
  191. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/json_path.py +0 -0
  192. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/semantic_diff.py +0 -0
  193. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/yaml_positions.py +0 -0
  194. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/attr.json +0 -0
  195. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/db.json +0 -0
  196. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/documentation.json +0 -0
  197. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/field.json +0 -0
  198. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/identity.json +0 -0
  199. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/index.json +0 -0
  200. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/layout.json +0 -0
  201. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/object.json +0 -0
  202. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/origin.json +0 -0
  203. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/relationship.json +0 -0
  204. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/source.json +0 -0
  205. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
  206. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/ui.json +0 -0
  207. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/validator.json +0 -0
  208. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/view.json +0 -0
  209. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/super_resolve.py +0 -0
  210. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/validation_types.py +0 -0
  211. {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/yaml_desugar.py +0 -0
  212. {metaobjects-0.21.6/tests/codegen → metaobjects-0.22.0/tests}/__init__.py +0 -0
  213. {metaobjects-0.21.6/tests/conformance → metaobjects-0.22.0/tests/codegen}/__init__.py +0 -0
  214. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
  215. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/extends/expected/Program.py +0 -0
  216. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/extends/meta.json +0 -0
  217. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
  218. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
  219. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/nested-array/meta.json +0 -0
  220. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
  221. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/scalars/expected/Report.py +0 -0
  222. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/scalars/meta.json +0 -0
  223. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
  224. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/vanilla/meta.json +0 -0
  225. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_abstract_conformance.py +0 -0
  226. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_api_docs_builder.py +0 -0
  227. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_api_docs_paths.py +0 -0
  228. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli.py +0 -0
  229. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_config_gen.py +0 -0
  230. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_config_verify.py +0 -0
  231. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_providers.py +0 -0
  232. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_registry.py +0 -0
  233. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_staleness_nudge.py +0 -0
  234. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_verify_strict.py +0 -0
  235. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_verify_subverbs.py +0 -0
  236. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_constants_config.py +0 -0
  237. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_entity_model.py +0 -0
  238. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_enum_conformance.py +0 -0
  239. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
  240. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_extract_tier_collision.py +0 -0
  241. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_extractor_generator.py +0 -0
  242. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_filter_allowlist_generator.py +0 -0
  243. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_format.py +0 -0
  244. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
  245. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_fr010_output_codegen.py +0 -0
  246. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
  247. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_generator.py +0 -0
  248. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_generator_extension_seams.py +0 -0
  249. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_golden.py +0 -0
  250. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
  251. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_inheritance_conformance.py +0 -0
  252. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_instance_artifacts.py +0 -0
  253. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_m2m_codegen.py +0 -0
  254. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_origin_nullability.py +0 -0
  255. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_output_parser_generator.py +0 -0
  256. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_overwrite_policy.py +0 -0
  257. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_payload_vo_generator.py +0 -0
  258. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_project_config.py +0 -0
  259. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_projection_compile.py +0 -0
  260. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_render_helper_conformance.py +0 -0
  261. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_render_helper_generator.py +0 -0
  262. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_reverse_finders.py +0 -0
  263. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_router_autoset.py +0 -0
  264. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_router_generator.py +0 -0
  265. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_runner.py +0 -0
  266. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_sourceless_projection.py +0 -0
  267. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_data.py +0 -0
  268. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_generator.py +0 -0
  269. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_output_pattern.py +0 -0
  270. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_scope_helpers.py +0 -0
  271. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_scope_walk.py +0 -0
  272. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_spec.py +0 -0
  273. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_tph_codegen.py +0 -0
  274. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_trace_helper_generator.py +0 -0
  275. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_type_map.py +0 -0
  276. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_validation_conformance.py +0 -0
  277. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_write_through.py +0 -0
  278. {metaobjects-0.21.6/tests/integration → metaobjects-0.22.0/tests/conformance}/__init__.py +0 -0
  279. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/capabilities.py +0 -0
  280. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/conformance-expected-failures.json +0 -0
  281. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/corpus.py +0 -0
  282. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/expected_failures.py +0 -0
  283. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/navigator.py +0 -0
  284. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
  285. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_conformance.py +0 -0
  286. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_extract_conformance.py +0 -0
  287. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_extract_object_verdict.py +0 -0
  288. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_fr011_attrs.py +0 -0
  289. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_generator_registry_conformance.py +0 -0
  290. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_object_model_conformance.py +0 -0
  291. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_provider_composition_conformance.py +0 -0
  292. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_registry_conformance.py +0 -0
  293. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_runner_hardfail.py +0 -0
  294. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_spec_metamodel_embed.py +0 -0
  295. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_strict_attr_load.py +0 -0
  296. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_template_codegen_conformance.py +0 -0
  297. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_template_generator_conformance.py +0 -0
  298. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_yaml_conformance.py +0 -0
  299. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
  300. {metaobjects-0.21.6/tests/loader → metaobjects-0.22.0/tests/integration}/__init__.py +0 -0
  301. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/api_contract_assertions.py +0 -0
  302. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/api_contract_jsonb_server.py +0 -0
  303. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/api_contract_m2m_server.py +0 -0
  304. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/api_contract_server.py +0 -0
  305. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/generated_jsonb_app.py +0 -0
  306. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/generated_m2m_app.py +0 -0
  307. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/generated_router_app.py +0 -0
  308. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/generated_tph_app.py +0 -0
  309. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/meta_ai_trace.yaml +0 -0
  310. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/normalization.py +0 -0
  311. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/postgres_container.py +0 -0
  312. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/query_runner.py +0 -0
  313. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/scenarios.py +0 -0
  314. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract.py +0 -0
  315. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_generated.py +0 -0
  316. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_jsonb.py +0 -0
  317. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_m2m.py +0 -0
  318. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_m2m_generated.py +0 -0
  319. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_tph_generated.py +0 -0
  320. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_generated_router_uuid_pk.py +0 -0
  321. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_llm_call_trace.py +0 -0
  322. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_normalization.py +0 -0
  323. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_query_scenarios.py +0 -0
  324. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_runtime_return_types.py +0 -0
  325. {metaobjects-0.21.6/tests/render → metaobjects-0.22.0/tests/loader}/__init__.py +0 -0
  326. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/loader/test_enum_extends_values_conflict.py +0 -0
  327. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/loader/test_template_payload_target_210.py +0 -0
  328. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/open_closed_proof_test.py +0 -0
  329. {metaobjects-0.21.6/tests/render/extract → metaobjects-0.22.0/tests/render}/__init__.py +0 -0
  330. {metaobjects-0.21.6/tests/render/prompt → metaobjects-0.22.0/tests/render/extract}/__init__.py +0 -0
  331. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_coerce.py +0 -0
  332. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_extract.py +0 -0
  333. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_extract_map.py +0 -0
  334. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_json_forgiving_reader.py +0 -0
  335. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_locate.py +0 -0
  336. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_model.py +0 -0
  337. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_normalize.py +0 -0
  338. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_strip.py +0 -0
  339. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
  340. {metaobjects-0.21.6/tests/source → metaobjects-0.22.0/tests/render/prompt}/__init__.py +0 -0
  341. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/prompt/test_output_format_renderer.py +0 -0
  342. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_email_document.py +0 -0
  343. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_filesystem_provider.py +0 -0
  344. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_output_format_renderer_nested.py +0 -0
  345. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_output_prompt_conformance.py +0 -0
  346. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_render_conformance.py +0 -0
  347. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_render_max_chars.py +0 -0
  348. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_verify.py +0 -0
  349. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_verify_conformance.py +0 -0
  350. {metaobjects-0.21.6/tests/unit → metaobjects-0.22.0/tests/source}/__init__.py +0 -0
  351. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_fr5c_merge_attribution.py +0 -0
  352. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_fr5d_reference_resolution.py +0 -0
  353. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_fr5e_database_source_shape.py +0 -0
  354. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_json_path.py +0 -0
  355. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_semantic_diff.py +0 -0
  356. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_source_on_node.py +0 -0
  357. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_yaml_positions.py +0 -0
  358. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/test_api_docs_accuracy.py +0 -0
  359. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_agent_context_staleness.py +0 -0
  360. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_capabilities.py +0 -0
  361. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_core_types.py +0 -0
  362. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_effective_package.py +0 -0
  363. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_errors.py +0 -0
  364. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_field_enum.py +0 -0
  365. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_field_map_validation.py +0 -0
  366. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
  367. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
  368. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_index_lookup.py +0 -0
  369. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_llm_recorder.py +0 -0
  370. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_loader.py +0 -0
  371. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_loader_bom.py +0 -0
  372. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_loader_class.py +0 -0
  373. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_merge.py +0 -0
  374. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_meta_attr.py +0 -0
  375. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_meta_data.py +0 -0
  376. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_meta_source.py +0 -0
  377. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_module_shortcuts.py +0 -0
  378. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_n2m_resolver.py +0 -0
  379. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_n2m_resolver_inherited.py +0 -0
  380. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
  381. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
  382. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_object_manager_write_through.py +0 -0
  383. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_one_primary_source.py +0 -0
  384. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_parser.py +0 -0
  385. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_parser_yaml.py +0 -0
  386. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_provider.py +0 -0
  387. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_provider_extension.py +0 -0
  388. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_registry.py +0 -0
  389. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_registry_completeness.py +0 -0
  390. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_registry_sealed.py +0 -0
  391. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_relationship_referential_actions.py +0 -0
  392. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_resolution_key.py +0 -0
  393. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
  394. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_serializer.py +0 -0
  395. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_shared_constants.py +0 -0
  396. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_smoke.py +0 -0
  397. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_source_escapes.py +0 -0
  398. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_sources.py +0 -0
  399. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_strict_child_placement.py +0 -0
  400. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_super_resolve.py +0 -0
  401. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
  402. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_attr_schema.py +0 -0
  403. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_filter_values.py +0 -0
  404. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_origin_195.py +0 -0
  405. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_origin_paths.py +0 -0
  406. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_sort_field.py +0 -0
  407. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_warnings.py +0 -0
  408. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_write_coercion_arrays.py +0 -0
  409. {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_yaml_desugar.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: metaobjects
3
- Version: 0.21.6
3
+ Version: 0.22.0
4
4
  Summary: Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port.
5
5
  Project-URL: Homepage, https://metaobjects.dev
6
6
  Project-URL: Repository, https://github.com/metaobjectsdev/metaobjects
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "metaobjects"
3
- version = "0.21.6"
3
+ version = "0.22.0"
4
4
  description = "Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -62,6 +62,19 @@ from .meta.core.object.object_constants import (
62
62
  OBJECT_SUBTYPES,
63
63
  )
64
64
  from .meta.core.relationship.meta_relationship import MetaRelationship
65
+ from .meta.core.requirement.meta_requirement import MetaRequirement
66
+ from .meta.core.requirement.requirement_constants import (
67
+ REQUIREMENT_ATTR_IMPLEMENTED_BY,
68
+ REQUIREMENT_ATTR_LEVEL,
69
+ REQUIREMENT_ATTR_STATEMENT,
70
+ REQUIREMENT_ATTR_STATUS,
71
+ REQUIREMENT_ATTR_SUPERSEDED_BY,
72
+ REQUIREMENT_ATTR_VERIFIED_BY,
73
+ REQUIREMENT_ATTR_VIOLATION,
74
+ REQUIREMENT_STATUSES,
75
+ REQUIREMENT_SUBTYPE_ARCHITECTURAL,
76
+ REQUIREMENT_SUBTYPE_FUNCTIONAL,
77
+ )
65
78
  from .meta.core.relationship.relationship_constants import (
66
79
  REFERENTIAL_ACTIONS,
67
80
  RELATIONSHIP_ATTR_CARDINALITY,
@@ -134,6 +147,7 @@ from .shared.base_types import (
134
147
  TYPE_OBJECT,
135
148
  TYPE_ORIGIN,
136
149
  TYPE_RELATIONSHIP,
150
+ TYPE_REQUIREMENT,
137
151
  TYPE_SOURCE,
138
152
  TYPE_TEMPLATE,
139
153
  TYPE_VALIDATOR,
@@ -186,8 +200,9 @@ def _register_subtypes(
186
200
  # NOT declared in any spec/metamodel/*.json provider file; both this port and the TS
187
201
  # reference HAND-CODE the root (the single documented hand-coded exception to the
188
202
  # JSON-sourced model). Its STRUCTURAL children must byte-match the cross-port golden:
189
- # description "Root metadata document" and EXACTLY the four genuinely-open structural
190
- # wildcards a document root legitimately holds — field / object / template / validator
203
+ # description "Root metadata document" and EXACTLY the five genuinely-open structural
204
+ # wildcards a document root legitimately holds — field / object / requirement /
205
+ # template / validator
191
206
  # (mirrors the TS core-types.ts root def and the Java MetaRoot registration). Because
192
207
  # it is undeclared in the JSON, the strict-children pass leaves it untouched, so the
193
208
  # children registered HERE are emitted verbatim. The any-attr wildcard is intentionally
@@ -201,6 +216,8 @@ core_provider.add(
201
216
  child_rules=[
202
217
  ChildRule(TYPE_FIELD, "*"),
203
218
  ChildRule(TYPE_OBJECT, "*"),
219
+ # Capability requirements are declared beside the entities they describe.
220
+ ChildRule(TYPE_REQUIREMENT, "*"),
204
221
  ChildRule(TYPE_TEMPLATE, "*"),
205
222
  ChildRule(TYPE_VALIDATOR, "*"),
206
223
  ],
@@ -545,6 +562,75 @@ for _idx_sub in INDEX_SUBTYPES:
545
562
  )
546
563
  )
547
564
 
565
+ # requirement.* (functional, architectural) — the capability ledger IS a metadata
566
+ # model (requirements-as-metadata ruling, amendment 3), so it is registered
567
+ # vocabulary rather than a hand-parsed side file: @status is an allowedValues enum
568
+ # the LOADER refuses a typo on. The axis is CHECK POLARITY, a genuine behaviour
569
+ # difference (ADR-0037 §2): `functional` is checked by EXISTENCE (nothing
570
+ # implements it -> fail), `architectural` by UNIVERSALITY (something violates it
571
+ # -> fail). Architectural carries no @level and no @verifiedBy — levels come from
572
+ # object-in-focus decomposition and an architectural requirement is
573
+ # object-independent by definition.
574
+ #
575
+ # Hierarchy is NESTING, not a parent attr: requirement.functional admits nested
576
+ # requirement children (the strict graph in spec/metamodel/requirement.json, which
577
+ # _apply_strict_structural_children re-derives onto this registration).
578
+ #
579
+ # @implementedBy is deliberately NOT declared as a loader `references` descriptor.
580
+ # That pass always ERRORS on an unresolved target, and a requirement with status
581
+ # `abandoned`/`superseded` exists precisely to name nodes that are GONE — declaring
582
+ # it here would make those entries fail to load. The loader owns what is
583
+ # unconditional; `verify` owns @implementedBy resolution, whose severity depends on
584
+ # @status.
585
+ _REQUIREMENT_COMMON_ATTRS = [
586
+ AttrSchema(
587
+ name=REQUIREMENT_ATTR_STATUS,
588
+ value_type=ATTR_SUBTYPE_STRING,
589
+ required=True,
590
+ allowed_values=REQUIREMENT_STATUSES,
591
+ ),
592
+ AttrSchema(name=REQUIREMENT_ATTR_STATEMENT, value_type=ATTR_SUBTYPE_STRING, required=True),
593
+ AttrSchema(name=REQUIREMENT_ATTR_VIOLATION, value_type=ATTR_SUBTYPE_STRING, required=True),
594
+ AttrSchema(
595
+ name=REQUIREMENT_ATTR_IMPLEMENTED_BY,
596
+ value_type=ATTR_SUBTYPE_STRING,
597
+ required=False,
598
+ is_array=True,
599
+ ),
600
+ AttrSchema(name=REQUIREMENT_ATTR_SUPERSEDED_BY, value_type=ATTR_SUBTYPE_STRING, required=False),
601
+ ]
602
+ core_provider.add(
603
+ TypeDefinition(
604
+ type=TYPE_REQUIREMENT,
605
+ sub_type=REQUIREMENT_SUBTYPE_FUNCTIONAL,
606
+ factory=MetaRequirement,
607
+ attrs=[
608
+ AttrSchema(name=REQUIREMENT_ATTR_LEVEL, value_type=ATTR_SUBTYPE_INT, required=True),
609
+ *_REQUIREMENT_COMMON_ATTRS,
610
+ AttrSchema(
611
+ name=REQUIREMENT_ATTR_VERIFIED_BY,
612
+ value_type=ATTR_SUBTYPE_STRING,
613
+ required=False,
614
+ is_array=True,
615
+ ),
616
+ ],
617
+ child_rules=[
618
+ ChildRule(TYPE_ATTR, "*"),
619
+ # Hierarchy IS nesting — an L1 solution contains its L2 segments.
620
+ ChildRule(TYPE_REQUIREMENT, "*"),
621
+ ],
622
+ )
623
+ )
624
+ core_provider.add(
625
+ TypeDefinition(
626
+ type=TYPE_REQUIREMENT,
627
+ sub_type=REQUIREMENT_SUBTYPE_ARCHITECTURAL,
628
+ factory=MetaRequirement,
629
+ attrs=list(_REQUIREMENT_COMMON_ATTRS),
630
+ child_rules=[ChildRule(TYPE_ATTR, "*")],
631
+ )
632
+ )
633
+
548
634
  # relationship.* (base, association, aggregation, composition).
549
635
  # @onDelete / @onUpdate are validated against REFERENTIAL_ACTIONS — kebab-case
550
636
  # values (cascade / set-null / restrict / no-action). Defaults derive from the
@@ -825,26 +911,94 @@ for _sub, _attrs in _VALIDATOR_ATTRS_BY_SUBTYPE.items():
825
911
  )
826
912
  )
827
913
 
828
- # template.* (FR-004) — base + prompt + output + toolcall. FR-033 — core registers
829
- # the four template TYPES (a single MetaTemplate backs every subtype; validation in
830
- # validation_passes.py) but carries NO own per-subtype attrs. The full per-subtype
831
- # template attr vocabulary (@payloadRef / @textRef / @format / @maxChars / @kind /
832
- # @promptStyle / @toolName / @responseRef / …) is re-homed to the prompt domain
833
- # provider (`prompt_provider`, metaobjects-prompt) via TypeRegistry.extend
834
- # (prompt.json declares them on template.prompt / output / toolcall), matching the TS
835
- # core-types→promptProvider split (where the template type is also attr-free in core).
836
- for _tmpl_sub in (
837
- SUBTYPE_BASE,
838
- tc.TEMPLATE_SUBTYPE_OUTPUT,
839
- tc.TEMPLATE_SUBTYPE_PROMPT,
840
- tc.TEMPLATE_SUBTYPE_TOOLCALL,
841
- ):
914
+ # template.* (FR-004) — base + prompt + output + toolcall. A single MetaTemplate
915
+ # node class backs every subtype (validation lives in validation_passes.py); the
916
+ # per-subtype attr vocabulary is registered HERE, WITH the type, in core — not in
917
+ # the prompt domain provider (`prompt_provider`, metaobjects-prompt).
918
+ #
919
+ # Supersedes the prior FR-033 S2 homing, which put every template.* attr —
920
+ # including the REQUIRED @payloadRef / @toolName — in prompt_provider. That made a
921
+ # core type's validity depend on an OPTIONAL provider: compose coreProviders
922
+ # without metaobjects-prompt and template.prompt stayed "registered" with zero
923
+ # attrs, so the required-attr rule silently stopped firing (invalid metadata —
924
+ # e.g. a template.prompt with no @payloadRef — loaded clean instead of erroring).
925
+ #
926
+ # THE RULE this corrects (ADR-0011 / FR-004): an attr the type is invalid or not
927
+ # meaningfully itself without ("own") registers WITH the type, in a provider that
928
+ # is always composed, never optional. An attr PROJECTING a different concern onto
929
+ # a type that is complete without it ("projected") registers in the concern
930
+ # provider and MUST stay optional — e.g. prompt.json's @xmlText/@example on every
931
+ # field, @enumAlias on field.enum, @normalize on object.value; see
932
+ # prompt_provider.py. template.base carries no attrs of its own (matches Java and
933
+ # the cross-port canonical); the concrete subtypes below add their reference +
934
+ # governance attrs exactly per spec/metamodel/template.json's "types" blocks.
935
+ _TEMPLATE_GOVERNANCE_ATTRS = [
936
+ AttrSchema(name=tc.TEMPLATE_ATTR_OWNER, value_type=ATTR_SUBTYPE_STRING),
937
+ AttrSchema(name=tc.TEMPLATE_ATTR_SINCE, value_type=ATTR_SUBTYPE_STRING),
938
+ ]
939
+ _TEMPLATE_ATTRS_BY_SUBTYPE: dict[str, list[AttrSchema]] = {
940
+ SUBTYPE_BASE: [],
941
+ tc.TEMPLATE_SUBTYPE_PROMPT: [
942
+ AttrSchema(name=tc.TEMPLATE_ATTR_PAYLOAD_REF, value_type=ATTR_SUBTYPE_STRING, required=True),
943
+ AttrSchema(name=tc.TEMPLATE_ATTR_TEXT_REF, value_type=ATTR_SUBTYPE_STRING),
944
+ AttrSchema(
945
+ name=tc.TEMPLATE_ATTR_FORMAT,
946
+ value_type=ATTR_SUBTYPE_STRING,
947
+ default=tc.TEMPLATE_FORMAT_DEFAULT,
948
+ allowed_values=tc.ALLOWED_FORMATS,
949
+ ),
950
+ AttrSchema(name=tc.TEMPLATE_ATTR_MAX_CHARS, value_type=ATTR_SUBTYPE_INT),
951
+ *_TEMPLATE_GOVERNANCE_ATTRS,
952
+ AttrSchema(name=tc.TEMPLATE_ATTR_REQUIRED_TAGS, value_type=ATTR_SUBTYPE_STRING, is_array=True),
953
+ AttrSchema(name=tc.TEMPLATE_ATTR_MAX_TOKENS, value_type=ATTR_SUBTYPE_INT),
954
+ AttrSchema(name=tc.TEMPLATE_ATTR_REQUIRED_SLOTS, value_type=ATTR_SUBTYPE_STRING, is_array=True),
955
+ AttrSchema(name=tc.TEMPLATE_ATTR_MODEL, value_type=ATTR_SUBTYPE_STRING),
956
+ AttrSchema(name=tc.TEMPLATE_ATTR_RESPONSE_REF, value_type=ATTR_SUBTYPE_STRING),
957
+ ],
958
+ tc.TEMPLATE_SUBTYPE_OUTPUT: [
959
+ AttrSchema(name=tc.TEMPLATE_ATTR_PAYLOAD_REF, value_type=ATTR_SUBTYPE_STRING, required=True),
960
+ AttrSchema(name=tc.TEMPLATE_ATTR_TEXT_REF, value_type=ATTR_SUBTYPE_STRING),
961
+ AttrSchema(
962
+ name=tc.TEMPLATE_ATTR_FORMAT,
963
+ value_type=ATTR_SUBTYPE_STRING,
964
+ default=tc.TEMPLATE_FORMAT_DEFAULT,
965
+ allowed_values=tc.ALLOWED_FORMATS,
966
+ ),
967
+ AttrSchema(name=tc.TEMPLATE_ATTR_MAX_CHARS, value_type=ATTR_SUBTYPE_INT),
968
+ *_TEMPLATE_GOVERNANCE_ATTRS,
969
+ AttrSchema(name=tc.TEMPLATE_ATTR_REQUIRED_TAGS, value_type=ATTR_SUBTYPE_STRING, is_array=True),
970
+ AttrSchema(
971
+ name=tc.TEMPLATE_ATTR_PROMPT_STYLE,
972
+ value_type=ATTR_SUBTYPE_STRING,
973
+ default=tc.PROMPT_STYLE_DEFAULT,
974
+ allowed_values=tc.PROMPT_STYLES,
975
+ ),
976
+ AttrSchema(
977
+ name=tc.TEMPLATE_ATTR_KIND,
978
+ value_type=ATTR_SUBTYPE_STRING,
979
+ default=tc.TEMPLATE_KIND_DEFAULT,
980
+ allowed_values=tc.ALLOWED_KINDS,
981
+ ),
982
+ AttrSchema(name=tc.TEMPLATE_ATTR_SUBJECT_REF, value_type=ATTR_SUBTYPE_STRING),
983
+ AttrSchema(name=tc.TEMPLATE_ATTR_HTML_BODY_REF, value_type=ATTR_SUBTYPE_STRING),
984
+ AttrSchema(name=tc.TEMPLATE_ATTR_TEXT_BODY_REF, value_type=ATTR_SUBTYPE_STRING),
985
+ ],
986
+ tc.TEMPLATE_SUBTYPE_TOOLCALL: [
987
+ # Does NOT inherit the generic prompt/output reference attrs — its own
988
+ # minimal set (ADR-0011): no renderable text body, so no @textRef/@format.
989
+ AttrSchema(name=tc.TEMPLATE_ATTR_TOOL_NAME, value_type=ATTR_SUBTYPE_STRING, required=True),
990
+ AttrSchema(name=tc.TEMPLATE_ATTR_PAYLOAD_REF, value_type=ATTR_SUBTYPE_STRING, required=True),
991
+ *_TEMPLATE_GOVERNANCE_ATTRS,
992
+ AttrSchema(name=tc.TEMPLATE_ATTR_MAX_TOKENS, value_type=ATTR_SUBTYPE_INT),
993
+ ],
994
+ }
995
+ for _tmpl_sub, _tmpl_attrs in _TEMPLATE_ATTRS_BY_SUBTYPE.items():
842
996
  core_provider.add(
843
997
  TypeDefinition(
844
998
  type=TYPE_TEMPLATE,
845
999
  sub_type=_tmpl_sub,
846
1000
  factory=MetaTemplate,
847
- attrs=[],
1001
+ attrs=list(_tmpl_attrs),
848
1002
  child_rules=[ChildRule(TYPE_ATTR, "*")],
849
1003
  )
850
1004
  )
@@ -859,8 +1013,11 @@ for _tmpl_sub in (
859
1013
  # domain (`prompt_provider`) and UI / query-surface domain (`ui_provider`) then
860
1014
  # EXTEND the core types via TypeRegistry.extend, and the documentation provider adds
861
1015
  # the common doc attrs. FR-033 re-homed the field's filter/sort/teaching/extract +
862
- # view/layout + template attrs out of core into ui/prompt; the composed set is
863
- # unchanged. Spread to add more: `[*core_providers, my_provider]`.
1016
+ # view/layout attrs out of core into ui/prompt (all OPTIONAL vocabulary on types
1017
+ # that stay complete without them); template.* attrs are OWN and stay registered
1018
+ # with the type in core (see the template.* block above) — dropping a concern
1019
+ # provider must never invalidate a type another provider registers. The composed
1020
+ # set is unchanged. Spread to add more: `[*core_providers, my_provider]`.
864
1021
  # ---------------------------------------------------------------------------
865
1022
  from .meta.persistence.db.db_provider import db_provider # noqa: E402
866
1023
  from .meta.template.prompt_provider import prompt_provider # noqa: E402
@@ -41,6 +41,14 @@ class ErrorCode(str, Enum):
41
41
  ERR_PROVIDER_DUPLICATE_ID = "ERR_PROVIDER_DUPLICATE_ID"
42
42
  ERR_PROVIDER_MISSING_DEPENDENCY = "ERR_PROVIDER_MISSING_DEPENDENCY"
43
43
  ERR_PROVIDER_ATTR_CONFLICT = "ERR_PROVIDER_ATTR_CONFLICT"
44
+ # ADR-0050: a provider tried to PROJECT a REQUIRED attribute onto a type it does
45
+ # not own (via TypeRegistry.extend). Projection is optional-only — a required
46
+ # attr registered this way disappears silently whenever that provider is
47
+ # composed out, taking its required-attr validation rule with it. This is
48
+ # exactly how FR-033 broke template.*'s @payloadRef/@toolName in all five
49
+ # ports. If an attr is genuinely required it is OWN: declare it with the type,
50
+ # in the type's own provider.
51
+ ERR_EXTEND_REQUIRED_ATTR = "ERR_EXTEND_REQUIRED_ATTR"
44
52
  ERR_SUBTYPE_RULE_VIOLATION = "ERR_SUBTYPE_RULE_VIOLATION"
45
53
  ERR_OVERLAY_NO_TARGET = "ERR_OVERLAY_NO_TARGET"
46
54
  # FR5c — two contributing files set the same @attr to different non-empty
@@ -0,0 +1,71 @@
1
+ """MetaRequirement — concrete node class for type=requirement nodes.
2
+
3
+ Extends MetaData directly: no model wrapper, no indirection. Accessors are
4
+ RESOLVING (ADR-0039) so a requirement that ``extends`` an abstract parent
5
+ inherits its properties — note the Python naming inversion: ``attr()`` is
6
+ OWN-ONLY here, so every read below goes through ``get_meta_attr()``.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from ...meta_data import MetaData
11
+ from .requirement_constants import (
12
+ REQUIREMENT_ATTR_IMPLEMENTED_BY,
13
+ REQUIREMENT_ATTR_LEVEL,
14
+ REQUIREMENT_ATTR_STATUS,
15
+ REQUIREMENT_ATTR_VERIFIED_BY,
16
+ REQUIREMENT_LINK_FLOOR_LEVEL,
17
+ REQUIREMENT_STATUSES_REQUIRING_LIVE_NODES,
18
+ REQUIREMENT_SUBTYPE_ARCHITECTURAL,
19
+ REQUIREMENT_SUBTYPE_FUNCTIONAL,
20
+ )
21
+
22
+
23
+ class MetaRequirement(MetaData):
24
+ def is_functional(self) -> bool:
25
+ """What the product does for a user — checked by EXISTENCE."""
26
+ return self.sub_type == REQUIREMENT_SUBTYPE_FUNCTIONAL
27
+
28
+ def is_architectural(self) -> bool:
29
+ """How the system is built — checked by UNIVERSALITY (the opposite polarity)."""
30
+ return self.sub_type == REQUIREMENT_SUBTYPE_ARCHITECTURAL
31
+
32
+ def level(self) -> int | None:
33
+ """ADR-0039: resolving. 1 solution · 2 segment · 3 service · 4 object ·
34
+ 5 member. Architectural requirements carry none — they are
35
+ object-independent by definition."""
36
+ v = self.get_meta_attr(REQUIREMENT_ATTR_LEVEL)
37
+ return v if isinstance(v, int) and not isinstance(v, bool) else None
38
+
39
+ def status(self) -> str | None:
40
+ """ADR-0039: resolving. One of REQUIREMENT_STATUSES (a closed enum the
41
+ registry enforces via allowed_values)."""
42
+ v = self.get_meta_attr(REQUIREMENT_ATTR_STATUS)
43
+ return v if isinstance(v, str) else None
44
+
45
+ def implemented_by(self) -> list[str]:
46
+ """ADR-0039: resolving. FQN references to the model nodes realising this
47
+ requirement (many-to-many by construction)."""
48
+ v = self.get_meta_attr(REQUIREMENT_ATTR_IMPLEMENTED_BY)
49
+ return [str(x) for x in v] if isinstance(v, list) else []
50
+
51
+ def verified_by(self) -> list[str]:
52
+ """ADR-0039: resolving. Names of the tests proving the behaviour."""
53
+ v = self.get_meta_attr(REQUIREMENT_ATTR_VERIFIED_BY)
54
+ return [str(x) for x in v] if isinstance(v, list) else []
55
+
56
+ def may_reference_model(self) -> bool:
57
+ """True when this requirement is permitted to reference the model at all.
58
+ Architectural requirements always may (their claim set is the point);
59
+ functional ones only at or below the link floor, so the organisational
60
+ tiers stay organisational."""
61
+ if self.is_architectural():
62
+ return True
63
+ lvl = self.level()
64
+ return lvl is not None and lvl >= REQUIREMENT_LINK_FLOOR_LEVEL
65
+
66
+ def requires_live_nodes(self) -> bool:
67
+ """True when a dangling ``@implementedBy`` is an ERROR rather than
68
+ expected. An abandoned or superseded requirement's nodes are supposed to
69
+ be gone."""
70
+ s = self.status()
71
+ return s is not None and s in REQUIREMENT_STATUSES_REQUIRING_LIVE_NODES
@@ -0,0 +1,72 @@
1
+ """Requirement subtype + attr vocabulary.
2
+
3
+ ``requirement.*`` is REGISTERED metamodel vocabulary (requirements-as-metadata
4
+ ruling, amendment 3): the capability ledger IS a metadata model, so it is
5
+ declared in ``metaobjects/`` beside the entities it describes and validated by
6
+ the loader like everything else — never hand-parsed from a side file.
7
+ """
8
+
9
+ # ---------------------------------------------------------------------------
10
+ # Subtypes — the axis is the CHECK POLARITY, a genuine behaviour difference and
11
+ # therefore a subtype under ADR-0037 §2:
12
+ # functional -> EXISTENCE: fails when nothing implements it
13
+ # architectural -> UNIVERSALITY: fails when something violates it
14
+ # ---------------------------------------------------------------------------
15
+ REQUIREMENT_SUBTYPE_FUNCTIONAL = "functional"
16
+ REQUIREMENT_SUBTYPE_ARCHITECTURAL = "architectural"
17
+
18
+ REQUIREMENT_SUBTYPES = (
19
+ REQUIREMENT_SUBTYPE_FUNCTIONAL,
20
+ REQUIREMENT_SUBTYPE_ARCHITECTURAL,
21
+ )
22
+
23
+ # ---------------------------------------------------------------------------
24
+ # Attrs
25
+ # ---------------------------------------------------------------------------
26
+ #: 1 solution · 2 segment (app/library) · 3 service · 4 object · 5 member.
27
+ REQUIREMENT_ATTR_LEVEL = "level"
28
+ REQUIREMENT_ATTR_STATUS = "status"
29
+ REQUIREMENT_ATTR_STATEMENT = "statement"
30
+ REQUIREMENT_ATTR_VIOLATION = "violation"
31
+ REQUIREMENT_ATTR_IMPLEMENTED_BY = "implementedBy"
32
+ REQUIREMENT_ATTR_VERIFIED_BY = "verifiedBy"
33
+ REQUIREMENT_ATTR_SUPERSEDED_BY = "supersededBy"
34
+
35
+ # ---------------------------------------------------------------------------
36
+ # Status — a closed enum, enforced by the registry via allowed_values.
37
+ # ---------------------------------------------------------------------------
38
+ REQUIREMENT_STATUS_LIVE = "live"
39
+ REQUIREMENT_STATUS_PARTIAL = "partial"
40
+ REQUIREMENT_STATUS_ABANDONED = "abandoned"
41
+ REQUIREMENT_STATUS_SUPERSEDED = "superseded"
42
+
43
+ REQUIREMENT_STATUSES = (
44
+ REQUIREMENT_STATUS_LIVE,
45
+ REQUIREMENT_STATUS_PARTIAL,
46
+ REQUIREMENT_STATUS_ABANDONED,
47
+ REQUIREMENT_STATUS_SUPERSEDED,
48
+ )
49
+
50
+ #: Statuses whose implementing nodes are supposed to still exist. A dangling
51
+ #: ``@implementedBy`` on one of these means the model moved and the requirement
52
+ #: is stale; on the other two the nodes are supposed to be GONE, which is the
53
+ #: whole point of the entry. The asymmetry inverts as a pair.
54
+ REQUIREMENT_STATUSES_REQUIRING_LIVE_NODES = (
55
+ REQUIREMENT_STATUS_LIVE,
56
+ REQUIREMENT_STATUS_PARTIAL,
57
+ )
58
+
59
+ # ---------------------------------------------------------------------------
60
+ # Levels — organisational above the link floor, model-referencing at or below.
61
+ # ---------------------------------------------------------------------------
62
+ REQUIREMENT_LEVEL_SOLUTION = 1
63
+ REQUIREMENT_LEVEL_SEGMENT = 2
64
+ REQUIREMENT_LEVEL_SERVICE = 3
65
+ REQUIREMENT_LEVEL_OBJECT = 4
66
+ REQUIREMENT_LEVEL_MEMBER = 5
67
+
68
+ #: The lowest level that may reference the model. L1-L3 are organisational and
69
+ #: carrying ``@implementedBy`` there is an error.
70
+ REQUIREMENT_LINK_FLOOR_LEVEL = REQUIREMENT_LEVEL_OBJECT
71
+ REQUIREMENT_MIN_LEVEL = REQUIREMENT_LEVEL_SOLUTION
72
+ REQUIREMENT_MAX_LEVEL = REQUIREMENT_LEVEL_MEMBER
@@ -2,23 +2,33 @@
2
2
  (cross-port ``metaobjects-prompt``; FR-004 / FR-006 / FR-010 / FR-011).
3
3
 
4
4
  EXTENDS the core-registered types with the prompt / AI-domain markers that are
5
- NOT core properties:
5
+ NOT core properties — every one of them PROJECTED and OPTIONAL, onto a type that
6
+ stays complete without it:
6
7
  - every field subtype: ``@xmlText`` (XML text-content extract), ``@example``,
7
8
  ``@instruction`` (FR-010 field-teaching prompt fragment);
8
9
  - ``field.enum`` only: ``@enumAlias`` / ``@enumDoc`` / ``@coerceDefault`` /
9
10
  ``@normalize`` (FR-010 / FR-011 tolerant-extract overlays);
10
11
  - ``object.value`` only: ``@normalize`` (the object-level default normalization
11
- mode for its enum fields' tolerant extract);
12
- - ``template.prompt`` / ``template.output`` / ``template.toolcall``: the full
13
- per-subtype template attr vocabulary (``@payloadRef`` / ``@textRef`` /
14
- ``@format`` / ``@maxChars`` / ``@kind`` / ``@promptStyle`` / ``@toolName`` / …).
15
-
16
- These were previously registered in ``core_types`` (the field / object / template
17
- attrs) and ``template_provider`` (``@xmlText``); FR-033 re-homes them all here to
18
- match the TS provider split (``promptProvider`` renamed from ``templateProvider``),
19
- the C# ``PromptMetaDataProvider``, and Java's prompt concern provider. The attrs +
20
- their value-types / required-ness / allowed-values / defaults are DATA — read from
21
- the embedded ``spec/metamodel/prompt.json`` (single-sourced, never hand-copied) via
12
+ mode for its enum fields' tolerant extract).
13
+
14
+ The ``template.prompt`` / ``template.output`` / ``template.toolcall`` attr
15
+ vocabulary (``@payloadRef`` / ``@textRef`` / ``@format`` / ``@toolName`` / …) does
16
+ **NOT** live here. FR-033 originally re-homed it to this provider, including the
17
+ REQUIRED ``@payloadRef`` / ``@toolName`` — that made a core type's validity depend
18
+ on an optional provider: compose ``core_providers`` without ``metaobjects-prompt``
19
+ and ``template.prompt`` stayed "registered" with zero attrs, so the required-attr
20
+ rule silently stopped firing. Those attrs are OWN (the type is invalid without
21
+ them) and now register WITH the type in ``core_types.py``, always — see the
22
+ ``template.*`` block there. Only genuinely OPTIONAL projections belong in a
23
+ concern provider; this module's remaining attrs (above) all satisfy that.
24
+
25
+ ``@xmlText`` was previously registered in ``template_provider``; the rest of this
26
+ module's attrs were previously registered in ``core_types`` (the field / object
27
+ attrs). FR-033 re-homed them here to match the TS provider split (``promptProvider``
28
+ renamed from ``templateProvider``), the C# ``PromptMetaDataProvider``, and Java's
29
+ prompt concern provider. The attrs + their value-types / required-ness /
30
+ allowed-values / defaults are DATA — read from the embedded
31
+ ``spec/metamodel/prompt.json`` (single-sourced, never hand-copied) via
22
32
  :func:`load_provider_extends`. The composed registry is UNCHANGED (the manifest is
23
33
  provider-agnostic) — this only moves WHICH provider registers each attr.
24
34
 
@@ -35,11 +45,12 @@ from ...shared.base_types import TYPE_FIELD
35
45
  from ..core.field import field_constants as fc
36
46
 
37
47
  # The prompt.json ``extends`` directives apply to ``field.*`` (every field subtype),
38
- # ``field.enum``, ``object.value`` and the three concrete ``template.*`` subtypes.
39
- # register_extends() expands the ``"*"`` field subtype to every concrete field
40
- # subtype (the shared FIELD_SUBTYPES tuple — which excludes ``enum`` — PLUS
41
- # ``field.enum``), mirroring db_provider / the prior template_provider, so the
42
- # field-teaching + serialization markers reach every field including enum.
48
+ # ``field.enum`` and ``object.value`` — the template.* attrs are OWN (registered in
49
+ # core_types.py, not here; see this module's docstring). register_extends()
50
+ # expands the ``"*"`` field subtype to every concrete field subtype (the shared
51
+ # FIELD_SUBTYPES tuple — which excludes ``enum`` — PLUS ``field.enum``), mirroring
52
+ # db_provider, so the field-teaching + serialization markers reach every field
53
+ # including enum.
43
54
  _FIELD_SUBTYPES: tuple[str, ...] = (*fc.FIELD_SUBTYPES, fc.FIELD_SUBTYPE_ENUM)
44
55
 
45
56
  #: The embedded shared provider-definition file this provider sources its attrs from.
@@ -216,6 +216,20 @@ class TypeRegistry:
216
216
  """
217
217
  self._check_not_sealed("register_common_attrs")
218
218
  for attr in attrs:
219
+ # ADR-0050, the second door. A common attr is projected onto EVERY registered
220
+ # type, so a required one is the same defect as a required extend() -- with the
221
+ # widest possible blast radius: drop the provider and every type silently loses
222
+ # a required-attr rule. Java is immune by construction (its
223
+ # registerCommonAttribute takes no required parameter); AttrSchema carries
224
+ # `required`, so this port needs the explicit guard.
225
+ if attr.required:
226
+ raise ParseError(
227
+ f'TypeRegistry.register_common_attrs: attribute "{attr.name}" is '
228
+ "REQUIRED. A common attr is projected onto every registered type, so a "
229
+ "required one would vanish from all of them whenever its provider is "
230
+ "composed out. Common attrs must be optional (ADR-0050).",
231
+ ErrorCode.ERR_EXTEND_REQUIRED_ATTR,
232
+ )
219
233
  if any(existing.name == attr.name for existing in self._common_attrs):
220
234
  continue # first registration wins
221
235
  self._common_attrs.append(attr)
@@ -261,6 +275,17 @@ class TypeRegistry:
261
275
  :raises ParseError: ``ERR_PROVIDER_ATTR_CONFLICT`` if an attribute
262
276
  name already exists on the type (own-only check — common-attr
263
277
  collisions are still surfaced separately at validation time).
278
+ :raises ParseError: ``ERR_EXTEND_REQUIRED_ATTR`` if an attribute being
279
+ added is ``required`` (ADR-0050). ``extend`` is how a concern
280
+ provider PROJECTS an attr onto a type it does not own, and a
281
+ concern can be composed out of a registry composition. A required
282
+ attr arriving this way makes the target type's validity depend on
283
+ an optional provider — the failure is silent: drop the provider
284
+ and the type stays registered while its required-attr rule stops
285
+ firing, so invalid metadata begins loading clean. A genuinely
286
+ required attr is OWN and belongs with its type, in the type's own
287
+ provider — never via ``extend``. Fails CLOSED: the offending attr
288
+ is not appended before the raise.
264
289
 
265
290
  Note: providers calling ``extend`` MUST declare a dependency on the
266
291
  provider that originally registered the ``(type_, sub_type)`` so
@@ -289,6 +314,23 @@ class TypeRegistry:
289
314
  f'on "{type_}.{sub_type}"',
290
315
  ErrorCode.ERR_PROVIDER_ATTR_CONFLICT,
291
316
  )
317
+ # ADR-0050: a REQUIRED attr may never be PROJECTED onto someone else's
318
+ # type. A provider may only project OPTIONAL attributes onto a type it
319
+ # does not own — a required attr registered this way disappears,
320
+ # silently, whenever that provider is composed out. If the attr is
321
+ # genuinely required, it is OWN: declare it with the type instead, in
322
+ # the type's own provider. Checked (and raised) before the attr is
323
+ # appended, so the offending attr is never half-applied.
324
+ if attr.required:
325
+ raise ParseError(
326
+ f'TypeRegistry.extend: attribute "{attr.name}" being added to '
327
+ f'"{type_}.{sub_type}" is REQUIRED. A provider may only project '
328
+ f"OPTIONAL attributes onto a type it does not own — a required "
329
+ f"attr registered this way disappears, silently, whenever that "
330
+ f"provider is composed out. Declare it with the type instead "
331
+ f"(ADR-0050).",
332
+ ErrorCode.ERR_EXTEND_REQUIRED_ATTR,
333
+ )
292
334
  definition.attrs.append(attr)
293
335
  # #265 — stamp the extending provider as this attr's origin.
294
336
  self._attr_provenance[(type_, sub_type, attr.name)] = origin
@@ -12,6 +12,7 @@ TYPE_LAYOUT = "layout"
12
12
  TYPE_SOURCE = "source"
13
13
  TYPE_ORIGIN = "origin"
14
14
  TYPE_TEMPLATE = "template"
15
+ TYPE_REQUIREMENT = "requirement"
15
16
 
16
17
  SUBTYPE_BASE = "base"
17
18
  SUBTYPE_ROOT = "root"
@@ -52,6 +52,7 @@ SPEC_FILES: tuple[str, ...] = (
52
52
  "origin.json",
53
53
  "prompt.json",
54
54
  "relationship.json",
55
+ "requirement.json",
55
56
  "source.json",
56
57
  "template.json",
57
58
  "ui.json",