terp-spec 0.15.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 (482) hide show
  1. terp_spec-0.15.0/.github/workflows/ci.yml +90 -0
  2. terp_spec-0.15.0/.github/workflows/release.yml +237 -0
  3. terp_spec-0.15.0/.gitignore +221 -0
  4. terp_spec-0.15.0/CHANGELOG.md +311 -0
  5. terp_spec-0.15.0/LICENSE +201 -0
  6. terp_spec-0.15.0/PKG-INFO +7 -0
  7. terp_spec-0.15.0/README.md +417 -0
  8. terp_spec-0.15.0/VERSION +1 -0
  9. terp_spec-0.15.0/app-check-report.schema.json +122 -0
  10. terp_spec-0.15.0/assurance-profile.schema.json +70 -0
  11. terp_spec-0.15.0/catalog/backend/alembic_downgrades_not_empty.json +22 -0
  12. terp_spec-0.15.0/catalog/backend/base_query_not_overridden.json +27 -0
  13. terp_spec-0.15.0/catalog/backend/canonical_module_shape.json +22 -0
  14. terp_spec-0.15.0/catalog/backend/datetime_columns_are_timezone_aware.json +23 -0
  15. terp_spec-0.15.0/catalog/backend/escape_hatch_budget.json +21 -0
  16. terp_spec-0.15.0/catalog/backend/events_reference_catalog.json +27 -0
  17. terp_spec-0.15.0/catalog/backend/input_schemas_exclude_managed_columns.json +27 -0
  18. terp_spec-0.15.0/catalog/backend/input_str_fields_have_max_length.json +22 -0
  19. terp_spec-0.15.0/catalog/backend/jobs_reference_catalog.json +27 -0
  20. terp_spec-0.15.0/catalog/backend/list_routes_paginate.json +32 -0
  21. terp_spec-0.15.0/catalog/backend/modules_declare_policy.json +26 -0
  22. terp_spec-0.15.0/catalog/backend/mutations_emit_audit.json +26 -0
  23. terp_spec-0.15.0/catalog/backend/mutations_require_write_role.json +32 -0
  24. terp_spec-0.15.0/catalog/backend/no_adhoc_background_runtime.json +22 -0
  25. terp_spec-0.15.0/catalog/backend/no_adhoc_config_decrypt.json +27 -0
  26. terp_spec-0.15.0/catalog/backend/no_adhoc_logging_config.json +22 -0
  27. terp_spec-0.15.0/catalog/backend/no_adhoc_middleware.json +27 -0
  28. terp_spec-0.15.0/catalog/backend/no_adhoc_permission_literals.json +27 -0
  29. terp_spec-0.15.0/catalog/backend/no_app_instantiation.json +22 -0
  30. terp_spec-0.15.0/catalog/backend/no_blocking_sleep.json +22 -0
  31. terp_spec-0.15.0/catalog/backend/no_cross_module_imports.json +21 -0
  32. terp_spec-0.15.0/catalog/backend/no_dependency_overrides.json +27 -0
  33. terp_spec-0.15.0/catalog/backend/no_destructive_migrations.json +22 -0
  34. terp_spec-0.15.0/catalog/backend/no_dynamic_sql.json +22 -0
  35. terp_spec-0.15.0/catalog/backend/no_empty_tests.json +22 -0
  36. terp_spec-0.15.0/catalog/backend/no_eval_or_exec.json +22 -0
  37. terp_spec-0.15.0/catalog/backend/no_hardcoded_credentials.json +21 -0
  38. terp_spec-0.15.0/catalog/backend/no_internal_imports.json +22 -0
  39. terp_spec-0.15.0/catalog/backend/no_manual_actor_stamping.json +27 -0
  40. terp_spec-0.15.0/catalog/backend/no_manual_ownership_checks.json +32 -0
  41. terp_spec-0.15.0/catalog/backend/no_manual_scope_filtering.json +27 -0
  42. terp_spec-0.15.0/catalog/backend/no_manual_table_schema.json +22 -0
  43. terp_spec-0.15.0/catalog/backend/no_manual_version_assignment.json +22 -0
  44. terp_spec-0.15.0/catalog/backend/no_mutable_default_args.json +22 -0
  45. terp_spec-0.15.0/catalog/backend/no_naive_datetime.json +22 -0
  46. terp_spec-0.15.0/catalog/backend/no_oversized_python_files.json +22 -0
  47. terp_spec-0.15.0/catalog/backend/no_print.json +22 -0
  48. terp_spec-0.15.0/catalog/backend/no_raw_app_routes.json +26 -0
  49. terp_spec-0.15.0/catalog/backend/no_raw_connection_access.json +27 -0
  50. terp_spec-0.15.0/catalog/backend/no_raw_file_references.json +27 -0
  51. terp_spec-0.15.0/catalog/backend/no_raw_outbound_http.json +22 -0
  52. terp_spec-0.15.0/catalog/backend/no_raw_session_construction.json +22 -0
  53. terp_spec-0.15.0/catalog/backend/no_star_imports.json +22 -0
  54. terp_spec-0.15.0/catalog/backend/no_todo_fixme.json +22 -0
  55. terp_spec-0.15.0/catalog/backend/no_unique_columns_on_soft_delete_models.json +22 -0
  56. terp_spec-0.15.0/catalog/backend/offset_queries_declare_ordering.json +22 -0
  57. terp_spec-0.15.0/catalog/backend/path_id_params_are_uuid.json +22 -0
  58. terp_spec-0.15.0/catalog/backend/policy_refs_resolve.json +27 -0
  59. terp_spec-0.15.0/catalog/backend/public_modules_are_read_only.json +26 -0
  60. terp_spec-0.15.0/catalog/backend/reads_use_base_query.json +27 -0
  61. terp_spec-0.15.0/catalog/backend/response_model_not_table_model.json +27 -0
  62. terp_spec-0.15.0/catalog/backend/routes_declare_response_model.json +27 -0
  63. terp_spec-0.15.0/catalog/backend/safe_methods_are_read_only.json +31 -0
  64. terp_spec-0.15.0/catalog/backend/schemas_exclude_sensitive_fields.json +32 -0
  65. terp_spec-0.15.0/catalog/backend/session_imported_from_sqlmodel.json +22 -0
  66. terp_spec-0.15.0/catalog/backend/table_models_use_base_table.json +22 -0
  67. terp_spec-0.15.0/catalog/backend/tables_have_migrations.json +27 -0
  68. terp_spec-0.15.0/catalog/backend/tenant_scoped_models_use_scoped_service.json +22 -0
  69. terp_spec-0.15.0/catalog/backend/ungoverned_escape_hatch.json +21 -0
  70. terp_spec-0.15.0/catalog/backend/update_schemas_inherit_base_update_schema.json +32 -0
  71. terp_spec-0.15.0/catalog/frontend/escape-hatch.json +21 -0
  72. terp_spec-0.15.0/catalog/frontend/generated-client-only.json +26 -0
  73. terp_spec-0.15.0/catalog/frontend/layout-contract.json +26 -0
  74. terp_spec-0.15.0/catalog/frontend/no-cross-module-imports.json +21 -0
  75. terp_spec-0.15.0/catalog/frontend/no-deep-imports.json +25 -0
  76. terp_spec-0.15.0/catalog/frontend/no-dom-html-injection.json +22 -0
  77. terp_spec-0.15.0/catalog/frontend/no-eval.json +21 -0
  78. terp_spec-0.15.0/catalog/frontend/no-inline-styling.json +25 -0
  79. terp_spec-0.15.0/catalog/frontend/no-style-imports.json +24 -0
  80. terp_spec-0.15.0/catalog/frontend/no-unsafe-href.json +21 -0
  81. terp_spec-0.15.0/catalog/frontend/no-unsafe-target-blank.json +21 -0
  82. terp_spec-0.15.0/catalog/frontend/router-links.json +22 -0
  83. terp_spec-0.15.0/catalog/frontend/token-styled-elements.json +25 -0
  84. terp_spec-0.15.0/catalog/schema.json +95 -0
  85. terp_spec-0.15.0/corpus/PENDING.json +4 -0
  86. terp_spec-0.15.0/corpus/RESIDUALS.json +21 -0
  87. terp_spec-0.15.0/corpus/backend/alembic_downgrades_not_empty/compliant-01/modules/notes/migrations/versions/0001_change.py +6 -0
  88. terp_spec-0.15.0/corpus/backend/alembic_downgrades_not_empty/violation-01/modules/notes/migrations/versions/0001_change.py +6 -0
  89. terp_spec-0.15.0/corpus/backend/base_query_not_overridden/compliant-01/modules/notes/service.py +8 -0
  90. terp_spec-0.15.0/corpus/backend/base_query_not_overridden/compliant-02/modules/notes/service.py +8 -0
  91. terp_spec-0.15.0/corpus/backend/base_query_not_overridden/violation-01/modules/notes/service.py +8 -0
  92. terp_spec-0.15.0/corpus/backend/base_query_not_overridden/violation-02/expected-findings.json +7 -0
  93. terp_spec-0.15.0/corpus/backend/base_query_not_overridden/violation-02/modules/notes/service.py +8 -0
  94. terp_spec-0.15.0/corpus/backend/canonical_module_shape/compliant-01/modules/notes/models.py +6 -0
  95. terp_spec-0.15.0/corpus/backend/canonical_module_shape/compliant-01/modules/notes/module.py +7 -0
  96. terp_spec-0.15.0/corpus/backend/canonical_module_shape/compliant-01/modules/notes/router.py +3 -0
  97. terp_spec-0.15.0/corpus/backend/canonical_module_shape/compliant-01/modules/notes/schemas.py +10 -0
  98. terp_spec-0.15.0/corpus/backend/canonical_module_shape/compliant-01/modules/notes/service.py +5 -0
  99. terp_spec-0.15.0/corpus/backend/canonical_module_shape/violation-01/modules/notes/router.py +3 -0
  100. terp_spec-0.15.0/corpus/backend/datetime_columns_are_timezone_aware/compliant-01/modules/notes/models.py +12 -0
  101. terp_spec-0.15.0/corpus/backend/datetime_columns_are_timezone_aware/violation-01/modules/notes/models.py +12 -0
  102. terp_spec-0.15.0/corpus/backend/datetime_columns_are_timezone_aware/violation-02/modules/notes/models.py +13 -0
  103. terp_spec-0.15.0/corpus/backend/datetime_columns_are_timezone_aware/violation-03/modules/notes/models.py +15 -0
  104. terp_spec-0.15.0/corpus/backend/escape_hatch_budget/compliant-01/escape-hatch-budget.json +3 -0
  105. terp_spec-0.15.0/corpus/backend/escape_hatch_budget/compliant-01/modules/notes/service.py +2 -0
  106. terp_spec-0.15.0/corpus/backend/escape_hatch_budget/compliant-02/escape-hatch-budget.json +1 -0
  107. terp_spec-0.15.0/corpus/backend/escape_hatch_budget/compliant-02/modules/notes/service.py +4 -0
  108. terp_spec-0.15.0/corpus/backend/escape_hatch_budget/violation-01/escape-hatch-budget.json +1 -0
  109. terp_spec-0.15.0/corpus/backend/escape_hatch_budget/violation-01/modules/notes/service.py +2 -0
  110. terp_spec-0.15.0/corpus/backend/escape_hatch_budget/violation-02/escape-hatch-budget.json +3 -0
  111. terp_spec-0.15.0/corpus/backend/escape_hatch_budget/violation-02/modules/notes/service.py +4 -0
  112. terp_spec-0.15.0/corpus/backend/events_reference_catalog/compliant-01/modules/notes/module.py +9 -0
  113. terp_spec-0.15.0/corpus/backend/events_reference_catalog/violation-01/modules/notes/module.py +8 -0
  114. terp_spec-0.15.0/corpus/backend/input_schemas_exclude_managed_columns/compliant-01/modules/notes/schemas.py +6 -0
  115. terp_spec-0.15.0/corpus/backend/input_schemas_exclude_managed_columns/violation-01/expected-findings.json +7 -0
  116. terp_spec-0.15.0/corpus/backend/input_schemas_exclude_managed_columns/violation-01/modules/notes/schemas.py +9 -0
  117. terp_spec-0.15.0/corpus/backend/input_schemas_exclude_managed_columns/violation-02/expected-findings.json +12 -0
  118. terp_spec-0.15.0/corpus/backend/input_schemas_exclude_managed_columns/violation-02/modules/notes/router.py +14 -0
  119. terp_spec-0.15.0/corpus/backend/input_str_fields_have_max_length/compliant-01/modules/notes/schemas.py +4 -0
  120. terp_spec-0.15.0/corpus/backend/input_str_fields_have_max_length/violation-01/modules/notes/schemas.py +2 -0
  121. terp_spec-0.15.0/corpus/backend/jobs_reference_catalog/compliant-01/modules/notes/service.py +5 -0
  122. terp_spec-0.15.0/corpus/backend/jobs_reference_catalog/violation-01/modules/notes/service.py +2 -0
  123. terp_spec-0.15.0/corpus/backend/list_routes_paginate/compliant-01/modules/notes/router.py +6 -0
  124. terp_spec-0.15.0/corpus/backend/list_routes_paginate/violation-01/modules/notes/router.py +3 -0
  125. terp_spec-0.15.0/corpus/backend/modules_declare_policy/compliant-01/modules/notes/module.py +7 -0
  126. terp_spec-0.15.0/corpus/backend/modules_declare_policy/violation-01/modules/notes/module.py +6 -0
  127. terp_spec-0.15.0/corpus/backend/mutations_emit_audit/compliant-01/modules/notes/service.py +9 -0
  128. terp_spec-0.15.0/corpus/backend/mutations_emit_audit/violation-01/modules/notes/service.py +4 -0
  129. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/compliant-01/modules/notes/module.py +7 -0
  130. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/compliant-01/modules/notes/router.py +3 -0
  131. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/compliant-02/modules/notes/module.py +7 -0
  132. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/compliant-02/modules/notes/router.py +3 -0
  133. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/violation-01/expected-findings.json +7 -0
  134. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/violation-01/modules/notes/module.py +7 -0
  135. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/violation-01/modules/notes/router.py +3 -0
  136. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/violation-02/expected-findings.json +7 -0
  137. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/violation-02/modules/notes/module.py +7 -0
  138. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/violation-02/modules/notes/router.py +5 -0
  139. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/violation-03/expected-findings.json +7 -0
  140. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/violation-03/modules/notes/module.py +10 -0
  141. terp_spec-0.15.0/corpus/backend/mutations_require_write_role/violation-03/modules/notes/router.py +3 -0
  142. terp_spec-0.15.0/corpus/backend/no_adhoc_background_runtime/compliant-01/modules/notes/service.py +9 -0
  143. terp_spec-0.15.0/corpus/backend/no_adhoc_background_runtime/violation-01/modules/notes/service.py +5 -0
  144. terp_spec-0.15.0/corpus/backend/no_adhoc_background_runtime/violation-02/modules/notes/service.py +3 -0
  145. terp_spec-0.15.0/corpus/backend/no_adhoc_config_decrypt/compliant-01/modules/billing/service.py +2 -0
  146. terp_spec-0.15.0/corpus/backend/no_adhoc_config_decrypt/violation-01/modules/billing/service.py +2 -0
  147. terp_spec-0.15.0/corpus/backend/no_adhoc_logging_config/compliant-01/modules/notes/service.py +3 -0
  148. terp_spec-0.15.0/corpus/backend/no_adhoc_logging_config/violation-01/modules/notes/service.py +3 -0
  149. terp_spec-0.15.0/corpus/backend/no_adhoc_middleware/compliant-01/main.py +3 -0
  150. terp_spec-0.15.0/corpus/backend/no_adhoc_middleware/violation-01/main.py +4 -0
  151. terp_spec-0.15.0/corpus/backend/no_adhoc_middleware/violation-02/main.py +5 -0
  152. terp_spec-0.15.0/corpus/backend/no_adhoc_permission_literals/compliant-01/modules/notes/module.py +3 -0
  153. terp_spec-0.15.0/corpus/backend/no_adhoc_permission_literals/compliant-02/modules/notes/router.py +5 -0
  154. terp_spec-0.15.0/corpus/backend/no_adhoc_permission_literals/violation-01/expected-findings.json +7 -0
  155. terp_spec-0.15.0/corpus/backend/no_adhoc_permission_literals/violation-01/modules/notes/module.py +1 -0
  156. terp_spec-0.15.0/corpus/backend/no_adhoc_permission_literals/violation-02/expected-findings.json +7 -0
  157. terp_spec-0.15.0/corpus/backend/no_adhoc_permission_literals/violation-02/modules/notes/router.py +2 -0
  158. terp_spec-0.15.0/corpus/backend/no_adhoc_permission_literals/violation-03/expected-findings.json +12 -0
  159. terp_spec-0.15.0/corpus/backend/no_adhoc_permission_literals/violation-03/modules/notes/module.py +10 -0
  160. terp_spec-0.15.0/corpus/backend/no_app_instantiation/compliant-01/main.py +3 -0
  161. terp_spec-0.15.0/corpus/backend/no_app_instantiation/violation-01/main.py +3 -0
  162. terp_spec-0.15.0/corpus/backend/no_blocking_sleep/compliant-01/modules/notes/service.py +2 -0
  163. terp_spec-0.15.0/corpus/backend/no_blocking_sleep/violation-01/modules/notes/service.py +5 -0
  164. terp_spec-0.15.0/corpus/backend/no_cross_module_imports/compliant-01/modules/a/service.py +1 -0
  165. terp_spec-0.15.0/corpus/backend/no_cross_module_imports/violation-01/modules/a/service.py +1 -0
  166. terp_spec-0.15.0/corpus/backend/no_cross_module_imports/violation-02/modules/a/service.py +1 -0
  167. terp_spec-0.15.0/corpus/backend/no_dependency_overrides/compliant-01/main.py +12 -0
  168. terp_spec-0.15.0/corpus/backend/no_dependency_overrides/violation-01/main.py +11 -0
  169. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/compliant-01/modules/notes/migrations/versions/0001_change.py +3 -0
  170. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/compliant-02/modules/notes/migrations/versions/0001_change.py +8 -0
  171. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-01/expected-findings.json +7 -0
  172. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-01/modules/notes/migrations/versions/0001_change.py +2 -0
  173. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-02/expected-findings.json +7 -0
  174. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-02/modules/notes/migrations/versions/0001_change.py +2 -0
  175. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-03/expected-findings.json +7 -0
  176. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-03/modules/notes/migrations/versions/0001_change.py +3 -0
  177. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-04/expected-findings.json +12 -0
  178. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-04/modules/notes/migrations/versions/0001_change.py +6 -0
  179. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-05/expected-findings.json +12 -0
  180. terp_spec-0.15.0/corpus/backend/no_destructive_migrations/violation-05/modules/notes/migrations/versions/0001_change.py +3 -0
  181. terp_spec-0.15.0/corpus/backend/no_dynamic_sql/compliant-01/modules/notes/service.py +1 -0
  182. terp_spec-0.15.0/corpus/backend/no_dynamic_sql/compliant-02/modules/notes/service.py +20 -0
  183. terp_spec-0.15.0/corpus/backend/no_dynamic_sql/violation-01/modules/notes/service.py +2 -0
  184. terp_spec-0.15.0/corpus/backend/no_dynamic_sql/violation-02/modules/notes/service.py +2 -0
  185. terp_spec-0.15.0/corpus/backend/no_dynamic_sql/violation-03/modules/notes/service.py +7 -0
  186. terp_spec-0.15.0/corpus/backend/no_dynamic_sql/violation-04/modules/notes/service.py +16 -0
  187. terp_spec-0.15.0/corpus/backend/no_empty_tests/compliant-01/tests/test_notes.py +2 -0
  188. terp_spec-0.15.0/corpus/backend/no_empty_tests/violation-01/tests/test_notes.py +2 -0
  189. terp_spec-0.15.0/corpus/backend/no_eval_or_exec/compliant-01/modules/notes/service.py +2 -0
  190. terp_spec-0.15.0/corpus/backend/no_eval_or_exec/violation-01/modules/notes/service.py +2 -0
  191. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/compliant-01/modules/billing/service.py +3 -0
  192. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/compliant-02/modules/billing/service.py +18 -0
  193. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-01/expected-findings.json +7 -0
  194. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-01/modules/billing/service.py +2 -0
  195. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-02/expected-findings.json +7 -0
  196. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-02/modules/billing/service.py +1 -0
  197. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-03/expected-findings.json +22 -0
  198. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-03/modules/billing/service.py +11 -0
  199. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-04/expected-findings.json +12 -0
  200. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-04/modules/billing/service.py +8 -0
  201. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-05/expected-findings.json +12 -0
  202. terp_spec-0.15.0/corpus/backend/no_hardcoded_credentials/violation-05/modules/billing/service.py +4 -0
  203. terp_spec-0.15.0/corpus/backend/no_internal_imports/compliant-01/modules/notes/service.py +1 -0
  204. terp_spec-0.15.0/corpus/backend/no_internal_imports/violation-01/modules/notes/service.py +1 -0
  205. terp_spec-0.15.0/corpus/backend/no_manual_actor_stamping/compliant-01/modules/notes/service.py +5 -0
  206. terp_spec-0.15.0/corpus/backend/no_manual_actor_stamping/compliant-02/modules/notes/schemas.py +12 -0
  207. terp_spec-0.15.0/corpus/backend/no_manual_actor_stamping/violation-01/modules/notes/service.py +3 -0
  208. terp_spec-0.15.0/corpus/backend/no_manual_actor_stamping/violation-02/expected-findings.json +7 -0
  209. terp_spec-0.15.0/corpus/backend/no_manual_actor_stamping/violation-02/modules/notes/service.py +4 -0
  210. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/compliant-01/modules/journals/service.py +3 -0
  211. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/compliant-02/modules/journals/schemas.py +11 -0
  212. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/violation-01/modules/journals/service.py +3 -0
  213. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/violation-02/expected-findings.json +7 -0
  214. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/violation-02/modules/journals/service.py +9 -0
  215. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/violation-03/expected-findings.json +7 -0
  216. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/violation-03/modules/notes/jobs.py +1 -0
  217. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/violation-03/modules/notes/models.py +7 -0
  218. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/violation-03/modules/notes/module.py +11 -0
  219. terp_spec-0.15.0/corpus/backend/no_manual_ownership_checks/violation-03/modules/notes/service.py +7 -0
  220. terp_spec-0.15.0/corpus/backend/no_manual_scope_filtering/compliant-01/modules/notes/service.py +8 -0
  221. terp_spec-0.15.0/corpus/backend/no_manual_scope_filtering/compliant-02/modules/notes/schemas.py +12 -0
  222. terp_spec-0.15.0/corpus/backend/no_manual_scope_filtering/violation-01/modules/notes/service.py +2 -0
  223. terp_spec-0.15.0/corpus/backend/no_manual_scope_filtering/violation-02/modules/notes/service.py +2 -0
  224. terp_spec-0.15.0/corpus/backend/no_manual_scope_filtering/violation-03/expected-findings.json +7 -0
  225. terp_spec-0.15.0/corpus/backend/no_manual_scope_filtering/violation-03/modules/notes/service.py +7 -0
  226. terp_spec-0.15.0/corpus/backend/no_manual_table_schema/compliant-01/modules/notes/models.py +6 -0
  227. terp_spec-0.15.0/corpus/backend/no_manual_table_schema/violation-01/modules/notes/models.py +8 -0
  228. terp_spec-0.15.0/corpus/backend/no_manual_version_assignment/compliant-01/modules/notes/service.py +5 -0
  229. terp_spec-0.15.0/corpus/backend/no_manual_version_assignment/violation-01/modules/notes/service.py +3 -0
  230. terp_spec-0.15.0/corpus/backend/no_manual_version_assignment/violation-02/modules/notes/service.py +3 -0
  231. terp_spec-0.15.0/corpus/backend/no_manual_version_assignment/violation-03/modules/notes/service.py +3 -0
  232. terp_spec-0.15.0/corpus/backend/no_mutable_default_args/compliant-01/modules/notes/service.py +3 -0
  233. terp_spec-0.15.0/corpus/backend/no_mutable_default_args/violation-01/modules/notes/service.py +2 -0
  234. terp_spec-0.15.0/corpus/backend/no_naive_datetime/compliant-01/modules/notes/service.py +2 -0
  235. terp_spec-0.15.0/corpus/backend/no_naive_datetime/violation-01/modules/notes/service.py +2 -0
  236. terp_spec-0.15.0/corpus/backend/no_naive_datetime/violation-02/modules/notes/service.py +2 -0
  237. terp_spec-0.15.0/corpus/backend/no_oversized_python_files/compliant-01/modules/notes/service.py +9 -0
  238. terp_spec-0.15.0/corpus/backend/no_oversized_python_files/violation-01/modules/notes/service.py +530 -0
  239. terp_spec-0.15.0/corpus/backend/no_print/compliant-01/modules/notes/service.py +7 -0
  240. terp_spec-0.15.0/corpus/backend/no_print/violation-01/modules/notes/service.py +2 -0
  241. terp_spec-0.15.0/corpus/backend/no_raw_app_routes/compliant-01/main.py +12 -0
  242. terp_spec-0.15.0/corpus/backend/no_raw_app_routes/violation-01/main.py +10 -0
  243. terp_spec-0.15.0/corpus/backend/no_raw_app_routes/violation-02/main.py +16 -0
  244. terp_spec-0.15.0/corpus/backend/no_raw_app_routes/violation-03/main.py +12 -0
  245. terp_spec-0.15.0/corpus/backend/no_raw_app_routes/violation-04/main.py +10 -0
  246. terp_spec-0.15.0/corpus/backend/no_raw_app_routes/violation-05/main.py +12 -0
  247. terp_spec-0.15.0/corpus/backend/no_raw_app_routes/violation-06/main.py +10 -0
  248. terp_spec-0.15.0/corpus/backend/no_raw_connection_access/compliant-01/modules/notes/service.py +5 -0
  249. terp_spec-0.15.0/corpus/backend/no_raw_connection_access/violation-01/modules/notes/service.py +2 -0
  250. terp_spec-0.15.0/corpus/backend/no_raw_connection_access/violation-02/modules/notes/service.py +2 -0
  251. terp_spec-0.15.0/corpus/backend/no_raw_file_references/compliant-01/modules/notes/models.py +10 -0
  252. terp_spec-0.15.0/corpus/backend/no_raw_file_references/violation-01/modules/notes/models.py +9 -0
  253. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/compliant-01/modules/notes/service.py +2 -0
  254. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/compliant-03/modules/notes/service.py +12 -0
  255. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-01/expected-findings.json +7 -0
  256. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-01/modules/notes/service.py +1 -0
  257. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-02/expected-findings.json +7 -0
  258. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-02/modules/notes/service.py +1 -0
  259. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-03/expected-findings.json +7 -0
  260. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-03/modules/notes/service.py +1 -0
  261. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-04/expected-findings.json +12 -0
  262. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-04/modules/notes/service.py +7 -0
  263. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-05/expected-findings.json +12 -0
  264. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-05/modules/notes/service.py +5 -0
  265. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-06/expected-findings.json +12 -0
  266. terp_spec-0.15.0/corpus/backend/no_raw_outbound_http/violation-06/modules/notes/service.py +2 -0
  267. terp_spec-0.15.0/corpus/backend/no_raw_session_construction/compliant-01/modules/notes/service.py +3 -0
  268. terp_spec-0.15.0/corpus/backend/no_raw_session_construction/violation-01/modules/notes/service.py +3 -0
  269. terp_spec-0.15.0/corpus/backend/no_star_imports/compliant-01/modules/notes/service.py +1 -0
  270. terp_spec-0.15.0/corpus/backend/no_star_imports/violation-01/modules/notes/service.py +1 -0
  271. terp_spec-0.15.0/corpus/backend/no_todo_fixme/compliant-01/modules/notes/service.py +3 -0
  272. terp_spec-0.15.0/corpus/backend/no_todo_fixme/violation-01/modules/notes/service.py +3 -0
  273. terp_spec-0.15.0/corpus/backend/no_unique_columns_on_soft_delete_models/compliant-01/modules/notes/models.py +17 -0
  274. terp_spec-0.15.0/corpus/backend/no_unique_columns_on_soft_delete_models/violation-01/expected-findings.json +7 -0
  275. terp_spec-0.15.0/corpus/backend/no_unique_columns_on_soft_delete_models/violation-01/modules/notes/models.py +6 -0
  276. terp_spec-0.15.0/corpus/backend/no_unique_columns_on_soft_delete_models/violation-02/expected-findings.json +7 -0
  277. terp_spec-0.15.0/corpus/backend/no_unique_columns_on_soft_delete_models/violation-02/modules/notes/models.py +13 -0
  278. terp_spec-0.15.0/corpus/backend/no_unique_columns_on_soft_delete_models/violation-03/expected-findings.json +7 -0
  279. terp_spec-0.15.0/corpus/backend/no_unique_columns_on_soft_delete_models/violation-03/modules/notes/models.py +16 -0
  280. terp_spec-0.15.0/corpus/backend/offset_queries_declare_ordering/compliant-01/modules/notes/service.py +4 -0
  281. terp_spec-0.15.0/corpus/backend/offset_queries_declare_ordering/violation-01/modules/notes/service.py +2 -0
  282. terp_spec-0.15.0/corpus/backend/path_id_params_are_uuid/compliant-01/modules/notes/router.py +6 -0
  283. terp_spec-0.15.0/corpus/backend/path_id_params_are_uuid/violation-01/modules/notes/router.py +6 -0
  284. terp_spec-0.15.0/corpus/backend/policy_refs_resolve/compliant-01/modules/notes/module.py +7 -0
  285. terp_spec-0.15.0/corpus/backend/policy_refs_resolve/violation-01/modules/notes/module.py +8 -0
  286. terp_spec-0.15.0/corpus/backend/public_modules_are_read_only/compliant-01/modules/notes/module.py +7 -0
  287. terp_spec-0.15.0/corpus/backend/public_modules_are_read_only/compliant-01/modules/notes/router.py +3 -0
  288. terp_spec-0.15.0/corpus/backend/public_modules_are_read_only/violation-01/expected-findings.json +7 -0
  289. terp_spec-0.15.0/corpus/backend/public_modules_are_read_only/violation-01/modules/notes/module.py +7 -0
  290. terp_spec-0.15.0/corpus/backend/public_modules_are_read_only/violation-01/modules/notes/router.py +3 -0
  291. terp_spec-0.15.0/corpus/backend/public_modules_are_read_only/violation-02/expected-findings.json +7 -0
  292. terp_spec-0.15.0/corpus/backend/public_modules_are_read_only/violation-02/modules/notes/module.py +7 -0
  293. terp_spec-0.15.0/corpus/backend/public_modules_are_read_only/violation-02/modules/notes/router.py +5 -0
  294. terp_spec-0.15.0/corpus/backend/reads_use_base_query/compliant-01/modules/notes/models.py +6 -0
  295. terp_spec-0.15.0/corpus/backend/reads_use_base_query/compliant-01/modules/notes/service.py +8 -0
  296. terp_spec-0.15.0/corpus/backend/reads_use_base_query/compliant-02/modules/notes/models.py +9 -0
  297. terp_spec-0.15.0/corpus/backend/reads_use_base_query/compliant-02/modules/notes/service.py +9 -0
  298. terp_spec-0.15.0/corpus/backend/reads_use_base_query/violation-01/modules/notes/models.py +6 -0
  299. terp_spec-0.15.0/corpus/backend/reads_use_base_query/violation-01/modules/notes/service.py +9 -0
  300. terp_spec-0.15.0/corpus/backend/reads_use_base_query/violation-02/expected-findings.json +7 -0
  301. terp_spec-0.15.0/corpus/backend/reads_use_base_query/violation-02/modules/notes/models.py +6 -0
  302. terp_spec-0.15.0/corpus/backend/reads_use_base_query/violation-02/modules/notes/service.py +8 -0
  303. terp_spec-0.15.0/corpus/backend/response_model_not_table_model/compliant-01/modules/notes/models.py +6 -0
  304. terp_spec-0.15.0/corpus/backend/response_model_not_table_model/compliant-01/modules/notes/router.py +3 -0
  305. terp_spec-0.15.0/corpus/backend/response_model_not_table_model/compliant-01/modules/notes/schemas.py +5 -0
  306. terp_spec-0.15.0/corpus/backend/response_model_not_table_model/violation-01/modules/notes/models.py +6 -0
  307. terp_spec-0.15.0/corpus/backend/response_model_not_table_model/violation-01/modules/notes/router.py +3 -0
  308. terp_spec-0.15.0/corpus/backend/routes_declare_response_model/compliant-01/modules/notes/router.py +8 -0
  309. terp_spec-0.15.0/corpus/backend/routes_declare_response_model/violation-01/modules/notes/router.py +3 -0
  310. terp_spec-0.15.0/corpus/backend/safe_methods_are_read_only/compliant-01/modules/notes/router.py +6 -0
  311. terp_spec-0.15.0/corpus/backend/safe_methods_are_read_only/compliant-02/modules/notes/router.py +5 -0
  312. terp_spec-0.15.0/corpus/backend/safe_methods_are_read_only/violation-01/expected-findings.json +7 -0
  313. terp_spec-0.15.0/corpus/backend/safe_methods_are_read_only/violation-01/modules/notes/router.py +3 -0
  314. terp_spec-0.15.0/corpus/backend/safe_methods_are_read_only/violation-02/expected-findings.json +7 -0
  315. terp_spec-0.15.0/corpus/backend/safe_methods_are_read_only/violation-02/modules/notes/router.py +5 -0
  316. terp_spec-0.15.0/corpus/backend/safe_methods_are_read_only/violation-03/expected-findings.json +7 -0
  317. terp_spec-0.15.0/corpus/backend/safe_methods_are_read_only/violation-03/modules/notes/router.py +3 -0
  318. terp_spec-0.15.0/corpus/backend/schemas_exclude_sensitive_fields/compliant-01/modules/users/schemas.py +5 -0
  319. terp_spec-0.15.0/corpus/backend/schemas_exclude_sensitive_fields/compliant-02/modules/accounts/schemas.py +12 -0
  320. terp_spec-0.15.0/corpus/backend/schemas_exclude_sensitive_fields/violation-01/expected-findings.json +7 -0
  321. terp_spec-0.15.0/corpus/backend/schemas_exclude_sensitive_fields/violation-01/modules/users/schemas.py +3 -0
  322. terp_spec-0.15.0/corpus/backend/schemas_exclude_sensitive_fields/violation-02/expected-findings.json +7 -0
  323. terp_spec-0.15.0/corpus/backend/schemas_exclude_sensitive_fields/violation-02/modules/connectors/router.py +8 -0
  324. terp_spec-0.15.0/corpus/backend/schemas_exclude_sensitive_fields/violation-03/expected-findings.json +17 -0
  325. terp_spec-0.15.0/corpus/backend/schemas_exclude_sensitive_fields/violation-03/modules/integrations/schemas.py +7 -0
  326. terp_spec-0.15.0/corpus/backend/session_imported_from_sqlmodel/compliant-01/modules/notes/service.py +5 -0
  327. terp_spec-0.15.0/corpus/backend/session_imported_from_sqlmodel/violation-01/modules/notes/service.py +5 -0
  328. terp_spec-0.15.0/corpus/backend/table_models_use_base_table/compliant-01/modules/notes/models.py +6 -0
  329. terp_spec-0.15.0/corpus/backend/table_models_use_base_table/violation-01/modules/notes/models.py +5 -0
  330. terp_spec-0.15.0/corpus/backend/tables_have_migrations/compliant-01/modules/notes/migrations/versions/0a1b2c3d4e5f_create_notes_tables.py +22 -0
  331. terp_spec-0.15.0/corpus/backend/tables_have_migrations/compliant-01/modules/notes/models.py +6 -0
  332. terp_spec-0.15.0/corpus/backend/tables_have_migrations/compliant-02/capabilities/ledger/models.py +6 -0
  333. terp_spec-0.15.0/corpus/backend/tables_have_migrations/violation-01/expected-findings.json +7 -0
  334. terp_spec-0.15.0/corpus/backend/tables_have_migrations/violation-01/modules/notes/models.py +6 -0
  335. terp_spec-0.15.0/corpus/backend/tables_have_migrations/violation-02/expected-findings.json +7 -0
  336. terp_spec-0.15.0/corpus/backend/tables_have_migrations/violation-02/modules/notes/models.py +10 -0
  337. terp_spec-0.15.0/corpus/backend/tenant_scoped_models_use_scoped_service/compliant-01/modules/projects/models.py +6 -0
  338. terp_spec-0.15.0/corpus/backend/tenant_scoped_models_use_scoped_service/compliant-01/modules/projects/service.py +5 -0
  339. terp_spec-0.15.0/corpus/backend/tenant_scoped_models_use_scoped_service/compliant-02/modules/projects/models.py +8 -0
  340. terp_spec-0.15.0/corpus/backend/tenant_scoped_models_use_scoped_service/compliant-02/modules/projects/service.py +5 -0
  341. terp_spec-0.15.0/corpus/backend/tenant_scoped_models_use_scoped_service/violation-01/modules/projects/models.py +6 -0
  342. terp_spec-0.15.0/corpus/backend/tenant_scoped_models_use_scoped_service/violation-01/modules/projects/service.py +5 -0
  343. terp_spec-0.15.0/corpus/backend/ungoverned_escape_hatch/compliant-01/modules/notes/service.py +5 -0
  344. terp_spec-0.15.0/corpus/backend/ungoverned_escape_hatch/compliant-02/modules/notes/service.py +4 -0
  345. terp_spec-0.15.0/corpus/backend/ungoverned_escape_hatch/violation-01/modules/notes/service.py +2 -0
  346. terp_spec-0.15.0/corpus/backend/update_schemas_inherit_base_update_schema/compliant-01/modules/notes/schemas.py +2 -0
  347. terp_spec-0.15.0/corpus/backend/update_schemas_inherit_base_update_schema/violation-01/modules/notes/schemas.py +2 -0
  348. terp_spec-0.15.0/corpus/backend/update_schemas_inherit_base_update_schema/violation-02/modules/notes/schemas.py +5 -0
  349. terp_spec-0.15.0/corpus/frontend/escape-hatch/compliant-01/src/modules/widgets/Widget.tsx +4 -0
  350. terp_spec-0.15.0/corpus/frontend/escape-hatch/violation-01/src/modules/widgets/Widget.tsx +4 -0
  351. terp_spec-0.15.0/corpus/frontend/escape-hatch/violation-02/src/modules/widgets/Widget.tsx +7 -0
  352. terp_spec-0.15.0/corpus/frontend/escape-hatch/violation-03/src/modules/widgets/Widget.tsx +7 -0
  353. terp_spec-0.15.0/corpus/frontend/generated-client-only/compliant-01/src/modules/widgets/Widget.tsx +6 -0
  354. terp_spec-0.15.0/corpus/frontend/generated-client-only/compliant-02/src/modules/widgets/Widget.tsx +21 -0
  355. terp_spec-0.15.0/corpus/frontend/generated-client-only/compliant-03/src/modules/widgets/Widget.tsx +7 -0
  356. terp_spec-0.15.0/corpus/frontend/generated-client-only/compliant-04/src/modules/widgets/Widget.tsx +17 -0
  357. terp_spec-0.15.0/corpus/frontend/generated-client-only/violation-01/src/modules/widgets/Widget.tsx +3 -0
  358. terp_spec-0.15.0/corpus/frontend/generated-client-only/violation-02/src/modules/widgets/Widget.tsx +9 -0
  359. terp_spec-0.15.0/corpus/frontend/generated-client-only/violation-03/src/modules/widgets/Widget.tsx +14 -0
  360. terp_spec-0.15.0/corpus/frontend/generated-client-only/violation-04/src/modules/widgets/Widget.tsx +6 -0
  361. terp_spec-0.15.0/corpus/frontend/layout-contract/compliant-01/layout-contract.json +3 -0
  362. terp_spec-0.15.0/corpus/frontend/layout-contract/compliant-01/src/modules/widgets/Widget.tsx +8 -0
  363. terp_spec-0.15.0/corpus/frontend/layout-contract/violation-01/layout-contract.json +3 -0
  364. terp_spec-0.15.0/corpus/frontend/layout-contract/violation-01/src/modules/widgets/Widget.tsx +8 -0
  365. terp_spec-0.15.0/corpus/frontend/no-cross-module-imports/compliant-01/src/modules/widgets/Widget.tsx +4 -0
  366. terp_spec-0.15.0/corpus/frontend/no-cross-module-imports/violation-01/src/modules/widgets/Widget.tsx +3 -0
  367. terp_spec-0.15.0/corpus/frontend/no-deep-imports/compliant-01/src/modules/widgets/Widget.tsx +4 -0
  368. terp_spec-0.15.0/corpus/frontend/no-deep-imports/violation-01/src/modules/widgets/Widget.tsx +2 -0
  369. terp_spec-0.15.0/corpus/frontend/no-dom-html-injection/compliant-01/src/modules/widgets/Widget.tsx +4 -0
  370. terp_spec-0.15.0/corpus/frontend/no-dom-html-injection/compliant-02/src/modules/widgets/Widget.tsx +11 -0
  371. terp_spec-0.15.0/corpus/frontend/no-dom-html-injection/violation-01/src/modules/widgets/Widget.tsx +3 -0
  372. terp_spec-0.15.0/corpus/frontend/no-dom-html-injection/violation-02/src/modules/widgets/Widget.tsx +7 -0
  373. terp_spec-0.15.0/corpus/frontend/no-dom-html-injection/violation-03/src/modules/widgets/Widget.tsx +12 -0
  374. terp_spec-0.15.0/corpus/frontend/no-eval/compliant-01/src/modules/widgets/Widget.tsx +4 -0
  375. terp_spec-0.15.0/corpus/frontend/no-eval/compliant-02/src/modules/widgets/Widget.tsx +11 -0
  376. terp_spec-0.15.0/corpus/frontend/no-eval/violation-01/src/modules/widgets/Widget.tsx +3 -0
  377. terp_spec-0.15.0/corpus/frontend/no-eval/violation-02/src/modules/widgets/Widget.tsx +7 -0
  378. terp_spec-0.15.0/corpus/frontend/no-eval/violation-03/src/modules/widgets/Widget.tsx +10 -0
  379. terp_spec-0.15.0/corpus/frontend/no-eval/violation-04/src/modules/widgets/Widget.tsx +6 -0
  380. terp_spec-0.15.0/corpus/frontend/no-inline-styling/compliant-01/src/modules/widgets/Widget.tsx +4 -0
  381. terp_spec-0.15.0/corpus/frontend/no-inline-styling/violation-01/src/modules/widgets/Widget.tsx +3 -0
  382. terp_spec-0.15.0/corpus/frontend/no-inline-styling/violation-02/src/modules/widgets/Widget.tsx +6 -0
  383. terp_spec-0.15.0/corpus/frontend/no-style-imports/compliant-01/src/modules/widgets/Widget.tsx +4 -0
  384. terp_spec-0.15.0/corpus/frontend/no-style-imports/violation-01/src/modules/widgets/Widget.tsx +2 -0
  385. terp_spec-0.15.0/corpus/frontend/no-unsafe-href/compliant-01/src/modules/widgets/Widget.tsx +3 -0
  386. terp_spec-0.15.0/corpus/frontend/no-unsafe-href/violation-01/src/modules/widgets/Widget.tsx +3 -0
  387. terp_spec-0.15.0/corpus/frontend/no-unsafe-target-blank/compliant-01/src/modules/widgets/Widget.tsx +3 -0
  388. terp_spec-0.15.0/corpus/frontend/no-unsafe-target-blank/violation-01/src/modules/widgets/Widget.tsx +3 -0
  389. terp_spec-0.15.0/corpus/frontend/router-links/compliant-01/src/modules/widgets/Widget.tsx +4 -0
  390. terp_spec-0.15.0/corpus/frontend/router-links/violation-01/src/modules/widgets/Widget.tsx +3 -0
  391. terp_spec-0.15.0/corpus/frontend/token-styled-elements/compliant-01/src/modules/widgets/Widget.tsx +4 -0
  392. terp_spec-0.15.0/corpus/frontend/token-styled-elements/compliant-02/src/modules/widgets/Widget.tsx +4 -0
  393. terp_spec-0.15.0/corpus/frontend/token-styled-elements/violation-01/src/modules/widgets/Widget.tsx +3 -0
  394. terp_spec-0.15.0/docs/rules/backend/alembic_downgrades_not_empty.md +32 -0
  395. terp_spec-0.15.0/docs/rules/backend/base_query_not_overridden.md +33 -0
  396. terp_spec-0.15.0/docs/rules/backend/canonical_module_shape.md +32 -0
  397. terp_spec-0.15.0/docs/rules/backend/datetime_columns_are_timezone_aware.md +32 -0
  398. terp_spec-0.15.0/docs/rules/backend/escape_hatch_budget.md +25 -0
  399. terp_spec-0.15.0/docs/rules/backend/events_reference_catalog.md +33 -0
  400. terp_spec-0.15.0/docs/rules/backend/input_schemas_exclude_managed_columns.md +33 -0
  401. terp_spec-0.15.0/docs/rules/backend/input_str_fields_have_max_length.md +32 -0
  402. terp_spec-0.15.0/docs/rules/backend/jobs_reference_catalog.md +33 -0
  403. terp_spec-0.15.0/docs/rules/backend/list_routes_paginate.md +34 -0
  404. terp_spec-0.15.0/docs/rules/backend/modules_declare_policy.md +33 -0
  405. terp_spec-0.15.0/docs/rules/backend/mutations_emit_audit.md +33 -0
  406. terp_spec-0.15.0/docs/rules/backend/mutations_require_write_role.md +34 -0
  407. terp_spec-0.15.0/docs/rules/backend/no_adhoc_background_runtime.md +32 -0
  408. terp_spec-0.15.0/docs/rules/backend/no_adhoc_config_decrypt.md +33 -0
  409. terp_spec-0.15.0/docs/rules/backend/no_adhoc_logging_config.md +32 -0
  410. terp_spec-0.15.0/docs/rules/backend/no_adhoc_middleware.md +33 -0
  411. terp_spec-0.15.0/docs/rules/backend/no_adhoc_permission_literals.md +33 -0
  412. terp_spec-0.15.0/docs/rules/backend/no_app_instantiation.md +32 -0
  413. terp_spec-0.15.0/docs/rules/backend/no_blocking_sleep.md +32 -0
  414. terp_spec-0.15.0/docs/rules/backend/no_cross_module_imports.md +28 -0
  415. terp_spec-0.15.0/docs/rules/backend/no_dependency_overrides.md +33 -0
  416. terp_spec-0.15.0/docs/rules/backend/no_destructive_migrations.md +32 -0
  417. terp_spec-0.15.0/docs/rules/backend/no_dynamic_sql.md +32 -0
  418. terp_spec-0.15.0/docs/rules/backend/no_empty_tests.md +32 -0
  419. terp_spec-0.15.0/docs/rules/backend/no_eval_or_exec.md +32 -0
  420. terp_spec-0.15.0/docs/rules/backend/no_hardcoded_credentials.md +28 -0
  421. terp_spec-0.15.0/docs/rules/backend/no_internal_imports.md +32 -0
  422. terp_spec-0.15.0/docs/rules/backend/no_manual_actor_stamping.md +33 -0
  423. terp_spec-0.15.0/docs/rules/backend/no_manual_ownership_checks.md +34 -0
  424. terp_spec-0.15.0/docs/rules/backend/no_manual_scope_filtering.md +33 -0
  425. terp_spec-0.15.0/docs/rules/backend/no_manual_table_schema.md +32 -0
  426. terp_spec-0.15.0/docs/rules/backend/no_manual_version_assignment.md +32 -0
  427. terp_spec-0.15.0/docs/rules/backend/no_mutable_default_args.md +32 -0
  428. terp_spec-0.15.0/docs/rules/backend/no_naive_datetime.md +32 -0
  429. terp_spec-0.15.0/docs/rules/backend/no_oversized_python_files.md +32 -0
  430. terp_spec-0.15.0/docs/rules/backend/no_print.md +32 -0
  431. terp_spec-0.15.0/docs/rules/backend/no_raw_app_routes.md +33 -0
  432. terp_spec-0.15.0/docs/rules/backend/no_raw_connection_access.md +33 -0
  433. terp_spec-0.15.0/docs/rules/backend/no_raw_file_references.md +33 -0
  434. terp_spec-0.15.0/docs/rules/backend/no_raw_outbound_http.md +32 -0
  435. terp_spec-0.15.0/docs/rules/backend/no_raw_session_construction.md +32 -0
  436. terp_spec-0.15.0/docs/rules/backend/no_star_imports.md +32 -0
  437. terp_spec-0.15.0/docs/rules/backend/no_todo_fixme.md +32 -0
  438. terp_spec-0.15.0/docs/rules/backend/no_unique_columns_on_soft_delete_models.md +32 -0
  439. terp_spec-0.15.0/docs/rules/backend/offset_queries_declare_ordering.md +32 -0
  440. terp_spec-0.15.0/docs/rules/backend/path_id_params_are_uuid.md +32 -0
  441. terp_spec-0.15.0/docs/rules/backend/policy_refs_resolve.md +33 -0
  442. terp_spec-0.15.0/docs/rules/backend/public_modules_are_read_only.md +33 -0
  443. terp_spec-0.15.0/docs/rules/backend/reads_use_base_query.md +33 -0
  444. terp_spec-0.15.0/docs/rules/backend/response_model_not_table_model.md +33 -0
  445. terp_spec-0.15.0/docs/rules/backend/routes_declare_response_model.md +33 -0
  446. terp_spec-0.15.0/docs/rules/backend/safe_methods_are_read_only.md +34 -0
  447. terp_spec-0.15.0/docs/rules/backend/schemas_exclude_sensitive_fields.md +34 -0
  448. terp_spec-0.15.0/docs/rules/backend/session_imported_from_sqlmodel.md +32 -0
  449. terp_spec-0.15.0/docs/rules/backend/table_models_use_base_table.md +32 -0
  450. terp_spec-0.15.0/docs/rules/backend/tables_have_migrations.md +33 -0
  451. terp_spec-0.15.0/docs/rules/backend/tenant_scoped_models_use_scoped_service.md +32 -0
  452. terp_spec-0.15.0/docs/rules/backend/ungoverned_escape_hatch.md +25 -0
  453. terp_spec-0.15.0/docs/rules/backend/update_schemas_inherit_base_update_schema.md +34 -0
  454. terp_spec-0.15.0/docs/rules/frontend/escape-hatch.md +25 -0
  455. terp_spec-0.15.0/docs/rules/frontend/generated-client-only.md +32 -0
  456. terp_spec-0.15.0/docs/rules/frontend/layout-contract.md +33 -0
  457. terp_spec-0.15.0/docs/rules/frontend/no-cross-module-imports.md +28 -0
  458. terp_spec-0.15.0/docs/rules/frontend/no-deep-imports.md +32 -0
  459. terp_spec-0.15.0/docs/rules/frontend/no-dom-html-injection.md +32 -0
  460. terp_spec-0.15.0/docs/rules/frontend/no-eval.md +28 -0
  461. terp_spec-0.15.0/docs/rules/frontend/no-inline-styling.md +32 -0
  462. terp_spec-0.15.0/docs/rules/frontend/no-style-imports.md +28 -0
  463. terp_spec-0.15.0/docs/rules/frontend/no-unsafe-href.md +28 -0
  464. terp_spec-0.15.0/docs/rules/frontend/no-unsafe-target-blank.md +28 -0
  465. terp_spec-0.15.0/docs/rules/frontend/router-links.md +32 -0
  466. terp_spec-0.15.0/docs/rules/frontend/token-styled-elements.md +32 -0
  467. terp_spec-0.15.0/findings.schema.json +40 -0
  468. terp_spec-0.15.0/package.json +23 -0
  469. terp_spec-0.15.0/pyproject.toml +48 -0
  470. terp_spec-0.15.0/restricted-surface.json +10 -0
  471. terp_spec-0.15.0/scorecard.schema.json +52 -0
  472. terp_spec-0.15.0/terp_spec/__init__.py +39 -0
  473. terp_spec-0.15.0/tests/conftest.py +14 -0
  474. terp_spec-0.15.0/tests/test_assurance.py +90 -0
  475. terp_spec-0.15.0/tests/test_changelog.py +41 -0
  476. terp_spec-0.15.0/tests/test_check_report.py +145 -0
  477. terp_spec-0.15.0/tests/test_release_workflow.py +202 -0
  478. terp_spec-0.15.0/tests/test_rule_docs.py +38 -0
  479. terp_spec-0.15.0/tests/test_scorecard.py +71 -0
  480. terp_spec-0.15.0/tests/test_standard.py +486 -0
  481. terp_spec-0.15.0/tests/test_validator.py +92 -0
  482. terp_spec-0.15.0/tools/generate_rule_docs.py +109 -0
