iris-devtester 1.12.2__tar.gz → 1.12.3__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 (251) hide show
  1. iris_devtester-1.12.3/CHANGELOG.md +1177 -0
  2. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/MANIFEST.in +1 -0
  3. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/PKG-INFO +1 -1
  4. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/TROUBLESHOOTING.md +10 -1
  5. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/__init__.py +1 -1
  6. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester.egg-info/PKG-INFO +1 -1
  7. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester.egg-info/SOURCES.txt +1 -0
  8. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/pyproject.toml +1 -1
  9. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/AGENTS.md +0 -0
  10. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/CLAUDE.md +0 -0
  11. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/CONSTITUTION.md +0 -0
  12. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/LICENSE +0 -0
  13. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/README.md +0 -0
  14. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/SKILL.md +0 -0
  15. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/GETTING_STARTED.md +0 -0
  16. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/LANGCHAIN_INTEGRATION_QUICKSTART.md +0 -0
  17. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/ROADMAP.md +0 -0
  18. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/SQL_VS_OBJECTSCRIPT.md +0 -0
  19. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/WHATS_NEW_v1.4.0.md +0 -0
  20. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/AGENTIC_SANDBOX_ENHANCEMENT_REPORT.md +0 -0
  21. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/IMPACT_ANALYSIS.md +0 -0
  22. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/IRIS_DEVTESTER_POSITIONING_REPORT.md +0 -0
  23. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/LANGCHAIN_INTEGRATION_STRATEGY.md +0 -0
  24. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/LANGCHAIN_INTEGRATION_TEST_RESULTS.md +0 -0
  25. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/PHASE_2_PLAN.md +0 -0
  26. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/RAG_TEMPLATES_ANALYSIS.md +0 -0
  27. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/README.md +0 -0
  28. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/STRATEGIC_ROADMAP_SUMMARY.md +0 -0
  29. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/archive/feature-009-refactor-plan.md +0 -0
  30. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/BUG_REPORT.md +0 -0
  31. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/EXTRACTION_SUMMARY.md +0 -0
  32. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/FEATURE_006_SUMMARY.md +0 -0
  33. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/PHASE2_RESULTS.md +0 -0
  34. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/PRE_PUBLISH_REVIEW.md +0 -0
  35. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/PROGRESS.md +0 -0
  36. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/PYPI_READINESS.md +0 -0
  37. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/SESSION-INTEGRATION-TESTS.md +0 -0
  38. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/SESSION-SUMMARY.md +0 -0
  39. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/STATUS-002-PIVOTED.md +0 -0
  40. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/STATUS-003-COMPLETE.md +0 -0
  41. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/STATUS.md +0 -0
  42. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/V1_COMPLETION_PLAN.md +0 -0
  43. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/development/V1_RELEASE_SUMMARY.md +0 -0
  44. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/features/WSGI-ASGI-SERVER-SETUP.md +0 -0
  45. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/features/agent-skills.md +0 -0
  46. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/features/dat-fixtures.md +0 -0
  47. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/features/docker-compose.md +0 -0
  48. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/features/performance-monitoring.md +0 -0
  49. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/features/testcontainers.md +0 -0
  50. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/api-contract-synchronization.md +0 -0
  51. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/callin-service-requirement.md +0 -0
  52. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/cpf-merge-and-container-restarts.md +0 -0
  53. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/dat-fixtures-docker-exec-pattern.md +0 -0
  54. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/dat-restore-database-isolation-problem.md +0 -0
  55. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/dbapi-bulk-insert-performance-issue.md +0 -0
  56. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/dbapi-objectscript-limitation.md +0 -0
  57. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/dbapi-password-reset-limitation.md +0 -0
  58. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/dbapi-private-module-myth.md +0 -0
  59. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/docker-hub-image-naming.md +0 -0
  60. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/embedded-python-considerations.md +0 -0
  61. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/feature-002-pivot-summary.md +0 -0
  62. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/integration-test-dbapi-limitation.md +0 -0
  63. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/iris-backup-patterns.md +0 -0
  64. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/iris-connection-access-denied-bug.md +0 -0
  65. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/iris-container-performance.md +0 -0
  66. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/iris-container-readiness.md +0 -0
  67. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/iris-docker-sdk-environment-variables.md +0 -0
  68. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/iris-performance-monitoring-landscape.md +0 -0
  69. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/iris-security-users-api.md +0 -0
  70. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/password-reset-changeflag-fix.md +0 -0
  71. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/rag-templates-production-patterns.md +0 -0
  72. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/sql-task-manager-operations.md +0 -0
  73. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/test-isolation-fix-summary.md +0 -0
  74. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/test-isolation-investigation.md +0 -0
  75. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/docs/learnings/testcontainers-ryuk-lifecycle.md +0 -0
  76. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/examples/01_quickstart.py +0 -0
  77. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/examples/02_connection_management.py +0 -0
  78. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/examples/04_pytest_fixtures.py +0 -0
  79. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/examples/05_ci_cd.py +0 -0
  80. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/examples/08_auto_discovery.py +0 -0
  81. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/examples/09_enterprise.py +0 -0
  82. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/examples/10_docker_compose_integration.py +0 -0
  83. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/examples/langchain_integration_example.py +0 -0
  84. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/__main__.py +0 -0
  85. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/cli/__init__.py +0 -0
  86. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/cli/__main__.py +0 -0
  87. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/cli/connection_commands.py +0 -0
  88. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/cli/container.py +0 -0
  89. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/cli/container_commands.py +0 -0
  90. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/cli/dev_commands.py +0 -0
  91. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/cli/fixture_commands.py +0 -0
  92. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/config/__init__.py +0 -0
  93. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/config/auto_discovery.py +0 -0
  94. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/config/container_config.py +0 -0
  95. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/config/container_state.py +0 -0
  96. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/config/defaults.py +0 -0
  97. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/config/discovery.py +0 -0
  98. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/config/models.py +0 -0
  99. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/config/presets.py +0 -0
  100. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/config/yaml_loader.py +0 -0
  101. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/connections/__init__.py +0 -0
  102. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/connections/auto_discovery.py +0 -0
  103. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/connections/connection.py +0 -0
  104. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/connections/dbapi.py +0 -0
  105. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/connections/jdbc.py +0 -0
  106. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/connections/manager.py +0 -0
  107. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/connections/models.py +0 -0
  108. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/connections/retry.py +0 -0
  109. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/__init__.py +0 -0
  110. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/cpf_manager.py +0 -0
  111. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/dev_instance.py +0 -0
  112. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/iris_container.py +0 -0
  113. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/models.py +0 -0
  114. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/monitor_utils.py +0 -0
  115. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/monitoring.py +0 -0
  116. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/performance.py +0 -0
  117. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/validation.py +0 -0
  118. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/containers/wait_strategies.py +0 -0
  119. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/fixtures/__init__.py +0 -0
  120. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/fixtures/creator.py +0 -0
  121. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/fixtures/loader.py +0 -0
  122. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/fixtures/manifest.py +0 -0
  123. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/fixtures/obj_export.py +0 -0
  124. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/fixtures/validator.py +0 -0
  125. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/integrations/__init__.py +0 -0
  126. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/integrations/langchain.py +0 -0
  127. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/ports/__init__.py +0 -0
  128. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/ports/assignment.py +0 -0
  129. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/ports/exceptions.py +0 -0
  130. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/ports/registry.py +0 -0
  131. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/testing/__init__.py +0 -0
  132. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/testing/fixtures.py +0 -0
  133. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/testing/helpers.py +0 -0
  134. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/testing/models.py +0 -0
  135. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/testing/schema_reset.py +0 -0
  136. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/__init__.py +0 -0
  137. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/container_port.py +0 -0
  138. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/container_status.py +0 -0
  139. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/dbapi_compat.py +0 -0
  140. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/enable_callin.py +0 -0
  141. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/health_checks.py +0 -0
  142. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/iris_container_adapter.py +0 -0
  143. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/namespace.py +0 -0
  144. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/password.py +0 -0
  145. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/progress.py +0 -0
  146. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester/utils/test_connection.py +0 -0
  147. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester.egg-info/dependency_links.txt +0 -0
  148. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester.egg-info/entry_points.txt +0 -0
  149. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester.egg-info/requires.txt +0 -0
  150. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/iris_devtester.egg-info/top_level.txt +0 -0
  151. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/setup.cfg +0 -0
  152. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/__init__.py +0 -0
  153. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/conftest.py +0 -0
  154. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/__init__.py +0 -0
  155. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/cli/test_container_logs_contract.py +0 -0
  156. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/cli/test_container_remove_contract.py +0 -0
  157. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/cli/test_container_restart_contract.py +0 -0
  158. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/cli/test_container_start_contract.py +0 -0
  159. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/cli/test_container_status_contract.py +0 -0
  160. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/cli/test_container_stop_contract.py +0 -0
  161. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/cli/test_container_up_contract.py +0 -0
  162. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_agent_skills.py +0 -0
  163. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_cli_container_commands.py +0 -0
  164. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_cli_fixture_commands.py +0 -0
  165. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_connection_api.py +0 -0
  166. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_container_api.py +0 -0
  167. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_container_integration_contract.py +0 -0
  168. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_container_status_api.py +0 -0
  169. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_container_validation_api.py +0 -0
  170. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_enable_callin_api.py +0 -0
  171. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_fixture_creator_api.py +0 -0
  172. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_fixture_loader_api.py +0 -0
  173. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_fixture_validator_api.py +0 -0
  174. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_iriscontainer_attach.py +0 -0
  175. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_legacy_package_contract.py +0 -0
  176. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_modern_package_contract.py +0 -0
  177. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_monitoring_config_api.py +0 -0
  178. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_package_detection.py +0 -0
  179. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_port_registry_contract.py +0 -0
  180. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_preconfig_contract.py +0 -0
  181. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_reset_verification_contract.py +0 -0
  182. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_resource_monitoring_api.py +0 -0
  183. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_retry_logic_contract.py +0 -0
  184. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_task_manager_api.py +0 -0
  185. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_test_connection_api.py +0 -0
  186. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/contract/test_testing_fixtures_api.py +0 -0
  187. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/e2e/__init__.py +0 -0
  188. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/e2e/test_skill_workflow.py +0 -0
  189. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/__init__.py +0 -0
  190. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/conftest.py +0 -0
  191. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/ports/__init__.py +0 -0
  192. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/ports/test_manual_port_override.py +0 -0
  193. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/ports/test_multi_project_isolation.py +0 -0
  194. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/ports/test_port_exhaustion.py +0 -0
  195. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/ports/test_port_persistence.py +0 -0
  196. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/ports/test_stale_cleanup.py +0 -0
  197. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_bug_fixes.py +0 -0
  198. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_bug_fixes_011.py +0 -0
  199. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_cli_container_integration.py +0 -0
  200. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_connection_integration.py +0 -0
  201. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_container_health_monitor.py +0 -0
  202. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_container_status_integration.py +0 -0
  203. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_container_validation.py +0 -0
  204. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_cpf_merge.py +0 -0
  205. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_cpf_presets.py +0 -0
  206. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_cpf_security.py +0 -0
  207. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_custom_user_remediation.py +0 -0
  208. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_dev_instance.py +0 -0
  209. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_enable_callin_integration.py +0 -0
  210. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_fixture_export_patterns.py +0 -0
  211. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_fixture_performance.py +0 -0
  212. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_fixture_refresh.py +0 -0
  213. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_fixtures_integration.py +0 -0
  214. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_implicit_namespace.py +0 -0
  215. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_iriscontainer_attach_integration.py +0 -0
  216. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_monitor_utils_integration.py +0 -0
  217. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_monitoring_integration.py +0 -0
  218. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_password_preconfig_integration.py +0 -0
  219. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_password_reset_both_editions.py +0 -0
  220. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_password_reset_integration.py +0 -0
  221. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_password_reset_macos.py +0 -0
  222. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_password_reset_timing.py +0 -0
  223. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_password_reset_validation.py +0 -0
  224. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_proactive_password_reset.py +0 -0
  225. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_real_world_problems.py +0 -0
  226. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_reliable_password_reset.py +0 -0
  227. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/integration/test_test_connection_integration.py +0 -0
  228. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/__init__.py +0 -0
  229. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/config/test_config_hierarchy.py +0 -0
  230. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/config/test_container_config.py +0 -0
  231. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/config/test_yaml_loader.py +0 -0
  232. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_auto_discovery.py +0 -0
  233. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_config_discovery.py +0 -0
  234. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_connection_fallback.py +0 -0
  235. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_connection_info.py +0 -0
  236. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_cpf_manager.py +0 -0
  237. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_dev_instance_logic.py +0 -0
  238. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_iris_config.py +0 -0
  239. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_iris_container.py +0 -0
  240. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_manifest.py +0 -0
  241. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_monitoring_policy.py +0 -0
  242. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_namespace_utils.py +0 -0
  243. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_password_preconfig.py +0 -0
  244. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_password_preconfig_unit.py +0 -0
  245. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_performance_metrics.py +0 -0
  246. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_resource_thresholds.py +0 -0
  247. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_retry.py +0 -0
  248. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_schema_models.py +0 -0
  249. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_validation_results.py +0 -0
  250. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/test_wait_strategies.py +0 -0
  251. {iris_devtester-1.12.2 → iris_devtester-1.12.3}/tests/unit/utils/test_iris_container_adapter.py +0 -0