@@ -0,0 +1,90 @@
1
+ name: ci
2
+
3
+ # The Terp Standard's own CI (ADR 0082): the spec is plain data + a tiny
4
+ # accessor with zero dependencies, and the `standard` job proves it
5
+ # self-consistent — versioning agreement, schema validity of every catalog
6
+ # entry, the finding format, the refused surface's shape, and the corpus
7
+ # ratchet. The `certify-against-reference` job closes the adoption gap the
8
+ # package seam leaves (framework CI reads the *pinned* release, so a change
9
+ # here would otherwise be exercised by no live implementation until the pins
10
+ # bump): it substitutes this checkout for the pinned terp-spec/@terpjs/spec and
11
+ # runs the framework's parity + corpus certification against it, so a catalog
12
+ # or corpus change is proven against the reference implementation BEFORE it
13
+ # can be released.
14
+
15
+ on:
16
+ push:
17
+ branches: [main]
18
+ pull_request:
19
+ branches: [main]
20
+
21
+ permissions:
22
+ contents: read
23
+
24
+ concurrency:
25
+ group: ${{ github.workflow }}-${{ github.ref }}
26
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
27
+
28
+ jobs:
29
+ standard:
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - uses: actions/checkout@v4
33
+ - uses: actions/setup-python@v5
34
+ with:
35
+ python-version: "3.12"
36
+ - name: Install
37
+ run: pip install pytest
38
+ - name: Test (the spec is self-consistent)
39
+ run: python -m pytest
40
+
41
+ certify-against-reference:
42
+ runs-on: ubuntu-latest
43
+ steps:
44
+ - uses: actions/checkout@v4
45
+ with:
46
+ path: spec
47
+ # The reference implementation. Tracks its default branch deliberately:
48
+ # a spec change must certify against what the framework IS, and a
49
+ # framework change that breaks parity should surface here, not at
50
+ # release time. (A private framework checkout would need a repo-scoped
51
+ # token on this step.)
52
+ - uses: actions/checkout@v4
53
+ with:
54
+ repository: AITT-NL/terp-framework
55
+ path: framework
56
+ - name: Record the certified reference commit
57
+ run: |
58
+ sha="$(git -C framework rev-parse HEAD)"
59
+ echo "Certifying against terp-framework@${sha}" | tee -a "$GITHUB_STEP_SUMMARY"
60
+ - name: Install uv
61
+ uses: astral-sh/setup-uv@v5
62
+ with:
63
+ enable-cache: true
64
+ - name: Set up Python
65
+ run: uv python install 3.13
66
+ - name: Python certification (catalog parity + backend corpus)
67
+ working-directory: framework
68
+ run: |
69
+ uv sync
70
+ # Substitute this checkout for the pinned terp-spec release — the
71
+ # same seam the framework's pin bump will move, exercised early.
72
+ uv pip install -e ../spec
73
+ uv run --no-sync pytest tests/architecture/test_spec_catalog.py tests/architecture/test_spec_corpus.py -q
74
+ - uses: actions/setup-node@v4
75
+ with:
76
+ node-version: "22"
77
+ - name: Frontend certification (ESLint adapter corpus + surface + findings)
78
+ working-directory: framework
79
+ run: |
80
+ npm ci
81
+ # Substitute the candidate spec under BOTH scope paths: the rename to
82
+ # @terpjs/spec (ADR 0086) lands here first, so the reference framework
83
+ # may still resolve the legacy @terp/spec until its repin lands. Drop
84
+ # the legacy leg once no consumer resolves it.
85
+ for scope in @terp @terpjs; do
86
+ rm -rf "node_modules/$scope/spec"
87
+ mkdir -p "node_modules/$scope"
88
+ ln -s "$GITHUB_WORKSPACE/spec" "node_modules/$scope/spec"
89
+ done
90
+ npx vitest run packages/frontend/eslint-boundaries
@@ -0,0 +1,237 @@
1
+ name: release
2
+
3
+ # The Terp Standard's release seam (ADR 0082, published per ADR 0086): a tag
4
+ # turns into two registry releases (`terp-spec` on PyPI, `@terpjs/spec` on npm)
5
+ # plus a GitHub Release. This workflow makes tagging fail-closed instead of a
6
+ # raw `git push origin v*`:
7
+ # the tag must match the checked-in VERSION (and the package manifests, which
8
+ # the test suite holds to VERSION), the tagged commit must be REACHABLE FROM
9
+ # THE DEFAULT BRANCH (provenance: no releasing an unreviewed side branch or a
10
+ # rewritten commit), the self-consistency suite must pass at the tagged
11
+ # commit, the spec must certify against the reference implementation, and both
12
+ # the publish jobs and the release job are BOUND to the verified commit (a tag
13
+ # moved or deleted mid-workflow is refused, never released). A GitHub Release
14
+ # then documents it with generated notes.
15
+ #
16
+ # Publishing uses Trusted Publishing (OIDC) on both registries — no long-lived
17
+ # token is stored here.
18
+ #
19
+ # tests/test_release_workflow.py holds this file to that contract.
20
+
21
+ on:
22
+ push:
23
+ tags: ["v*"]
24
+
25
+ permissions:
26
+ contents: read
27
+
28
+ # One run per tag ref: a retrigger or a racing duplicate never interleaves
29
+ # with an in-flight verification/release of the same tag.
30
+ concurrency:
31
+ group: release-${{ github.ref }}
32
+ cancel-in-progress: false
33
+
34
+ jobs:
35
+ verify:
36
+ runs-on: ubuntu-latest
37
+ outputs:
38
+ # The commit the checks below actually verified — the release job binds
39
+ # to THIS sha, so a tag force-moved mid-workflow cannot smuggle an
40
+ # unverified commit into the release.
41
+ verified_sha: ${{ steps.provenance.outputs.sha }}
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+ with:
45
+ # Full history: the ancestry check below proves the tagged commit
46
+ # is reachable from the default branch — a shallow clone cannot.
47
+ fetch-depth: 0
48
+ - name: Tag matches the checked-in VERSION
49
+ run: |
50
+ version="${GITHUB_REF_NAME#v}"
51
+ checked_in="$(tr -d '[:space:]' < VERSION)"
52
+ [ "$version" = "$checked_in" ] \
53
+ || { echo "tag $GITHUB_REF_NAME != VERSION ($checked_in)"; exit 1; }
54
+ - name: Tagged commit is reachable from the default branch
55
+ id: provenance
56
+ env:
57
+ DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
58
+ run: |
59
+ # Fail closed at every step: no resolvable default branch, no
60
+ # dereferenceable tag, or no ancestry = no release.
61
+ [ -n "$DEFAULT_BRANCH" ] \
62
+ || { echo "could not resolve the repository default branch"; exit 1; }
63
+ git fetch --no-tags origin \
64
+ "refs/heads/${DEFAULT_BRANCH}:refs/remotes/origin/${DEFAULT_BRANCH}"
65
+ tagged="$(git rev-parse "refs/tags/${GITHUB_REF_NAME}^{commit}")" \
66
+ || { echo "cannot dereference tag $GITHUB_REF_NAME to a commit"; exit 1; }
67
+ git merge-base --is-ancestor "$tagged" "refs/remotes/origin/${DEFAULT_BRANCH}" \
68
+ || { echo "tag $GITHUB_REF_NAME ($tagged) is not reachable from" \
69
+ "'${DEFAULT_BRANCH}' — release tags must point at reviewed," \
70
+ "merged history"; exit 1; }
71
+ echo "sha=$tagged" >> "$GITHUB_OUTPUT"
72
+ - uses: actions/setup-python@v5
73
+ with:
74
+ python-version: "3.12"
75
+ - name: The spec is self-consistent at the tagged commit
76
+ run: |
77
+ pip install pytest
78
+ python -m pytest
79
+
80
+ # A spec release must be certified against the live reference implementation
81
+ # (the same substitution ci.yml runs on every push): a tag can never publish a
82
+ # catalog or corpus no conformant checker exists for. Fail closed — the
83
+ # GitHub Release requires this job.
84
+ certify-against-reference:
85
+ needs: verify
86
+ runs-on: ubuntu-latest
87
+ outputs:
88
+ # The reference commit this release was certified against — recorded in
89
+ # the GitHub Release so the certification claim is reproducible: check
90
+ # out exactly this framework commit, substitute the tagged spec, re-run.
91
+ reference_sha: ${{ steps.reference.outputs.sha }}
92
+ steps:
93
+ - uses: actions/checkout@v4
94
+ with:
95
+ path: spec
96
+ - uses: actions/checkout@v4
97
+ with:
98
+ repository: AITT-NL/terp-framework
99
+ path: framework
100
+ - name: Record the certified reference commit
101
+ id: reference
102
+ run: |
103
+ sha="$(git -C framework rev-parse HEAD)"
104
+ echo "sha=$sha" >> "$GITHUB_OUTPUT"
105
+ echo "Certifying against terp-framework@${sha}" | tee -a "$GITHUB_STEP_SUMMARY"
106
+ - name: Install uv
107
+ uses: astral-sh/setup-uv@v5
108
+ with:
109
+ enable-cache: true
110
+ - name: Set up Python
111
+ run: uv python install 3.13
112
+ - name: Python certification (catalog parity + backend corpus)
113
+ working-directory: framework
114
+ run: |
115
+ uv sync
116
+ uv pip install -e ../spec
117
+ uv run --no-sync pytest tests/architecture/test_spec_catalog.py tests/architecture/test_spec_corpus.py -q
118
+ - uses: actions/setup-node@v4
119
+ with:
120
+ node-version: "22"
121
+ - name: Frontend certification (ESLint adapter corpus + surface + findings)
122
+ working-directory: framework
123
+ run: |
124
+ npm ci
125
+ # Substitute the candidate spec under BOTH scope paths: the rename to
126
+ # @terpjs/spec (ADR 0086) lands here first, so the reference framework
127
+ # may still resolve the legacy @terp/spec until its repin lands. Drop
128
+ # the legacy leg once no consumer resolves it.
129
+ for scope in @terp @terpjs; do
130
+ rm -rf "node_modules/$scope/spec"
131
+ mkdir -p "node_modules/$scope"
132
+ ln -s "$GITHUB_WORKSPACE/spec" "node_modules/$scope/spec"
133
+ done
134
+ npx vitest run packages/frontend/eslint-boundaries
135
+
136
+ # ADR 0086: the standard is published, not only tagged. Both publish jobs
137
+ # require certification (a version no conformant checker exists for can never
138
+ # reach a registry) and check out the VERIFIED COMMIT rather than the tag —
139
+ # a tag force-moved mid-workflow cannot change what gets published. Both are
140
+ # idempotent so a partially failed release is re-runnable.
141
+ publish-pypi:
142
+ needs: [verify, certify-against-reference]
143
+ runs-on: ubuntu-latest
144
+ # Part of the OIDC identity both registries verify: the trusted-publisher
145
+ # configurations name repository + workflow file + this environment, so a
146
+ # publish attempt from anywhere else is refused by the registry itself.
147
+ environment: release
148
+ permissions:
149
+ contents: read
150
+ id-token: write # PyPI Trusted Publishing (OIDC) — no API token stored
151
+ steps:
152
+ - uses: actions/checkout@v4
153
+ with:
154
+ ref: ${{ needs.verify.outputs.verified_sha }}
155
+ - uses: actions/setup-python@v5
156
+ with:
157
+ python-version: "3.12"
158
+ - name: Build the sdist + wheel
159
+ run: |
160
+ pip install build
161
+ python -m build
162
+ - name: Publish to PyPI (trusted publishing)
163
+ # Pinned by digest: this action holds a publishing credential.
164
+ uses: pypa/gh-action-pypi-publish@ba38be9e461d3875417946c167d0b5f3d385a247 # release/v1
165
+ with:
166
+ skip-existing: true
167
+
168
+ publish-npm:
169
+ needs: [verify, certify-against-reference]
170
+ runs-on: ubuntu-latest
171
+ environment: release
172
+ permissions:
173
+ contents: read
174
+ id-token: write # npm Trusted Publishing (OIDC) + provenance
175
+ steps:
176
+ - uses: actions/checkout@v4
177
+ with:
178
+ ref: ${{ needs.verify.outputs.verified_sha }}
179
+ - uses: actions/setup-node@v4
180
+ with:
181
+ node-version: "22"
182
+ registry-url: https://registry.npmjs.org
183
+ # Trusted Publishing (OIDC) needs npm >= 11.5.1; Node 22 ships an older
184
+ # npm. Upgrading lets `npm publish` exchange the id-token for a
185
+ # short-lived registry credential — no stored registry secret.
186
+ - run: npm install -g npm@latest
187
+ - name: Publish @terpjs/spec (public, via Trusted Publishing)
188
+ run: |
189
+ set -eu
190
+ # Data only: no dependencies, no build step — nothing to install
191
+ # before publishing.
192
+ version="${GITHUB_REF_NAME#v}"
193
+ if [ "$(npm view "@terpjs/spec@$version" version 2>/dev/null || true)" = "$version" ]; then
194
+ echo "@terpjs/spec@$version already on the registry — skipping"
195
+ exit 0
196
+ fi
197
+ npm publish --access public --provenance
198
+
199
+ github-release:
200
+ # The Release announces a published standard: it requires both registries
201
+ # (fail closed) so a Release can never point at a version consumers cannot
202
+ # install. Publishing binds to the verified COMMIT; the Release additionally
203
+ # re-verifies the tag IDENTITY below.
204
+ needs: [verify, certify-against-reference, publish-pypi, publish-npm]
205
+ runs-on: ubuntu-latest
206
+ permissions:
207
+ contents: write
208
+ steps:
209
+ - uses: actions/checkout@v4
210
+ - name: The tag still points at the verified commit
211
+ env:
212
+ VERIFIED_SHA: ${{ needs.verify.outputs.verified_sha }}
213
+ run: |
214
+ # Re-resolve the tag from the REMOTE at release time: a tag that
215
+ # was deleted or force-moved between verification and release is
216
+ # refused instead of released.
217
+ [ -n "$VERIFIED_SHA" ] \
218
+ || { echo "no verified sha handed over from the verify job"; exit 1; }
219
+ git fetch --no-tags origin "refs/tags/${GITHUB_REF_NAME}" \
220
+ || { echo "tag $GITHUB_REF_NAME no longer exists on origin"; exit 1; }
221
+ current="$(git rev-parse 'FETCH_HEAD^{commit}')"
222
+ [ "$current" = "$VERIFIED_SHA" ] \
223
+ || { echo "tag $GITHUB_REF_NAME moved after verification" \
224
+ "($current != verified $VERIFIED_SHA) — refusing to release"; exit 1; }
225
+ - name: Create the GitHub Release (generated notes)
226
+ env:
227
+ GH_TOKEN: ${{ github.token }}
228
+ REFERENCE_SHA: ${{ needs.certify-against-reference.outputs.reference_sha }}
229
+ run: |
230
+ # --verify-tag: never create the tag as a side effect — release
231
+ # only an existing remote tag (the one just re-verified above).
232
+ # The certified reference commit makes the claim reproducible.
233
+ gh release create "$GITHUB_REF_NAME" \
234
+ --verify-tag \
235
+ --title "Terp Standard $GITHUB_REF_NAME" \
236
+ --generate-notes \
237
+ --notes "Certified against the reference implementation at [AITT-NL/terp-framework@${REFERENCE_SHA}](https://github.com/AITT-NL/terp-framework/commit/${REFERENCE_SHA})."
@@ -0,0 +1,221 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ # Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ # poetry.lock
109
+ # poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ # pdm.lock
116
+ # pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ # pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # Redis
135
+ *.rdb
136
+ *.aof
137
+ *.pid
138
+
139
+ # RabbitMQ
140
+ mnesia/
141
+ rabbitmq/
142
+ rabbitmq-data/
143
+
144
+ # ActiveMQ
145
+ activemq-data/
146
+
147
+ # SageMath parsed files
148
+ *.sage.py
149
+
150
+ # Environments
151
+ .env
152
+ .envrc
153
+ .venv
154
+ env/
155
+ venv/
156
+ ENV/
157
+ env.bak/
158
+ venv.bak/
159
+
160
+ # Spyder project settings
161
+ .spyderproject
162
+ .spyproject
163
+
164
+ # Rope project settings
165
+ .ropeproject
166
+
167
+ # mkdocs documentation
168
+ /site
169
+
170
+ # mypy
171
+ .mypy_cache/
172
+ .dmypy.json
173
+ dmypy.json
174
+
175
+ # Pyre type checker
176
+ .pyre/
177
+
178
+ # pytype static type analyzer
179
+ .pytype/
180
+
181
+ # Cython debug symbols
182
+ cython_debug/
183
+
184
+ # PyCharm
185
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
186
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
187
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
188
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
189
+ # .idea/
190
+
191
+ # Abstra
192
+ # Abstra is an AI-powered process automation framework.
193
+ # Ignore directories containing user credentials, local state, and settings.
194
+ # Learn more at https://abstra.io/docs
195
+ .abstra/
196
+
197
+ # Visual Studio Code
198
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
199
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
200
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
201
+ # you could uncomment the following to ignore the entire vscode folder
202
+ # .vscode/
203
+ # Temporary file for partial code execution
204
+ tempCodeRunnerFile.py
205
+
206
+ # Ruff stuff:
207
+ .ruff_cache/
208
+
209
+ # PyPI configuration file
210
+ .pypirc
211
+
212
+ # Marimo
213
+ marimo/_static/
214
+ marimo/_lsp/
215
+ __marimo__/
216
+
217
+ # Streamlit
218
+ .streamlit/secrets.toml
219
+
220
+ # Data-only spec package: no runtime deps, the lock is test-env noise.
221
+ uv.lock