@@ -0,0 +1,1177 @@
1
+ # Changelog
2
+
3
+ All notable changes to iris-devtester will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.12.3] - 2026-02-15 - Documentation Sync
9
+
10
+ ### Changed
11
+
12
+ - **Documentation Parity**: Synchronized PyPI source distribution with the latest Troubleshooting Guide and feature documentation.
13
+ - **Manifest Enhancement**: Explicitly included `CHANGELOG.md` in the PyPI source distribution (`sdist`).
14
+
15
+ ## [1.12.2] - 2026-02-15 - Smart Port Fallback
16
+
17
+ ### Added
18
+
19
+ - **Smart Port Fallback**: Added `--auto-port` flag to `idt container up` and `idt container start` commands.
20
+ - Automatically finds and assigns an available port if the default (1972) is taken.
21
+ - Utilizes the `PortRegistry` to maintain stable assignments across project sessions.
22
+ - Automatically adjusts the WebServer port proportionally when the SuperServer port is shifted.
23
+
24
+ ### Fixed
25
+
26
+ - **Reset Password Support**: Added `IRISContainer.reset_password()` method to support manual password remediation in integration scripts.
27
+
28
+ ## [1.12.1] - 2026-02-15 - Protocol & Discovery Fixes
29
+
30
+ ### Fixed
31
+
32
+ - **Access Denied (Invalid Message)**: Fixed a critical bug in `get_config()` where discovering `0.0.0.0` as the host caused the IRIS Superserver to reject the connection protocol. Now sanitizes `0.0.0.0` and `::` to `localhost` for reliable client-side connectivity.
33
+ - **Attach Validation**: Improved `IRISContainer.attach()` with explicit validation for container names and better error messages when containers are missing or not running.
34
+ - **Type Safety**: Resolved LSP type mismatch for `container_name` in `attach()` and `dev()` methods.
35
+
36
+ ## [1.12.0] - 2026-02-10 - The Dev Instance (Warm Start)
37
+
38
+ ### Added
39
+
40
+ - **The Dev Instance (Warm Start)**: Achieved the project's "North Star" of SQLite-level ergonomics.
41
+ - **Instant Connection**: `get_connection()` now connects in < 100ms by utilizing a persistent background engine.
42
+ - **Managed Lifecycle**: New `idt dev` command group (`up`, `down`, `status`, `logs`) to manage the background engine.
43
+ - **Project Isolation**: Automatic folder-based hashing ensures each project directory gets its own isolated IRIS namespace and database.
44
+ - **Durable Persistence**: Integrated "Durable %SYS" support ensures data survives container restarts and engine upgrades.
45
+ - **Automatic Provisioning**: Calling `get_connection()` will implicitly start the dev engine if it's not running.
46
+ - **Optimized Readiness**: Ultra-fast TCP port probing for immediate connectivity detection.
47
+
48
+ - **Improved Port Management**: Enhanced auto-discovery logic to prioritize the managed dev instance.
49
+
50
+ ### Fixed
51
+
52
+ - **Volume Permissions**: Automated `chown` logic for persistent volumes to prevent UID 51773 (irisowner) conflicts on macOS.
53
+ - **Readiness Reliability**: Improved `wait_until_ready` logic with more robust ObjectScript-based initialization checks.
54
+
55
+ ## [1.11.1] - 2026-02-08 - Core Container Fixes
56
+
57
+ ### Fixed
58
+
59
+ - **Superserver Port Mapping**: Fixed critical bug where non-standard superserver ports (e.g., 31972) were incorrectly mapped host-to-host instead of host-to-container (1972). This fixes connection resets on custom ports.
60
+ - **Container Name Persistence**: Improved handling of `container_name` in CLI and adapter to ensure user-specified names are respected.
61
+
62
+ ## [1.11.0] - 2026-02-08 - Implicit Namespace Creation (SQLite-Level Ergonomics)
63
+
64
+ ### Added
65
+
66
+ - **Implicit Namespace Creation**: Achieved "SQLite-level ergonomics" where `get_connection(namespace="NEW")` automatically creates the namespace if it doesn't exist.
67
+ - Automatically creates database directory and `.dat` file.
68
+ - Configures namespace mappings (Globals/Routines) to the new database.
69
+ - Ensures `%Service_CallIn` is enabled for the new namespace.
70
+ - **Hybrid Smart Default**: Enabled by default for `localhost` (zero-friction dev), explicit opt-in required for remote hosts (production safety).
71
+ - Supported via `IRISConfig.auto_create` and `IRIS_AUTO_CREATE` environment variable.
72
+
73
+ ### Fixed
74
+
75
+ - Improved `get_connection` reliability when connecting to non-existent namespaces.
76
+
77
+ ## [1.10.4] - 2026-02-08 - Critical DBAPI Segfault Fix
78
+
79
+ ### Fixed
80
+
81
+ - **Critical Segfault**: Resolved `SIGSEGV` crash when using `FETCH FIRST N ROWS ONLY` SQL syntax.
82
+ - Modified `dbapi_compat.py` to prefer the stable `intersystems_iris` connection path over the buggy `iris` (`_elsdk_`) path.
83
+ - Both modules are part of `intersystems-irispython`, but `intersystems_iris` provides the stable `_IRISNative` driver.
84
+ - This fix restores stability for SQL pagination and vector-graph operations.
85
+
86
+ ## [1.10.3] - 2026-02-06 - Docker Exec Ownership Fix
87
+
88
+ ### Fixed
89
+
90
+ - **Docker Exec Ownership**: Added `-u irisowner` to all `docker exec` calls that interact with IRIS processes.
91
+ - Fixes "Invalid ownership for ./irisdb" errors in containers where root is the default exec user.
92
+ - Affects password reset, service enablement, connection testing, and fixture operations.
93
+ - Standardizes UID 51773 (irisowner) for all IRIS-specific container interactions.
94
+
95
+ ## [1.10.2] - 2026-02-06 - Fixture System & Enterprise Test Fixes
96
+
97
+ ### Fixed
98
+
99
+ - **Fixture Integration Tests**: All 9 fixture tests now pass
100
+ - Fixed `test_create_validate_load_verify` to properly connect to target namespace
101
+ - Fixed 4 tests that failed due to empty tables validation by adding test data creation
102
+
103
+ - **Enterprise Edition Tests**: All 5 previously-skipped enterprise tests now run and pass
104
+ - Fixed `conftest.py`: Was reading license key file contents instead of passing file path
105
+ - Fixed `test_cpf_merge.py`: Same license key path bug
106
+ - Added ARM64-compatible enterprise image selection for Apple Silicon
107
+
108
+ - **Test Infrastructure**:
109
+ - Fixed flaky `test_wait_function_with_timeout` timing assertion (4.0s → 5.0s tolerance)
110
+ - All 342 unit tests pass
111
+ - All 11 enterprise+community edition tests pass (0 skipped)
112
+
113
+ ### Changed
114
+
115
+ - Enterprise tests now use `containers.intersystems.com/intersystems/iris:2025.1` on ARM64
116
+
117
+ ## [1.10.1] - 2026-02-05 - CLI Documentation & Custom Images
118
+
119
+ ### Added
120
+
121
+ - **`--image` option for `container up`**: Use any Docker image, overriding edition defaults
122
+ - Example: `iris-devtester container up --image myregistry/iris:2024.1`
123
+ - Example: `iris-devtester container up --image intersystemsdc/iris-community:2024.1-zpm`
124
+ - Useful for custom registries, specific versions, or pre-configured images
125
+
126
+ ### Changed
127
+
128
+ - **CLI Help Text**: Improved `--help` output for better AI agent and user discoverability
129
+ - Main help now explains what the tool does, container editions, quick start, and common workflows
130
+ - Added "FOR AI AGENTS" section with exit codes and JSON output guidance
131
+ - Container group help now includes edition comparison and quick start commands
132
+ - All help text now properly formatted with `\b` markers (no more broken line wraps)
133
+ - Added note about using docker-compose for multi-container setups
134
+
135
+ ### Documentation
136
+
137
+ - CLI is now self-documenting enough for AI agents to use without external docs
138
+ - All commands support `--help` for detailed options
139
+ - `container list --format json` provides machine-readable output
140
+ - Added "When to Use docker-compose Instead" section to GETTING_STARTED.md
141
+ - Covers sharding, mirroring, ECP, and multi-service stacks
142
+ - Explains iris-devtester is for single-container management only
143
+
144
+ ## [1.10.0] - 2026-01-31 - Feature 024: Canonical Container Editions
145
+
146
+ ### Added
147
+
148
+ - **Three Canonical Container Editions**:
149
+ - **Community**: Full IRIS Community Edition (~3.5GB) - `IRISContainer.community()`
150
+ - **Enterprise**: Licensed IRIS - `IRISContainer.enterprise(license_key=...)`
151
+ - **Light**: Minimal for CI/CD (~580MB) - `IRISContainer.light()` - NEW!
152
+
153
+ - **Light Edition** (`caretdev/iris-community-light`):
154
+ - 85% smaller than full community (580MB vs 3.5GB)
155
+ - Removes: Interoperability, Management Portal, DeepSee/BI, CSP/REST
156
+ - Keeps: SQL engine, DBAPI, JDBC, ODBC, SQLAlchemy-IRIS
157
+ - Multi-arch: ARM64 and x86 supported
158
+ - Ideal for CI/CD pipelines where startup time matters
159
+ - Maintainer: CaretDev (Dmitry Maslennikov)
160
+
161
+ - **CLI `--edition` option**: `iris-devtester container up --edition light|community|enterprise`
162
+ - **CLI `container list` command**: Shows all IRIS containers with status, edition, ports, age
163
+ - **Standardized container naming**: All CLI commands accept optional `CONTAINER_NAME` with default `iris_db`
164
+
165
+ ### Changed
166
+
167
+ - `IRISContainer.community()` now explicitly documents size (~3.5GB)
168
+ - `IRISContainer.enterprise()` now includes better license key handling
169
+ - Container config now supports `edition` field: `"community"`, `"enterprise"`, `"light"`
170
+ - README updated with Container Editions section
171
+
172
+ ### Technical Details
173
+
174
+ - Light edition image: `caretdev/iris-community-light:latest-em`
175
+ - Default tag for light: `latest-em` (production-ready)
176
+ - All editions verified for DBAPI connectivity
177
+
178
+ ## [1.9.3] - 2026-01-30 - CLI Container Naming
179
+
180
+ ### Added
181
+
182
+ - **`--name` option for `container up`**: Specify custom container name
183
+ - **Default name warning**: Warns when using default `iris_db` with existing container
184
+
185
+ ### Fixed
186
+
187
+ - **Pydantic deprecation**: Migrated from `class Config:` to `model_config = ConfigDict(...)`
188
+ - **Python 3.9 compatibility**: Fixed `str | Path` → `Union[str, Path]` type hints
189
+ - **mypy type errors**: Resolved various type annotation issues
190
+
191
+ ## [1.9.2] - 2026-01-29 - IRIS Session Instance Name Fix
192
+
193
+ ### Fixed
194
+
195
+ - **CRITICAL**: Fixed IRIS session instance name from `iris` to `IRIS` (uppercase)
196
+ - Affected files: `password.py`, `health_checks.py`
197
+ - Error symptom: "Access Denied" when DBAPI connections failed due to unexpired passwords
198
+ - Root cause: `iris session iris` → `iris session IRIS`
199
+ - All password reset and CallIn enable commands now work correctly
200
+
201
+ ## [1.8.1] - 2026-01-17 - Bug Fixes & API Contract Synchronization
202
+
203
+ ### Fixed
204
+
205
+ - **CLI `fixture create` Container Support**: Added missing `--container` parameter to specify source IRIS instance.
206
+ - **API Contract Synchronization**: Fixed method signatures and return types across `FixtureCreator`, `DATFixtureLoader`, and `IRISContainer` to align with public contract tests.
207
+ - **Contract Test Compatibility**: Implemented a robust compatibility layer in `iris_devtester.testing` and `iris_devtester.connections` to support legacy assistant expectations.
208
+ - **Test Performance & Stability**:
209
+ - Optimized `IRISContainer` startup logic to prevent hangs in restricted environments.
210
+ - Improved `wait_for_iris_ready` timing reliability.
211
+ - Added `clean_port_registry` fixture for integration test isolation.
212
+
213
+ ## [1.8.0] - 2026-01-05 - Feature 022: CPF Merge Support
214
+
215
+ ### Added
216
+
217
+ - **Declarative Configuration (`with_cpf_merge`)**: New method for `IRISContainer` to apply CPF snippets during container boot.
218
+ - **Optimization Presets**: Added `CPFPreset.CI_OPTIMIZED` and `CPFPreset.SECURE_DEFAULTS` for instant setup.
219
+ - **2025 Agent Skills Standard**: Standardized on root-level `SKILL.md` and consolidated assistant triggers.
220
+ - **Consolidated CLI & UI**: Unified agent commands into `/idt` (Claude) and `@idt` (Cursor) for zero clutter.
221
+
222
+ ## [1.5.2] - 2025-12-24 - Performance & Reliability
223
+
224
+ ### Fixed
225
+
226
+ - **Password Reset Performance Regression** - Reduced from 55s to ~3s
227
+ - `settle_delay`: 12s → 2s (correct API doesn't need long waits)
228
+ - `initial_backoff_ms`: 3000 → 1000 (faster retries)
229
+ - `max_retries`: 5 → 3 (fewer attempts needed)
230
+ - `timeout_ms`: 60000 → 10000 (10s hard cap, NFR-004)
231
+
232
+ - **Stuck Password State Detection** - New `check_password_state()` function
233
+ - Detects containers with `ChangePassword=1` stuck after failed resets
234
+ - Pre-flight check warns before reset attempt
235
+ - Post-reset verification confirms flag was cleared
236
+ - Fails fast with remediation steps if container needs restart
237
+
238
+ - **ObjectScript Syntax Fixes** - Fixed `$$ISOK` macro issues
239
+ - Changed to `$Select(sc=1:1,1:0)` for interactive ObjectScript compatibility
240
+ - Affects: `export_classes()`, `import_classes()`, `export_global()`, `import_global()`, `export_package()`
241
+
242
+ - **Unit Test Fixes** - Fixed `iris_devtester` → `iris_devtester` in 10+ test files
243
+
244
+ ### Added
245
+
246
+ - **Container Performance Documentation** - `docs/learnings/iris-container-performance.md`
247
+ - Root cause analysis of IRIS container startup bottlenecks
248
+ - Optimization strategies: namespace isolation, container reuse, pre-baked images
249
+ - Quick wins for faster development cycles
250
+
251
+ ## [1.7.5] - 2026-01-04 - PyPI Link & Metadata Finalization
252
+
253
+ ### Fixed
254
+
255
+ - **Absolute Documentation Links**: Converted all documentation links in `README.md` to absolute GitHub URLs to fix broken navigation on the PyPI project page.
256
+ - **PyPI Meta Data**: Removed redundant license metadata fields that were causing distribution validation errors.
257
+ - **Metadata Consistency**: Synchronized version strings across `pyproject.toml`, `__init__.py`, and `SKILL.md`.
258
+
259
+ ## [1.7.4] - 2026-01-04 - Metadata & Link Finalization (Internal)
260
+
261
+ ### Fixed
262
+
263
+ - **Broken Documentation Links**: Fixed all references to the old `iris-devtools` name across README and documentation files.
264
+ - **PyPI Meta Data**: Corrected repository and documentation URLs in `pyproject.toml`.
265
+ - **Concise README**: Shortened the README for better visibility on PyPI, moving detailed guides to the `docs/` directory.
266
+ - **Metadata Consistency**: Synchronized `__init__.py`, `pyproject.toml`, and `SKILL.md` version strings.
267
+
268
+ ## [1.7.1] - 2026-01-04 - Documentation & Metadata Fixes (Internal)
269
+
270
+ ## [1.7.0] - 2026-01-02 - Feature 021: Hierarchical Agent Skills
271
+
272
+ ### Added
273
+
274
+ - **Hierarchical Agent Skill Manifest (`SKILL.md`)**
275
+ - Root-level guide for AI coding assistants following the "Progressive Disclosure" pattern.
276
+ - **Level 1: Onboarding** - Automated pytest integration and conftest templates.
277
+ - **Level 2: Operations** - Reliable container and connection management patterns.
278
+ - **Level 3: Advanced** - DAT fixtures and resource monitoring guidance.
279
+ - **Level 4: Debugging** - Autonomous troubleshooting for macOS latency and security flags.
280
+ - **Project Integration Module**: Specific instructions for agents to incorporate the library into new/existing repositories.
281
+ - **Enhanced Distribution**: Added `MANIFEST.in` to ensure AI metadata files (`SKILL.md`, `AGENTS.md`, `CLAUDE.md`) ship with the package.
282
+
283
+ ### Fixed
284
+
285
+ - **Critical Bug Fixes (Feature 020)**
286
+ - **Parametrized Password Reset**: `reset_password_if_needed` now supports custom users (e.g., `SuperUser`).
287
+ - **Robust Security API**: Switched to `Security.Users.Modify` for clearing `ChangePassword` flags in IRIS 2024.1+.
288
+ - **Deterministic Readiness**: `IRISReadyWaitStrategy` now uses application-level checks via `docker exec`.
289
+ - **Fixture Refresh Support**: `DATFixtureLoader` now supports `force_refresh=True` to clear existing namespaces.
290
+ - **CLI Version Reporting**: Fixed CLI reporting stale version (`1.2.0`); now dynamically uses library version.
291
+ - **Container Status Validation**: Removed overly strict timestamp validators in `ContainerState` that caused crashes on restarted containers.
292
+ - **Architecture Mismatch Detection**: Improved Docker error translation to explicitly detect and report CPU architecture mismatches (e.g., Apple Silicon).
293
+ - **Flexible Image Configuration**: Added `image` key to configuration to support custom registries and full image names without forced prefixes.
294
+ - **False Negative Reporting**: Fixed CLI `container up` reporting failure after successful creation due to incorrect exception handling.
295
+
296
+ ## [1.6.0] - 2026-01-02 - Feature 019: Agent Skills
297
+
298
+ ### Added
299
+
300
+ - **Agent Skills (Feature 019)**
301
+ - New "Skills" documentation for AI coding assistants (Claude, Cursor, Copilot)
302
+ - **Claude Code**: `.claude/commands/` support (`/container`, `/connection`, `/fixture`, `/troubleshoot`)
303
+ - **Cursor IDE**: `.cursor/rules/` support (`@iris-container`, `@iris-connection`, etc.)
304
+ - **GitHub Copilot**: `.github/copilot-instructions.md` configuration
305
+ - **Documentation**: New `docs/features/agent-skills.md` guide
306
+ - **Verification**: Contract tests ensuring skill file integrity
307
+
308
+ ## [1.5.3] - Feature 017: IRIS Source Insights
309
+
310
+ ### Added
311
+
312
+ - **Container Health: $SYSTEM.Monitor.State() Integration (US6)**
313
+ - Added Layer 4 to `wait_for_healthy()`: IRIS-level health check using `$SYSTEM.Monitor.State()`
314
+ - New `check_iris_monitor_state()` function for checking true IRIS readiness
315
+ - New `wait_for_iris_healthy()` function for polling until IRIS is ready
316
+ - New `IrisHealthState` enum matching IRIS API values (0=OK, 1=Warning, 2=Error, 3=Fatal)
317
+ - New `IrisMonitorResult` dataclass for structured health check results
318
+ - Source: `docs/learnings/iris-container-readiness.md`
319
+
320
+ - **Password Reset: Correct IRIS API Patterns (US5)**
321
+ - Fixed ObjectScript to use `ChangePassword` property (not `ChangePasswordAtNextLogin`)
322
+ - Fixed ObjectScript to use `PasswordExternal` for setting passwords (triggers PBKDF2 hashing)
323
+ - Added `AccountNeverExpires=1` to password reset pattern for reliability
324
+ - Source: `docs/learnings/iris-security-users-api.md`
325
+
326
+ - **DAT Fixture Export/Import Utilities (US7)**
327
+ - New `export_classes()` function using `$SYSTEM.OBJ.Export`
328
+ - New `import_classes()` function using `$SYSTEM.OBJ.Import`
329
+ - New `export_global()` function using `##class(%Library.Global).Export` (%GOF format)
330
+ - New `import_global()` function using `##class(%Library.Global).Import`
331
+ - New `export_package()` function using `$SYSTEM.OBJ.ExportPackage`
332
+ - New `ExportResult` and `ImportResult` dataclasses for structured results
333
+ - Source: `docs/learnings/iris-backup-patterns.md`
334
+
335
+ - **Documentation: IRIS Source Code Insights**
336
+ - New `docs/learnings/iris-security-users-api.md` - Password management patterns from Security.Users
337
+ - New `docs/learnings/iris-container-readiness.md` - Container health check patterns from SYS.Container
338
+ - New `docs/learnings/iris-backup-patterns.md` - Export/Import patterns for DAT fixtures
339
+ - Updated `CLAUDE.md` with ObjectScript Patterns section for AI assistant reference
340
+
341
+ ### Changed
342
+
343
+ - **health_checks.py**: wait_for_healthy() now includes 4 layers (was 3)
344
+ - Layer 1: Container running
345
+ - Layer 2: Docker health check
346
+ - Layer 3: SuperServer port accessible
347
+ - Layer 4: IRIS Monitor.State() = OK (NEW)
348
+
349
+ ### Technical Details
350
+
351
+ **$SYSTEM.Monitor.State() Return Values**:
352
+ - 0: OK - System healthy, ready for connections
353
+ - 1: Warning - Minor issues, may still work
354
+ - 2: Error - Significant problems, connections may fail
355
+ - 3: Fatal - Critical failure, do not use
356
+
357
+ **Why This Matters**: A container with SuperServer port open is NOT necessarily ready.
358
+ The Monitor.State() API checks true IRIS-level health, preventing intermittent
359
+ connection failures during container startup.
360
+
361
+ ## [1.5.0] - 2025-11-24
362
+
363
+ ### Fixed
364
+
365
+ - **CRITICAL FIX (Feature 015): Use Correct IRIS API for Password Reset**
366
+ - **Root Cause**: Code was using `ChangePassword()` method which **DOES NOT EXIST** in IRIS
367
+ - Error: `<METHOD DOES NOT EXIST> *ChangePassword,Security.Users`
368
+ - Password reset would return "success" but password was never actually changed
369
+ - Verification was connecting to wrong port (testcontainers random ports vs hardcoded 1972)
370
+ - **Correct Implementation**: Use official `Get()/Modify()` pattern with property arrays
371
+ - `Get(username, .properties)` - Retrieve user properties (pass by reference)
372
+ - `Set properties("Password") = password` - Set the password field
373
+ - `Set properties("ChangePassword") = 0` - Prevent password change prompt
374
+ - `Set properties("PasswordNeverExpires") = 1` - Prevent future expiration
375
+ - `Modify(username, .properties)` - Commit changes atomically
376
+ - **Performance Improvement**: 840x faster (0.08s vs 67s of failed retries)
377
+ - **Success Rate**: 100% (4/4 integration tests passing)
378
+ - **Location**: `iris_devtester/utils/password_reset.py:82-114`
379
+
380
+ ### Changed
381
+
382
+ - **password_reset.py**: Replaced two-step approach with single atomic operation
383
+ - Removed non-existent `ChangePassword()` call
384
+ - Used correct `Get() + Modify()` pattern with Password field
385
+ - Added `PasswordNeverExpires=1` for medical-grade reliability
386
+ - Simplified from 2 docker exec calls to 1 atomic operation
387
+ - **test_password_reset_integration.py**: Fixed testcontainers port mismatch
388
+ - All `reset_password()` calls now include correct host/port parameters
389
+ - Tests use actual exposed port from testcontainers instead of hardcoded 1972
390
+
391
+ ### Technical Details
392
+
393
+ **ObjectScript is Position-Based (NOT Keyword-Based)**:
394
+ ```objectscript
395
+ // WRONG - This method does NOT exist!
396
+ ##class(Security.Users).ChangePassword("_SYSTEM", "password")
397
+
398
+ // RIGHT - Use Get/Modify pattern
399
+ Set u="_SYSTEM"
400
+ Do ##class(Security.Users).Get(u,.p) // .p = pass by reference
401
+ Set p("Password")="password"
402
+ Set p("ChangePassword")=0
403
+ Set p("PasswordNeverExpires")=1
404
+ Write ##class(Security.Users).Modify(u,.p)
405
+ Halt
406
+ ```
407
+
408
+ **Key Learnings**:
409
+ - The `.properties` syntax means "pass by reference" (required for Get/Modify)
410
+ - Property names are case-sensitive
411
+ - `Write` statement outputs the return value (1 = success)
412
+ - Always end with `Halt` to exit cleanly
413
+
414
+ ### Documentation
415
+
416
+ - **CLAUDE.md**: Added new "ObjectScript Patterns" section with critical learnings
417
+ - **password_reset.py**: Updated docstrings to reflect correct API usage
418
+ - **README.md**: Updated to reflect accurate implementation
419
+
420
+ ### Migration from v1.4.x
421
+
422
+ No code changes required - v1.5.0 is a drop-in replacement. Just upgrade:
423
+ ```bash
424
+ pip install --upgrade iris-devtester
425
+ ```
426
+
427
+ **What Changed Internally**:
428
+ - Password reset now actually works (was silently failing in v1.4.x)
429
+ - Verification happens on correct port (testcontainers-aware)
430
+ - Uses official IRIS API instead of non-existent methods
431
+
432
+ ## [1.4.5] - 2025-11-20
433
+
434
+ ### Fixed
435
+
436
+ - **CRITICAL HOTFIX (Feature 015): Dual User Hardening - Actually fixes v1.4.2-v1.4.4 bug**
437
+ - **Root Cause of v1.4.2-v1.4.4 Failures**: Only hardening the created user, not SuperUser
438
+ - Tests create a user (e.g., "test") and harden it
439
+ - But connections use SuperUser credentials
440
+ - IRIS greets SuperUser connections with "Password change required"
441
+ - DBAPI clients don't implement password-change handshake → Access Denied
442
+ - Bug persisted through THREE releases (v1.4.2, v1.4.3, v1.4.4)
443
+ - **Actual Fix**: Dual user hardening (harden BOTH target user AND SuperUser)
444
+ - Idempotent user creation (check Exists() before Create())
445
+ - Clear ChangePasswordAtNextLogin=0 for BOTH users
446
+ - Call UnExpireUser() for BOTH users
447
+ - SetPassword() for BOTH users
448
+ - **Impact**: 100% success rate on macOS (v1.4.2-v1.4.4 had ~50% failure rate)
449
+ - **Location**: `iris_devtester/utils/password_reset.py`
450
+
451
+ ### Changed
452
+
453
+ - **password_reset.py**: Implemented dual user hardening pattern
454
+ - New helper function: `_harden_iris_user()` for idempotent user hardening
455
+ - Hardens target user with provided credentials
456
+ - Also hardens SuperUser (unless target user IS SuperUser)
457
+ - Uses chr(34) for embedded quotes to avoid shell escaping issues
458
+ - Maintains all v1.4.4 fixes (IPv4 forcing, 4s settle delay on macOS)
459
+
460
+ ### Technical Details
461
+
462
+ **Why v1.4.2-v1.4.4 Failed**:
463
+ All three versions only hardened the target user. When tests created a user but connected as SuperUser, the server still had SuperUser flagged with "ChangePasswordAtNextLogin" or expired, causing "Access Denied" errors.
464
+
465
+ **v1.4.5 Dual Hardening Pattern**:
466
+ ```python
467
+ # Harden the target user
468
+ _harden_iris_user(container, username="test", password="TESTPWD")
469
+
470
+ # Also harden SuperUser (unless it's the same as target)
471
+ if username != "SuperUser":
472
+ _harden_iris_user(container, username="SuperUser", password="SYS")
473
+ ```
474
+
475
+ **ObjectScript Pattern**:
476
+ ```objectscript
477
+ set u="{username}",
478
+ p("ChangePasswordAtNextLogin")=0,
479
+ p("PasswordNeverExpires")=1,
480
+ if ##class(Security.Users).Exists(u)=0
481
+ do ##class(Security.Users).Create(u,"%ALL","{password}")
482
+ do ##class(Security.Users).UnExpireUser(u)
483
+ do ##class(Security.Users).Modify(u,.p)
484
+ do ##class(Security.Users).SetPassword(u,"{password}")
485
+ ```
486
+
487
+ ### Why This Fix Works
488
+
489
+ The dual hardening ensures that:
490
+ 1. The created test user is properly configured (if using that user)
491
+ 2. SuperUser is ALSO properly configured (if using SuperUser)
492
+ 3. No matter which user the test connects as, it will work
493
+ 4. Idempotent creation means it's safe to run multiple times
494
+
495
+ ### Migration from v1.4.2-v1.4.4
496
+
497
+ No code changes required - v1.4.5 is a drop-in replacement. Just upgrade:
498
+ ```bash
499
+ pip install --upgrade iris-devtester
500
+ ```
501
+
502
+ ## [1.4.4] - 2025-11-20
503
+
504
+ ### Fixed
505
+
506
+ - **HOTFIX (Feature 015): Fixed actual root causes of macOS password reset failures**
507
+ - **Root Cause #1**: IRIS flagging account as `ChangePasswordAtNextLogin=1` after password reset
508
+ - DBAPI clients don't implement server-side password-change handshake
509
+ - Clients surface "Invalid Message received; ... Password change required / Access Denied"
510
+ - **Fix**: Explicitly set `ChangePasswordAtNextLogin=0` via `Security.Users.Modify()`
511
+ - **Root Cause #2**: User account expiration not being cleared
512
+ - **Fix**: Call `Security.Users.UnExpireUser()` before setting password
513
+ - **Root Cause #3**: IPv6 localhost resolution on macOS causing auth failures
514
+ - macOS resolves "localhost" to ::1 (IPv6) which can trigger auth issues
515
+ - **Fix**: Force IPv4 (127.0.0.1) on macOS via platform detection
516
+ - **Root Cause #4**: Security metadata propagation delay on Docker Desktop/macOS
517
+ - IRIS security subsystem lags 4-6 seconds after SetPassword/UnExpire on macOS VM
518
+ - **Fix**: Add 4-second settle delay on macOS after password reset
519
+ - **Impact**: These fixes address the actual problem (v1.4.3 only added retry logic which masked symptoms)
520
+ - **Location**: `iris_devtester/utils/password_reset.py`
521
+
522
+ ### Changed
523
+
524
+ - **password_reset.py**: Updated ObjectScript to properly configure IRIS security state
525
+ - Now calls `UnExpireUser()` to clear expiration
526
+ - Sets `ChangePasswordAtNextLogin=0` to prevent forced password change on next login
527
+ - Uses `SetPassword()` separately from property modification (proper IRIS API pattern)
528
+ - Auto-detects macOS and forces IPv4 (127.0.0.1) instead of localhost
529
+ - Adds 4s settle delay on macOS for security metadata propagation
530
+
531
+ ### Technical Details
532
+
533
+ **Previous Implementation (v1.4.3)**:
534
+ ```objectscript
535
+ do ##class(Security.Users).Get("{user}",.p)
536
+ set p("Password")="{password}"
537
+ set p("PasswordNeverExpires")=1
538
+ do ##class(Security.Users).Modify("{user}",.p)
539
+ ```
540
+ **Problem**: Didn't clear ChangePasswordAtNextLogin flag or user expiration state.
541
+
542
+ **New Implementation (v1.4.4)**:
543
+ ```objectscript
544
+ do ##class(Security.Users).UnExpireUser("{user}")
545
+ do ##class(Security.Users).Get("{user}",.p)
546
+ set p("ChangePasswordAtNextLogin")=0
547
+ set p("PasswordNeverExpires")=1
548
+ do ##class(Security.Users).Modify("{user}",.p)
549
+ do ##class(Security.Users).SetPassword("{user}","{password}")
550
+ ```
551
+ **Fix**: Properly clears all security flags that cause "Password change required" errors.
552
+
553
+ **IPv4 Forcing (macOS only)**:
554
+ ```python
555
+ hostname = os.getenv("IRIS_DEVTESTER_HOST") or (
556
+ "127.0.0.1" if platform.system() == "Darwin" else "localhost"
557
+ )
558
+ ```
559
+
560
+ **Settle Delay (macOS only)**:
561
+ ```python
562
+ if platform.system() == "Darwin":
563
+ time.sleep(4.0) # Wait for security metadata propagation
564
+ ```
565
+
566
+ ### Why v1.4.3 Didn't Fix It
567
+
568
+ v1.4.3 added connection-based verification with retry logic, which is valuable for diagnostics but doesn't address the root cause. The retry logic just repeatedly attempted connections to a broken security state. This hotfix actually fixes the security state itself.
569
+
570
+ ## [1.4.3] - 2025-11-20
571
+
572
+ ### Fixed
573
+
574
+ - **Bug Fix (Feature 015): Password Reset Reliability on macOS**
575
+ - Fixed critical race condition where `reset_password()` returned success but password not yet available for connections
576
+ - Root cause: macOS Docker Desktop VM-based networking has 4-6 second delay vs Linux's <1 second
577
+ - Previous behavior: `time.sleep(2)` insufficient → "Access Denied" errors despite success status
578
+ - New behavior: Connection-based verification with retry logic and exponential backoff
579
+ - **Impact**: 100% success rate on macOS (previously ~50% failure rate)
580
+ - **Performance**: Completes within 10 seconds (NFR-004), typically 3-7 seconds on macOS
581
+ - **Backward Compatible**: Returns `PasswordResetResult` that unpacks to `(bool, str)` tuple
582
+
583
+ - **New Module**: `iris_devtester/utils/password_verification.py`
584
+ - `PasswordResetResult` dataclass with verification metadata (attempts, elapsed time, error type)
585
+ - `VerificationConfig` dataclass with retry settings (max_retries=3, timeout_ms=10000, exponential backoff)
586
+ - `verify_password_via_connection()` - Verify password via DBAPI connection attempt
587
+ - `classify_error()` - Distinguish retryable vs non-retryable errors
588
+ - Exponential backoff: 100ms → 200ms → 400ms between retries
589
+ - Early exit on success (no unnecessary retries)
590
+ - Fail fast on non-retryable errors (connection refused, network unreachable)
591
+
592
+ ### Changed
593
+
594
+ - **utils/password_reset.py**: Added connection-based verification
595
+ - `reset_password()` now verifies password via connection before returning success
596
+ - Replaced `time.sleep(2)` with retry loop + exponential backoff
597
+ - Returns `PasswordResetResult` with enhanced metadata (backward compatible with tuple unpacking)
598
+ - Logs verification attempts and timing for diagnostics (Constitutional Principle #7)
599
+ - Respects 10-second hard timeout (NFR-004)
600
+ - Constitutional error messages with structured failure details
601
+
602
+ ### Added
603
+
604
+ - **Comprehensive Testing** (12 contract tests + 10 integration tests)
605
+ - Contract tests verify FR-002 (password verification before success)
606
+ - Contract tests verify FR-007 (retry with exponential backoff)
607
+ - Contract tests verify NFR-004 (10-second timeout)
608
+ - macOS-specific integration tests for Docker Desktop compatibility
609
+ - Cross-platform timing tests
610
+ - Success rate validation tests (NFR-001: ≥99% success rate)
611
+ - **Location**: `tests/contract/test_reset_verification_contract.py` (5 tests)
612
+ - **Location**: `tests/contract/test_retry_logic_contract.py` (7 tests)
613
+ - **Location**: `tests/integration/test_password_reset_macos.py` (5 tests)
614
+ - **Location**: `tests/integration/test_password_reset_timing.py` (5 tests)
615
+
616
+ ## [1.3.0] - 2025-01-15
617
+
618
+ ### Added
619
+
620
+ - **Feature 012: DBAPI Package Compatibility**
621
+ - Support for both modern (`intersystems-irispython` v5.3.0+) and legacy (`intersystems-iris` v3.0.0+) IRIS Python packages
622
+ - Automatic package detection with zero configuration (Constitutional Principle #4)
623
+ - Modern package prioritized, legacy package as fallback
624
+ - Version validation ensures minimum compatible versions
625
+ - Constitutional error messages (What/Why/How/Docs format) per Principle #5
626
+ - Package detection logging at INFO level (FR-010) - shows which package and version detected
627
+ - Detection performance <10ms overhead (NFR-001)
628
+ - **Location**: `iris_devtester/utils/dbapi_compat.py` (new compatibility layer)
629
+ - **Impact**: Fixes AttributeError with modern package, maintains backward compatibility with legacy package
630
+
631
+ - **New Module**: `iris_devtester/utils/dbapi_compat.py`
632
+ - `DBAPIPackageInfo` dataclass for package metadata
633
+ - `detect_dbapi_package()` - Try/except import chain (modern first, legacy fallback)
634
+ - `validate_package_version()` - Semantic version validation
635
+ - `DBAPIConnectionAdapter` - Singleton adapter for zero-overhead connections
636
+ - `get_connection()` - Public API for connections
637
+ - `get_package_info()` - Public API for package metadata
638
+ - `DBAPIPackageNotFoundError` - Constitutional error when no package installed
639
+
640
+ ### Changed
641
+
642
+ - **connections/dbapi.py**: Updated to use compatibility layer
643
+ - `is_dbapi_available()` now detects both modern and legacy packages
644
+ - `create_dbapi_connection()` uses `get_connection()` from dbapi_compat
645
+ - Logs package name and version when connecting (FR-010)
646
+
647
+ - **connections/connection.py**: Updated error messages
648
+ - Mentions both modern and legacy packages
649
+ - Provides installation options for both
650
+ - Includes documentation link
651
+
652
+ - **connections/manager.py**: Enhanced package logging
653
+ - Auto mode logs detected package with version and detection time
654
+ - Example: "✓ Connected using DBAPI - intersystems-irispython v5.3.0 (detected in 2.45ms)"
655
+ - Error messages updated to mention both packages
656
+ - All error messages include documentation links
657
+
658
+ ### Fixed
659
+
660
+ - **AttributeError with modern package**: Fixed compatibility issue when using `intersystems-irispython`
661
+ - Previous code only supported legacy `intersystems-iris` package
662
+ - Modern package uses different import path (`intersystems_iris.dbapi._DBAPI` vs `iris.irissdk`)
663
+ - Now automatically detects and uses whichever package is installed
664
+
665
+ ### Technical Details
666
+
667
+ - **Package Detection Strategy**: Try/except import chain
668
+ 1. Try modern package: `intersystems_iris.dbapi._DBAPI`
669
+ 2. Fall back to legacy: `iris.irissdk`
670
+ 3. Raise constitutional error if neither available
671
+
672
+ - **Version Requirements**:
673
+ - Modern: `intersystems-irispython >= 5.3.0`
674
+ - Legacy: `intersystems-iris >= 3.0.0`
675
+
676
+ - **Performance**:
677
+ - Detection overhead: <10ms (measured via `time.perf_counter()`)
678
+ - Zero connection overhead: Direct function call via singleton adapter
679
+ - Package info cached at module level
680
+
681
+ - **Logging**:
682
+ - INFO: Package detected successfully
683
+ - DEBUG: Fallback from modern to legacy
684
+ - ERROR: No package available
685
+
686
+ ### Constitutional Compliance
687
+
688
+ - **Principle #2**: DBAPI First - Maintains performance, now with both packages
689
+ - **Principle #4**: Zero Configuration Viable - Automatic package detection
690
+ - **Principle #5**: Fail Fast with Guidance - Constitutional error format throughout
691
+ - **Principle #7**: Medical-Grade Reliability - 95%+ test coverage maintained
692
+
693
+ ### Functional Requirements Satisfied
694
+
695
+ - FR-001: Detect modern package (intersystems-irispython)
696
+ - FR-002: Detect legacy package (intersystems-iris) as fallback
697
+ - FR-003: Prioritize modern package when both installed
698
+ - FR-004: Version validation (modern >= 5.3.0, legacy >= 3.0.0)
699
+ - FR-005: Constitutional error when no package installed
700
+ - FR-006: Backward compatibility (no breaking changes)
701
+ - FR-007: Update connections module
702
+ - FR-008: Update fixtures module (via connection delegation)
703
+ - FR-009: Update testing utilities (via connection delegation)
704
+ - FR-010: Logging - shows package name and version
705
+
706
+ ### Non-Functional Requirements Satisfied
707
+
708
+ - NFR-001: Performance - <10ms detection, zero connection overhead
709
+ - NFR-002: Error Messages - Constitutional format (What/Why/How/Docs)
710
+ - NFR-003: Test Coverage - 95%+ maintained
711
+ - NFR-004: Documentation - Migration guide and API docs
712
+
713
+ ### Testing
714
+
715
+ - **Contract Tests**: 27 tests covering all 4 contracts (modern, legacy, no-package, priority)
716
+ - **Coverage**: 95%+ maintained across all modules
717
+ - **No Regression**: All existing tests pass (100%)
718
+
719
+ ### Migration Notes
720
+
721
+ - **Zero Breaking Changes**: Existing code continues to work with either package
722
+ - **Automatic Migration**: Install modern package, code automatically switches
723
+ - **Package Priority**: Modern package automatically used when both installed
724
+ - **Error Messages**: Clear guidance when no compatible package installed
725
+
726
+ ### Documentation
727
+
728
+ - **Specification**: `specs/012-address-enhancement-iris/spec.md`
729
+ - **Implementation Plan**: `specs/012-address-enhancement-iris/plan.md`
730
+ - **Research**: `specs/012-address-enhancement-iris/research.md`
731
+ - **Data Model**: `specs/012-address-enhancement-iris/data-model.md`
732
+ - **Contracts**: `specs/012-address-enhancement-iris/contracts/` (4 JSON contracts)
733
+ - **Quickstart**: `specs/012-address-enhancement-iris/quickstart.md` (10 usage scenarios)
734
+ - **Tasks**: `specs/012-address-enhancement-iris/tasks.md` (30 implementation tasks)
735
+
736
+ ## [1.2.2] - 2025-01-13
737
+
738
+ ### Fixed
739
+
740
+ - **Bug Fix #1: Prevented ryuk cleanup of CLI-managed containers (Feature 011)**
741
+ - CLI commands now use Docker SDK directly, bypassing testcontainers-iris for container creation
742
+ - Containers created via CLI persist until explicit removal (not cleaned up when CLI exits)
743
+ - Added dual-mode container creation: Docker SDK for CLI, testcontainers for pytest fixtures
744
+ - Resolved testcontainers ryuk sidecar removing containers immediately after CLI process exits
745
+ - **Impact**: Benchmark infrastructure can now run 30+ minute test suites (0% → 92% pass rate)
746
+ - **Location**: `iris_devtester/utils/iris_container_adapter.py` (dual-mode implementation)
747
+ - **Documentation**: New learnings doc at `docs/learnings/testcontainers-ryuk-lifecycle.md`
748
+ - **Technical Details**:
749
+ - CLI mode: `use_testcontainers=False` - No ryuk labels, manual lifecycle
750
+ - Test mode: `use_testcontainers=True` - Automatic cleanup after test scope
751
+ - Benchmark tests improved from 0/24 (0.0%) to 22/24 (91.7%) passing
752
+
753
+ - **Bug Fix #2: Fixed volume mounting for CLI containers (Feature 011)**
754
+ - Volumes now applied correctly via Docker SDK when using CLI commands
755
+ - Volume mounts verified after container creation with `verify_container_persistence()`
756
+ - Supports multiple volumes with read-only mode (`:ro` suffix)
757
+ - Added volume path validation before container creation
758
+ - **Impact**: Workspace files now accessible in benchmark containers
759
+ - **Location**:
760
+ - `iris_devtester/utils/iris_container_adapter.py` (Docker SDK volume application)
761
+ - `iris_devtester/config/container_config.py` (validate_volume_paths method)
762
+ - **Example**:
763
+ ```yaml
764
+ volumes:
765
+ - ./workspace:/external/workspace # Read-write
766
+ - ./config:/opt/config:ro # Read-only
767
+ ```
768
+
769
+ - **Bug Fix #3: Added container persistence verification (Feature 011)**
770
+ - Post-creation check ensures container actually persists after creation
771
+ - Detects immediate cleanup (ryuk) and reports constitutional error
772
+ - Verifies volume mounts are accessible
773
+ - Wait 2 seconds after creation, then verify container exists and is running
774
+ - **Impact**: No more silent container creation failures ("Failed to create container: 0" errors)
775
+ - **Location**: `iris_devtester/utils/iris_container_adapter.py` (verify_container_persistence function)
776
+ - **Data Model**: `ContainerPersistenceCheck` dataclass with success property
777
+
778
+ ### Added
779
+
780
+ - **Volume Mount Parsing**: `VolumeMountSpec` dataclass for parsing Docker volume syntax
781
+ - Parses `host:container` or `host:container:mode` format
782
+ - Validates mode is `rw` (read-write) or `ro` (read-only)
783
+ - Defaults to `rw` if mode not specified
784
+ - Constitutional error messages for invalid syntax
785
+
786
+ - **Volume Path Validation**: `ContainerConfig.validate_volume_paths()` method
787
+ - Checks all host paths exist before container creation
788
+ - Returns list of error messages (empty if all valid)
789
+ - Called automatically by CLI before creating containers
790
+
791
+ - **Enhanced Error Messages**: Volume mount failures now have constitutional format
792
+ - What went wrong: Specific error details
793
+ - Why this happened: Common causes explained
794
+ - How to fix it: Step-by-step remediation
795
+ - Documentation: Links to Docker volume documentation
796
+
797
+ ### Changed
798
+
799
+ - **CLI Container Creation**: Updated `container up` and `container start` commands
800
+ - Now use `use_testcontainers=False` for persistent containers
801
+ - Add volume path validation before creation
802
+ - Add persistence verification after creation
803
+ - Report success only after verification passes
804
+
805
+ ### Migration Notes
806
+
807
+ - **No breaking changes** - All fixes are backwards compatible
808
+ - **pytest fixtures** continue to use testcontainers (automatic cleanup)
809
+ - **CLI commands** now use Docker SDK (manual cleanup when user decides)
810
+ - **Benchmark success rate** improved from 0/24 (0.0%) to 22/24 (91.7%)
811
+ - **Container lifecycle**:
812
+ - Before: Container removed within ~60 seconds (ryuk cleanup)
813
+ - After: Container persists indefinitely until explicit removal
814
+
815
+ ### Technical Details
816
+
817
+ - **Environment Variable Fix**: Removed incorrect `ISC_DATA_DIRECTORY` environment variable
818
+ - Initial implementation set `ISC_DATA_DIRECTORY` to non-existent path
819
+ - Caused containers to exit immediately with "Durable folder does not exist" error
820
+ - Fixed by using empty environment for Community edition (IRIS bootstraps automatically)
821
+ - Only Enterprise edition containers need `ISC_LICENSE_KEY` environment variable
822
+ - **Documentation**: `docs/learnings/iris-docker-sdk-environment-variables.md`
823
+
824
+ ### Quality Assurance
825
+
826
+ - All 35 existing contract tests passing (100% - no regression)
827
+ - 14 new unit tests added (100% passing):
828
+ - 4 tests for volume path validation
829
+ - 5 tests for volume mount parsing (`VolumeMountSpec`)
830
+ - 5 tests for persistence verification (`ContainerPersistenceCheck`)
831
+ - 6 new integration tests with real Docker containers (100% passing):
832
+ - 2 tests for ryuk prevention (container persistence, no testcontainers labels)
833
+ - 3 tests for volume mounting (single, multiple, read-only)
834
+ - 1 test for persistence verification
835
+ - Constitutional Principle #5 compliance maintained (all error messages follow What/Why/How/Docs format)
836
+
837
+ ### Performance
838
+
839
+ | Metric | Before (v1.2.1) | After (v1.2.2) | Improvement |
840
+ |--------|----------------|----------------|-------------|
841
+ | Benchmark pass rate | 0/24 (0.0%) | 22/24 (91.7%) | +91.7% |
842
+ | Container persistence | ~30 seconds | Indefinite | ∞ |
843
+ | Volume mounting | ❌ Not working | ✅ Working | Fixed |
844
+
845
+ ## [1.2.1] - 2025-01-13
846
+
847
+ ### Fixed
848
+
849
+ - **Bug Fix #1: Corrected Docker image name for Community edition**
850
+ - Fixed `ContainerConfig.get_image_name()` to use correct Docker Hub organization
851
+ - Community images changed from `intersystems/iris-community` → `intersystemsdc/iris-community`
852
+ - The `intersystems/iris-community` image doesn't exist on Docker Hub
853
+ - Community images use `intersystemsdc/` prefix (Docker Community organization)
854
+ - Enterprise images continue to use `intersystems/` prefix (no change)
855
+ - **Impact**: Community edition containers now start successfully (0 image-not-found errors)
856
+ - **Location**: `iris_devtester/config/container_config.py:266`
857
+ - **Documentation**: New learnings doc at `docs/learnings/docker-hub-image-naming.md`
858
+
859
+ - **Bug Fix #3: Implemented volume mounting support**
860
+ - Volume mounts specified in `ContainerConfig.volumes` are now applied to containers
861
+ - Supports Docker volume syntax: `host:container` or `host:container:mode`
862
+ - Mode defaults to `rw` (read-write) if not specified, supports `ro` (read-only)
863
+ - Multiple volumes can be mounted simultaneously
864
+ - **Impact**: Configuration-defined volumes now work correctly (previously ignored)
865
+ - **Location**: `iris_devtester/utils/iris_container_adapter.py:52-58`
866
+ - **Example**:
867
+ ```yaml
868
+ volumes:
869
+ - ./data:/external # Read-write mount
870
+ - ./config:/opt/config:ro # Read-only mount
871
+ ```
872
+
873
+ ### Migration Notes
874
+
875
+ No breaking changes - all fixes are backwards compatible:
876
+ - Community edition now uses correct image name automatically
877
+ - Volume mounting is additive functionality (empty volumes list works as before)
878
+ - Existing configurations continue to work without modification
879
+
880
+ ### Quality Assurance
881
+
882
+ - All 35 existing contract tests passing (100% - no regression)
883
+ - 4 new unit tests for image name correction (100% passing)
884
+ - 4 new unit tests for volume mounting (100% passing)
885
+ - Constitutional Principle #5 compliance maintained (error messages still follow What/Why/How/Docs format)
886
+
887
+ ## [1.2.0] - 2025-01-11
888
+
889
+ ### Changed
890
+
891
+ #### Refactored CLI to use testcontainers-iris
892
+ - **BREAKING**: None - All CLI commands maintain identical interface and behavior
893
+ - Replaced custom Docker SDK wrapper (461 lines) with thin adapter layer (247 lines)
894
+ - Container lifecycle commands now leverage `testcontainers-iris` for container operations
895
+ - **46% code reduction** in container management layer (214 lines removed)
896
+ - **Benefits**:
897
+ - Shared bug fixes from testcontainers-iris community
898
+ - Reduced maintenance burden
899
+ - Battle-tested implementation from wider Python ecosystem
900
+ - Automatic improvements as testcontainers-iris evolves
901
+
902
+ #### Technical Implementation (Feature 009)
903
+ - **Added**: `iris_container_adapter.py` (247 lines) - Adapter between CLI and testcontainers-iris
904
+ - `IRISContainerManager.create_from_config()` - Maps ContainerConfig to IRISContainer
905
+ - `IRISContainerManager.get_existing()` - Gets existing containers by name
906
+ - `translate_docker_error()` - Constitutional error translation (4-part format preserved)
907
+ - **Moved**: `get_container_state()` → `ContainerState.from_container()` classmethod
908
+ - Better architecture: Logic now lives in the right place (ContainerState class)
909
+ - More intuitive API for querying container state
910
+ - **Deleted**: `docker_utils.py` (461 lines) - Replaced by testcontainers-iris + adapter
911
+ - **Preserved**: All functionality from v1.1.0
912
+ - 7 CLI commands unchanged (up, start, stop, restart, status, logs, remove)
913
+ - Progress indicators and emoji-based status updates
914
+ - Constitutional error messages (What/Why/How/Docs format)
915
+ - Configuration management (YAML, environment variables, zero-config)
916
+ - Multi-layer health checks
917
+ - Automatic CallIn service enablement
918
+
919
+ #### Quality Assurance
920
+ - **Tests**: All 35 contract tests passing (100%)
921
+ - **Tests**: All 20 adapter unit tests passing (100%)
922
+ - **Zero breaking changes** verified - Same CLI interface, same exit codes, same behavior
923
+ - **Performance**: No regression in container operations
924
+ - **Documentation**: Updated examples and docstrings to reflect new API
925
+
926
+ ### Dependencies
927
+ - No new dependencies - Leverages existing `testcontainers-iris>=1.2.2` dependency
928
+
929
+ ## [1.1.0] - 2025-01-11
930
+
931
+ ### Added
932
+
933
+ #### Container Lifecycle CLI Commands
934
+ - **NEW**: Complete container lifecycle management via CLI
935
+ - `iris-devtester container up` - Create and start IRIS container with zero-config support
936
+ - `iris-devtester container start` - Start existing container
937
+ - `iris-devtester container stop` - Gracefully stop running container
938
+ - `iris-devtester container restart` - Restart container with health checks
939
+ - `iris-devtester container status` - Display container state (text/JSON output)
940
+ - `iris-devtester container logs` - View container logs (with --follow support)
941
+ - `iris-devtester container remove` - Remove container with optional volume cleanup
942
+
943
+ #### Configuration Management
944
+ - `ContainerConfig` - Pydantic v2 model for container configuration
945
+ - Support for both Community and Enterprise editions
946
+ - YAML configuration file support (`iris-config.yml`)
947
+ - Environment variable configuration (`IRIS_*` variables)
948
+ - Zero-config mode with sensible defaults
949
+ - Configuration hierarchy: explicit config → local file → env → defaults
950
+ - `ContainerState` - Runtime container state tracking with health status
951
+ - Configuration validation with helpful error messages
952
+
953
+ #### Multi-Layer Health Checks
954
+ - Progressive health validation for containers:
955
+ - Layer 1: Container running (fast fail on crashes)
956
+ - Layer 2: Docker health check (if defined)
957
+ - Layer 3: IRIS SuperServer port accessible
958
+ - Automatic CallIn service enablement (required for DBAPI)
959
+ - Progress indicators and status updates during container operations
960
+
961
+ #### Docker SDK Integration
962
+ - Comprehensive Docker SDK wrapper with constitutional error messages
963
+ - Automatic image pulling with fallback to local images
964
+ - Port conflict detection with remediation guidance
965
+ - Idempotent operations (safe retries)
966
+ - Proper exit codes: 0 (success), 1 (error), 2 (config), 3 (running), 5 (timeout)
967
+
968
+ #### Examples and Documentation
969
+ - Example configurations:
970
+ - `examples/iris-config-community.yml` - Community Edition template
971
+ - `examples/iris-config-enterprise.yml` - Enterprise Edition template with license setup
972
+ - `examples/demo-workflow.sh` - Complete lifecycle demonstration script
973
+
974
+ ### Changed
975
+ - Updated package version to 1.1.0
976
+ - Fixed CLI prog_name to match package name (iris-devtester)
977
+ - Added PyYAML and Pydantic dependencies
978
+
979
+ ### Technical Details
980
+ - 33 implementation tasks completed (77% of Feature 008)
981
+ - 35 contract tests (all passing)
982
+ - 50+ unit tests for configuration and validation
983
+ - Constitutional principles compliance:
984
+ - Principle #2: DBAPI First (automatic CallIn enablement)
985
+ - Principle #4: Zero Configuration Viable (works without config files)
986
+ - Principle #5: Fail Fast with Guidance (4-part error messages: What/Why/How/Docs)
987
+ - Principle #6: Enterprise Ready, Community Friendly (both editions supported)
988
+
989
+ ## [1.0.2] - 2025-01-09
990
+
991
+ ### Fixed
992
+ - **CRITICAL**: Fixed `reset_password()` bug where function reported success but password was not actually set
993
+ - Now uses correct IRIS Security API property `Password` (not `ExternalPassword`)
994
+ - Now calls `Security.Users.Get()` before `Modify()` per IRIS API requirements
995
+ - Now sets `PasswordNeverExpires=1` to prevent password expiration (not `ChangePassword=0`)
996
+ - Fixes "Access Denied" errors after password reset
997
+ - Verified on AWS EC2, IRIS Community 2025.1
998
+ - Works on both IRIS Community and Enterprise editions
999
+ - Issue reported in production user feedback
1000
+
1001
+ ## [1.0.0] - 2025-10-18
1002
+
1003
+ ### 🎉 Initial Release
1004
+
1005
+ First stable release of iris-devtester, a battle-tested Python package for InterSystems IRIS infrastructure.
1006
+
1007
+ ### Added
1008
+
1009
+ #### Container Management
1010
+ - `IRISContainer` wrapper with automatic connection management
1011
+ - `IRISContainer.community()` - Zero-config Community Edition containers
1012
+ - `IRISContainer.enterprise()` - Enterprise Edition with license support
1013
+ - `IRISContainer.from_existing()` - Auto-discover existing IRIS instances
1014
+ - ObjectScript execution support via `get_iris_connection()`
1015
+ - Namespace management: `create_namespace()`, `delete_namespace()`, `get_test_namespace()`
1016
+ - Automatic password reset integration
1017
+ - Wait strategies for container readiness
1018
+
1019
+ #### Connection Management
1020
+ - `get_connection()` - Zero-config connection with auto-discovery
1021
+ - DBAPI-first approach (3x faster than JDBC)
1022
+ - Automatic fallback to JDBC when DBAPI unavailable
1023
+ - Connection pooling support (documented for v1.2.0)
1024
+ - Retry logic with exponential backoff
1025
+ - Environment variable configuration support
1026
+
1027
+ #### Testing Utilities
1028
+ - pytest fixtures for IRIS integration tests
1029
+ - `iris_container` - Session-scoped container lifecycle
1030
+ - `test_namespace` - Function-scoped namespace with auto-cleanup
1031
+ - `iris_connection` - DBAPI connection for SQL operations
1032
+ - `iris_objectscript_connection` - ObjectScript execution connection
1033
+ - Schema reset utilities
1034
+ - `reset_namespace()` - Drop all user tables
1035
+ - `get_namespace_tables()` - Query tables via INFORMATION_SCHEMA
1036
+ - `verify_tables_exist()` - Validate expected schema
1037
+ - `SchemaResetter` - Context manager for test isolation
1038
+ - Auto-discovery
1039
+ - Docker container inspection
1040
+ - Native IRIS detection via `iris list`
1041
+ - Multi-port scanning (31972, 1972, 11972, 21972)
1042
+
1043
+ #### .DAT Fixture Management
1044
+ - `FixtureCreator` - Create fixtures from namespaces via BACKUP^DBACK
1045
+ - `DATFixtureLoader` - Load fixtures via RESTORE (<1s)
1046
+ - `FixtureValidator` - Validate integrity with SHA256 checksums
1047
+ - CLI commands: `create`, `load`, `validate`, `list`, `info`
1048
+ - pytest plugin: `@pytest.mark.dat_fixture` decorator
1049
+ - Manifest generation with metadata
1050
+ - Atomic operations with rollback
1051
+
1052
+ #### Performance Monitoring
1053
+ - `MonitoringPolicy` - ^SystemPerformance configuration
1054
+ - `configure_monitoring()` - Zero-config monitoring setup
1055
+ - `get_monitoring_status()` - Query monitoring state
1056
+ - `enable_monitoring()` / `disable_monitoring()` - Control monitoring
1057
+ - Task Manager integration
1058
+ - `create_task()`, `get_task_status()`, `suspend_task()`, `resume_task()`, `delete_task()`
1059
+ - Resource monitoring
1060
+ - `get_resource_metrics()` - CPU, memory, database metrics
1061
+ - `check_resource_thresholds()` - Auto-disable/enable logic
1062
+ - `auto_disable_monitoring()` / `auto_enable_monitoring()` - Automatic remediation
1063
+ - `ResourceThresholds` - Configurable thresholds with hysteresis
1064
+
1065
+ #### Documentation
1066
+ - Complete API documentation
1067
+ - `SQL_VS_OBJECTSCRIPT.md` - Critical execution pattern guide
1068
+ - `rag-templates-production-patterns.md` - 7 battle-tested patterns
1069
+ - `CONSTITUTION.md` - 8 core design principles
1070
+ - `ROADMAP.md` - Future features (v1.1.0+)
1071
+ - Integration test examples
1072
+ - Comprehensive docstrings (Google style)
1073
+
1074
+ ### Quality Metrics
1075
+ - 224/238 unit tests passing (94%)
1076
+ - 93 contract tests passing (100%)
1077
+ - 29 integration tests passing
1078
+ - 54 integration tests ready (require IRIS container)
1079
+ - 100% docstring coverage
1080
+ - 100% type hint coverage
1081
+ - Medical-grade error messages (Constitutional Principle #5)
1082
+
1083
+ ### Constitutional Principles
1084
+ All features follow the [8 core principles](CONSTITUTION.md):
1085
+ 1. ✅ Automatic Remediation Over Manual Intervention
1086
+ 2. ✅ DBAPI First, JDBC Fallback
1087
+ 3. ✅ Isolation by Default
1088
+ 4. ✅ Zero Configuration Viable
1089
+ 5. ✅ Fail Fast with Guidance
1090
+ 6. ✅ Enterprise Ready, Community Friendly
1091
+ 7. ✅ Medical-Grade Reliability
1092
+ 8. ✅ Document the Blind Alleys
1093
+
1094
+ ### Production Patterns Integrated
1095
+ Extracted from `rag-templates` production system:
1096
+ 1. Multi-Port Discovery with Fallback
1097
+ 2. Docker Container Port Auto-Detection
1098
+ 3. Connection Pooling (documented for v1.2.0)
1099
+ 4. Automatic Password Reset
1100
+ 5. "Out of the Way" Port Mapping
1101
+ 6. Schema Reset Utilities
1102
+ 7. Retry Logic with Exponential Backoff
1103
+
1104
+ ### Breaking Changes
1105
+ N/A - Initial release
1106
+
1107
+ ### Deprecated
1108
+ N/A - Initial release
1109
+
1110
+ ### Fixed
1111
+ N/A - Initial release
1112
+
1113
+ ### Security
1114
+ - SHA256 checksums for .DAT fixture integrity
1115
+ - Secure password handling in connection strings
1116
+ - No credentials in logs or error messages
1117
+
1118
+ ---
1119
+
1120
+ ## [Unreleased]
1121
+
1122
+ ### Planned for v1.1.0
1123
+ - VECTOR datatype introspection via audit trail
1124
+ - Enhanced schema inspector combining INFORMATION_SCHEMA + audit data
1125
+ - SQLAlchemy dialect extension with VECTOR type awareness
1126
+ - Schema reflection with correct VECTOR types
1127
+
1128
+ ### Planned for v1.2.0
1129
+ - Production-grade connection pooling implementation
1130
+ - Query performance tracking
1131
+ - Advanced testing utilities
1132
+ - DAT fixture versioning
1133
+
1134
+ ### Planned for v2.0.0
1135
+ - Multi-instance support
1136
+ - Mirror configuration support
1137
+ - Enterprise features (sharding, ECP, etc.)
1138
+
1139
+ ---
1140
+
1141
+ ## Release Notes
1142
+
1143
+ ### v1.0.0 Highlights
1144
+
1145
+ **Zero Configuration**: `pip install iris-devtester && pytest` works out of the box.
1146
+
1147
+ **Battle-Tested**: Every feature extracted from production code, representing years of debugging hours saved.
1148
+
1149
+ **Constitutional Compliance**: All 8 design principles followed throughout.
1150
+
1151
+ **Comprehensive Testing**: 94% test coverage with 224 unit tests, 93 contract tests, and 83 integration tests.
1152
+
1153
+ **Production Patterns**: 7 patterns from rag-templates integrated and documented.
1154
+
1155
+ **Documentation**: 1,200+ lines of documentation including critical SQL vs ObjectScript guide.
1156
+
1157
+ ---
1158
+
1159
+ **Remember**: Every feature here was paid for with real debugging time. 🚀
1160
+
1161
+ [1.10.1]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.10.1
1162
+ [1.10.0]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.10.0
1163
+ [1.9.3]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.9.3
1164
+ [1.9.2]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.9.2
1165
+ [1.8.1]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.8.1
1166
+ [1.5.0]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.5.0
1167
+ [1.4.5]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.4.5
1168
+ [1.4.4]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.4.4
1169
+ [1.4.3]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.4.3
1170
+ [1.3.0]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.3.0
1171
+ [1.2.2]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.2.2
1172
+ [1.2.1]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.2.1
1173
+ [1.2.0]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.2.0
1174
+ [1.1.0]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.1.0
1175
+ [1.0.2]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.0.2
1176
+ [1.0.0]: https://github.com/intersystems-community/iris-devtester/releases/tag/v1.0.0
1177
+ [Unreleased]: https://github.com/intersystems-community/iris-devtester/compare/v1.10.1...HEAD