testerkit 0.4.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 (961) hide show
  1. testerkit-0.4.0/.gitignore +39 -0
  2. testerkit-0.4.0/CHANGELOG.md +559 -0
  3. testerkit-0.4.0/CONTRIBUTING.md +619 -0
  4. testerkit-0.4.0/LICENSE +191 -0
  5. testerkit-0.4.0/PKG-INFO +250 -0
  6. testerkit-0.4.0/README.md +173 -0
  7. testerkit-0.4.0/SECURITY.md +27 -0
  8. testerkit-0.4.0/docs/_assets/operator-ui/channels/table.png +0 -0
  9. testerkit-0.4.0/docs/_assets/operator-ui/dashboard/runs.png +0 -0
  10. testerkit-0.4.0/docs/_assets/operator-ui/dashboard/stations.png +0 -0
  11. testerkit-0.4.0/docs/_assets/operator-ui/events/filters.png +0 -0
  12. testerkit-0.4.0/docs/_assets/operator-ui/events/table.png +0 -0
  13. testerkit-0.4.0/docs/_assets/operator-ui/explore/chart.png +0 -0
  14. testerkit-0.4.0/docs/_assets/operator-ui/explore/filters.png +0 -0
  15. testerkit-0.4.0/docs/_assets/operator-ui/explore/plot-controls.png +0 -0
  16. testerkit-0.4.0/docs/_assets/operator-ui/files/table.png +0 -0
  17. testerkit-0.4.0/docs/_assets/operator-ui/launch/form.png +0 -0
  18. testerkit-0.4.0/docs/_assets/operator-ui/metrics/filters.png +0 -0
  19. testerkit-0.4.0/docs/_assets/operator-ui/metrics/pareto.png +0 -0
  20. testerkit-0.4.0/docs/_assets/operator-ui/metrics/ppk.png +0 -0
  21. testerkit-0.4.0/docs/_assets/operator-ui/metrics/yield.png +0 -0
  22. testerkit-0.4.0/docs/_assets/operator-ui/results/detail-header.png +0 -0
  23. testerkit-0.4.0/docs/_assets/operator-ui/results/detail-measurements.png +0 -0
  24. testerkit-0.4.0/docs/_assets/operator-ui/results/detail-overview.png +0 -0
  25. testerkit-0.4.0/docs/_assets/operator-ui/results/detail-steps.png +0 -0
  26. testerkit-0.4.0/docs/_assets/operator-ui/results/stats.png +0 -0
  27. testerkit-0.4.0/docs/_assets/operator-ui/results/table.png +0 -0
  28. testerkit-0.4.0/docs/_assets/operator-ui/tour/designer.png +0 -0
  29. testerkit-0.4.0/docs/_assets/operator-ui/tour/docs.png +0 -0
  30. testerkit-0.4.0/docs/_assets/operator-ui/tour/fixtures.png +0 -0
  31. testerkit-0.4.0/docs/_assets/operator-ui/tour/instruments.png +0 -0
  32. testerkit-0.4.0/docs/_assets/operator-ui/tour/parts.png +0 -0
  33. testerkit-0.4.0/docs/_assets/operator-ui/tour/profiles.png +0 -0
  34. testerkit-0.4.0/docs/_assets/operator-ui/tour/stations.png +0 -0
  35. testerkit-0.4.0/docs/_assets/operator-ui/tour/tests.png +0 -0
  36. testerkit-0.4.0/docs/_assets/operator-ui/tour/uuts.png +0 -0
  37. testerkit-0.4.0/docs/_internal/development-axioms.md +304 -0
  38. testerkit-0.4.0/docs/_internal/event-log-wal-format.md +177 -0
  39. testerkit-0.4.0/docs/_internal/explorations/0.3.0-at-rest-reshape.md +158 -0
  40. testerkit-0.4.0/docs/_internal/explorations/0.3.1-ootb-experience.md +103 -0
  41. testerkit-0.4.0/docs/_internal/explorations/0.4.0-analytics-metrics.md +83 -0
  42. testerkit-0.4.0/docs/_internal/explorations/ai-test-writing-compliance.md +166 -0
  43. testerkit-0.4.0/docs/_internal/explorations/best-available-identity.md +107 -0
  44. testerkit-0.4.0/docs/_internal/explorations/blog-ideas.md +19 -0
  45. testerkit-0.4.0/docs/_internal/explorations/channels-real-stream-handoff.md +640 -0
  46. testerkit-0.4.0/docs/_internal/explorations/channels-write-scaling.md +427 -0
  47. testerkit-0.4.0/docs/_internal/explorations/checkpoint-split-plan.md +124 -0
  48. testerkit-0.4.0/docs/_internal/explorations/data-store-backends.md +141 -0
  49. testerkit-0.4.0/docs/_internal/explorations/data-store-unification-invariants.md +87 -0
  50. testerkit-0.4.0/docs/_internal/explorations/data-stores-claim-check.md +925 -0
  51. testerkit-0.4.0/docs/_internal/explorations/data-stores-refinements.md +429 -0
  52. testerkit-0.4.0/docs/_internal/explorations/data-stores.md +1591 -0
  53. testerkit-0.4.0/docs/_internal/explorations/derived-index-versioning.md +451 -0
  54. testerkit-0.4.0/docs/_internal/explorations/docs-corpus-review.md +825 -0
  55. testerkit-0.4.0/docs/_internal/explorations/examples-portability.md +97 -0
  56. testerkit-0.4.0/docs/_internal/explorations/exporter-conformance-audit.md +36 -0
  57. testerkit-0.4.0/docs/_internal/explorations/instrument-access-model.md +82 -0
  58. testerkit-0.4.0/docs/_internal/explorations/instrument-reservation-execution.md +377 -0
  59. testerkit-0.4.0/docs/_internal/explorations/instrument-reservation.md +616 -0
  60. testerkit-0.4.0/docs/_internal/explorations/live-ui-pattern.md +73 -0
  61. testerkit-0.4.0/docs/_internal/explorations/measurement-storage-eav.md +245 -0
  62. testerkit-0.4.0/docs/_internal/explorations/post-0.2.2-plan.md +67 -0
  63. testerkit-0.4.0/docs/_internal/explorations/pre-1.0-epoch-strategy.md +68 -0
  64. testerkit-0.4.0/docs/_internal/explorations/projection-normalization.md +118 -0
  65. testerkit-0.4.0/docs/_internal/explorations/query-by-role-name.md +573 -0
  66. testerkit-0.4.0/docs/_internal/explorations/read-surface-unification.md +288 -0
  67. testerkit-0.4.0/docs/_internal/explorations/runs-execution-model.md +699 -0
  68. testerkit-0.4.0/docs/_internal/explorations/schema-versioning-migration.md +611 -0
  69. testerkit-0.4.0/docs/_internal/explorations/session-foundation.md +778 -0
  70. testerkit-0.4.0/docs/_internal/explorations/site-model-consolidation.md +164 -0
  71. testerkit-0.4.0/docs/_internal/explorations/slot-to-site-rename.md +225 -0
  72. testerkit-0.4.0/docs/_internal/explorations/step-vector-grain-reshape-execution.md +335 -0
  73. testerkit-0.4.0/docs/_internal/explorations/step-vector-grain-reshape.md +229 -0
  74. testerkit-0.4.0/docs/_internal/explorations/store-event-rename-plan.md +119 -0
  75. testerkit-0.4.0/docs/_internal/explorations/store-perf-writemany-handoff.md +116 -0
  76. testerkit-0.4.0/docs/_internal/explorations/streaming-media.md +69 -0
  77. testerkit-0.4.0/docs/_internal/explorations/streaming-unification.md +340 -0
  78. testerkit-0.4.0/docs/_internal/explorations/versioning-resiliency-backlog.md +178 -0
  79. testerkit-0.4.0/docs/_internal/project-history-narrative.md +298 -0
  80. testerkit-0.4.0/docs/_internal/project-history-summary.md +51 -0
  81. testerkit-0.4.0/docs/_internal/runs-architecture-map.md +106 -0
  82. testerkit-0.4.0/docs/concepts/configuration/capabilities.md +447 -0
  83. testerkit-0.4.0/docs/concepts/configuration/fixtures.md +335 -0
  84. testerkit-0.4.0/docs/concepts/configuration/index.md +14 -0
  85. testerkit-0.4.0/docs/concepts/configuration/parts.md +276 -0
  86. testerkit-0.4.0/docs/concepts/configuration/stations.md +214 -0
  87. testerkit-0.4.0/docs/concepts/data/data-stores.md +199 -0
  88. testerkit-0.4.0/docs/concepts/data/event-log.md +185 -0
  89. testerkit-0.4.0/docs/concepts/data/event-sourcing.md +76 -0
  90. testerkit-0.4.0/docs/concepts/data/flight-streaming.md +58 -0
  91. testerkit-0.4.0/docs/concepts/data/index.md +17 -0
  92. testerkit-0.4.0/docs/concepts/data/sessions.md +78 -0
  93. testerkit-0.4.0/docs/concepts/data/three-verbs.md +260 -0
  94. testerkit-0.4.0/docs/concepts/execution/index.md +13 -0
  95. testerkit-0.4.0/docs/concepts/execution/outcomes.md +199 -0
  96. testerkit-0.4.0/docs/concepts/execution/step-hierarchy.md +170 -0
  97. testerkit-0.4.0/docs/concepts/execution/step-manifest.md +115 -0
  98. testerkit-0.4.0/docs/concepts/index.md +40 -0
  99. testerkit-0.4.0/docs/concepts/overview/ai-integration.md +57 -0
  100. testerkit-0.4.0/docs/concepts/overview/architecture.md +357 -0
  101. testerkit-0.4.0/docs/concepts/overview/index.md +14 -0
  102. testerkit-0.4.0/docs/concepts/overview/platform-vs-framework.md +147 -0
  103. testerkit-0.4.0/docs/concepts/overview/pytest.md +53 -0
  104. testerkit-0.4.0/docs/concepts/overview/tiers.md +46 -0
  105. testerkit-0.4.0/docs/how-to/catalog/datasheet-to-test.md +169 -0
  106. testerkit-0.4.0/docs/how-to/catalog/index.md +11 -0
  107. testerkit-0.4.0/docs/how-to/configuration/configuring-stations.md +364 -0
  108. testerkit-0.4.0/docs/how-to/configuration/custom-drivers.md +484 -0
  109. testerkit-0.4.0/docs/how-to/configuration/index.md +13 -0
  110. testerkit-0.4.0/docs/how-to/configuration/mock-mode.md +342 -0
  111. testerkit-0.4.0/docs/how-to/data/benchmarking.md +120 -0
  112. testerkit-0.4.0/docs/how-to/data/capture-an-artifact.md +84 -0
  113. testerkit-0.4.0/docs/how-to/data/capture-waveform.md +110 -0
  114. testerkit-0.4.0/docs/how-to/data/choosing-a-channel-verb.md +108 -0
  115. testerkit-0.4.0/docs/how-to/data/compare-runs.md +120 -0
  116. testerkit-0.4.0/docs/how-to/data/export-results.md +104 -0
  117. testerkit-0.4.0/docs/how-to/data/find-flaky-tests.md +108 -0
  118. testerkit-0.4.0/docs/how-to/data/grafana-dashboards.md +148 -0
  119. testerkit-0.4.0/docs/how-to/data/index.md +23 -0
  120. testerkit-0.4.0/docs/how-to/data/mcp-debug-failures.md +125 -0
  121. testerkit-0.4.0/docs/how-to/data/mcp-query-runs.md +120 -0
  122. testerkit-0.4.0/docs/how-to/data/querying-channels.md +117 -0
  123. testerkit-0.4.0/docs/how-to/data/querying-events.md +85 -0
  124. testerkit-0.4.0/docs/how-to/data/stream-live-channel.md +134 -0
  125. testerkit-0.4.0/docs/how-to/execution/custom-operator-ui.md +136 -0
  126. testerkit-0.4.0/docs/how-to/execution/index.md +21 -0
  127. testerkit-0.4.0/docs/how-to/execution/limits.md +193 -0
  128. testerkit-0.4.0/docs/how-to/execution/managing-sessions.md +100 -0
  129. testerkit-0.4.0/docs/how-to/execution/multi-uut-testing.md +211 -0
  130. testerkit-0.4.0/docs/how-to/execution/operator-prompts.md +151 -0
  131. testerkit-0.4.0/docs/how-to/execution/profiles.md +304 -0
  132. testerkit-0.4.0/docs/how-to/execution/spec-driven-testing.md +169 -0
  133. testerkit-0.4.0/docs/how-to/execution/test-context.md +212 -0
  134. testerkit-0.4.0/docs/how-to/execution/traceability.md +252 -0
  135. testerkit-0.4.0/docs/how-to/execution/vector-expansion.md +394 -0
  136. testerkit-0.4.0/docs/how-to/execution/writing-tests.md +363 -0
  137. testerkit-0.4.0/docs/how-to/index.md +59 -0
  138. testerkit-0.4.0/docs/how-to/overview/index.md +11 -0
  139. testerkit-0.4.0/docs/how-to/overview/mcp-integration.md +168 -0
  140. testerkit-0.4.0/docs/how-to/overview/operator-ui-tour.md +234 -0
  141. testerkit-0.4.0/docs/integration/data/grafana.md +162 -0
  142. testerkit-0.4.0/docs/integration/data/index.md +15 -0
  143. testerkit-0.4.0/docs/integration/data/lakehouse-import.md +226 -0
  144. testerkit-0.4.0/docs/integration/data/logging.md +131 -0
  145. testerkit-0.4.0/docs/integration/data/results-api.md +51 -0
  146. testerkit-0.4.0/docs/integration/index.md +20 -0
  147. testerkit-0.4.0/docs/integration/runtime/harness.md +281 -0
  148. testerkit-0.4.0/docs/integration/runtime/index.md +13 -0
  149. testerkit-0.4.0/docs/integration/runtime/instruments.md +284 -0
  150. testerkit-0.4.0/docs/integration/runtime/pytest-existing.md +315 -0
  151. testerkit-0.4.0/docs/overview.md +116 -0
  152. testerkit-0.4.0/docs/reference/catalog/cookbook.md +389 -0
  153. testerkit-0.4.0/docs/reference/catalog/index.md +11 -0
  154. testerkit-0.4.0/docs/reference/catalog/schema.md +375 -0
  155. testerkit-0.4.0/docs/reference/cli.md +660 -0
  156. testerkit-0.4.0/docs/reference/configuration.md +406 -0
  157. testerkit-0.4.0/docs/reference/data/channels-schema.md +145 -0
  158. testerkit-0.4.0/docs/reference/data/event-types.md +554 -0
  159. testerkit-0.4.0/docs/reference/data/events-schema.md +120 -0
  160. testerkit-0.4.0/docs/reference/data/files-schema.md +141 -0
  161. testerkit-0.4.0/docs/reference/data/index.md +18 -0
  162. testerkit-0.4.0/docs/reference/data/models.md +2229 -0
  163. testerkit-0.4.0/docs/reference/data/outputs.md +82 -0
  164. testerkit-0.4.0/docs/reference/data/parquet-schema.md +529 -0
  165. testerkit-0.4.0/docs/reference/data/performance-limits.md +224 -0
  166. testerkit-0.4.0/docs/reference/data/query-api.md +247 -0
  167. testerkit-0.4.0/docs/reference/index.md +69 -0
  168. testerkit-0.4.0/docs/reference/operator-ui/channels/detail.md +82 -0
  169. testerkit-0.4.0/docs/reference/operator-ui/channels/list.md +70 -0
  170. testerkit-0.4.0/docs/reference/operator-ui/dashboard.md +87 -0
  171. testerkit-0.4.0/docs/reference/operator-ui/designer.md +167 -0
  172. testerkit-0.4.0/docs/reference/operator-ui/events.md +89 -0
  173. testerkit-0.4.0/docs/reference/operator-ui/files.md +74 -0
  174. testerkit-0.4.0/docs/reference/operator-ui/fixtures.md +100 -0
  175. testerkit-0.4.0/docs/reference/operator-ui/instruments.md +126 -0
  176. testerkit-0.4.0/docs/reference/operator-ui/launch.md +79 -0
  177. testerkit-0.4.0/docs/reference/operator-ui/live.md +102 -0
  178. testerkit-0.4.0/docs/reference/operator-ui/measurements.md +159 -0
  179. testerkit-0.4.0/docs/reference/operator-ui/metrics.md +217 -0
  180. testerkit-0.4.0/docs/reference/operator-ui/parts.md +98 -0
  181. testerkit-0.4.0/docs/reference/operator-ui/profiles.md +103 -0
  182. testerkit-0.4.0/docs/reference/operator-ui/results/detail.md +214 -0
  183. testerkit-0.4.0/docs/reference/operator-ui/results/list.md +106 -0
  184. testerkit-0.4.0/docs/reference/operator-ui/stations.md +98 -0
  185. testerkit-0.4.0/docs/reference/operator-ui/tests.md +173 -0
  186. testerkit-0.4.0/docs/reference/operator-ui/uuts.md +67 -0
  187. testerkit-0.4.0/docs/reference/overview/index.md +11 -0
  188. testerkit-0.4.0/docs/reference/overview/pytest-native.md +142 -0
  189. testerkit-0.4.0/docs/reference/overview/skills.md +177 -0
  190. testerkit-0.4.0/docs/reference/pytest/fixtures.md +342 -0
  191. testerkit-0.4.0/docs/reference/pytest/index.md +12 -0
  192. testerkit-0.4.0/docs/reference/pytest/markers.md +257 -0
  193. testerkit-0.4.0/docs/reference/runtime/api.md +246 -0
  194. testerkit-0.4.0/docs/reference/runtime/client.md +280 -0
  195. testerkit-0.4.0/docs/reference/runtime/connect.md +140 -0
  196. testerkit-0.4.0/docs/reference/runtime/index.md +13 -0
  197. testerkit-0.4.0/docs/tutorial/01-first-test.md +113 -0
  198. testerkit-0.4.0/docs/tutorial/02-mock-instruments.md +88 -0
  199. testerkit-0.4.0/docs/tutorial/03-fixtures.md +169 -0
  200. testerkit-0.4.0/docs/tutorial/04-limits.md +139 -0
  201. testerkit-0.4.0/docs/tutorial/05-configuration.md +194 -0
  202. testerkit-0.4.0/docs/tutorial/06-specifications.md +273 -0
  203. testerkit-0.4.0/docs/tutorial/07-real-instruments.md +245 -0
  204. testerkit-0.4.0/docs/tutorial/08-capabilities.md +223 -0
  205. testerkit-0.4.0/docs/tutorial/09-production.md +374 -0
  206. testerkit-0.4.0/docs/tutorial/10-live-monitoring.md +156 -0
  207. testerkit-0.4.0/docs/tutorial/11-waveforms-and-evidence.md +169 -0
  208. testerkit-0.4.0/docs/tutorial/12-continuous-monitoring.md +145 -0
  209. testerkit-0.4.0/docs/tutorial/13-parallel-testing.md +233 -0
  210. testerkit-0.4.0/docs/tutorial/index.md +61 -0
  211. testerkit-0.4.0/docs/tutorial/quickstart.md +282 -0
  212. testerkit-0.4.0/evals/README.md +96 -0
  213. testerkit-0.4.0/examples/01-vanilla/README.md +99 -0
  214. testerkit-0.4.0/examples/01-vanilla/conftest.py +35 -0
  215. testerkit-0.4.0/examples/01-vanilla/drivers/__init__.py +29 -0
  216. testerkit-0.4.0/examples/01-vanilla/drivers/dmm.py +128 -0
  217. testerkit-0.4.0/examples/01-vanilla/drivers/psu.py +122 -0
  218. testerkit-0.4.0/examples/01-vanilla/pyproject.toml +16 -0
  219. testerkit-0.4.0/examples/01-vanilla/pytest.ini +12 -0
  220. testerkit-0.4.0/examples/01-vanilla/testerkit.yaml +3 -0
  221. testerkit-0.4.0/examples/01-vanilla/tests/test_rail.py +33 -0
  222. testerkit-0.4.0/examples/02-verify/README.md +100 -0
  223. testerkit-0.4.0/examples/02-verify/conftest.py +34 -0
  224. testerkit-0.4.0/examples/02-verify/drivers/__init__.py +29 -0
  225. testerkit-0.4.0/examples/02-verify/drivers/dmm.py +128 -0
  226. testerkit-0.4.0/examples/02-verify/drivers/psu.py +122 -0
  227. testerkit-0.4.0/examples/02-verify/pyproject.toml +16 -0
  228. testerkit-0.4.0/examples/02-verify/pytest.ini +7 -0
  229. testerkit-0.4.0/examples/02-verify/testerkit.yaml +3 -0
  230. testerkit-0.4.0/examples/02-verify/tests/test_rail.py +61 -0
  231. testerkit-0.4.0/examples/03-inline-limits/README.md +37 -0
  232. testerkit-0.4.0/examples/03-inline-limits/conftest.py +24 -0
  233. testerkit-0.4.0/examples/03-inline-limits/drivers/__init__.py +29 -0
  234. testerkit-0.4.0/examples/03-inline-limits/drivers/dmm.py +128 -0
  235. testerkit-0.4.0/examples/03-inline-limits/drivers/psu.py +122 -0
  236. testerkit-0.4.0/examples/03-inline-limits/pyproject.toml +16 -0
  237. testerkit-0.4.0/examples/03-inline-limits/pytest.ini +2 -0
  238. testerkit-0.4.0/examples/03-inline-limits/testerkit.yaml +3 -0
  239. testerkit-0.4.0/examples/03-inline-limits/tests/test_rail.py +42 -0
  240. testerkit-0.4.0/examples/03-inline-limits/tests/test_sequence.py +78 -0
  241. testerkit-0.4.0/examples/04-sidecar-markers/README.md +73 -0
  242. testerkit-0.4.0/examples/04-sidecar-markers/conftest.py +24 -0
  243. testerkit-0.4.0/examples/04-sidecar-markers/drivers/__init__.py +29 -0
  244. testerkit-0.4.0/examples/04-sidecar-markers/drivers/dmm.py +128 -0
  245. testerkit-0.4.0/examples/04-sidecar-markers/drivers/psu.py +122 -0
  246. testerkit-0.4.0/examples/04-sidecar-markers/pyproject.toml +16 -0
  247. testerkit-0.4.0/examples/04-sidecar-markers/pytest.ini +2 -0
  248. testerkit-0.4.0/examples/04-sidecar-markers/testerkit.yaml +3 -0
  249. testerkit-0.4.0/examples/04-sidecar-markers/tests/test_rail.py +53 -0
  250. testerkit-0.4.0/examples/04-sidecar-markers/tests/test_rail.yaml +25 -0
  251. testerkit-0.4.0/examples/05-part-spec/README.md +52 -0
  252. testerkit-0.4.0/examples/05-part-spec/conftest.py +24 -0
  253. testerkit-0.4.0/examples/05-part-spec/drivers/__init__.py +29 -0
  254. testerkit-0.4.0/examples/05-part-spec/drivers/dmm.py +128 -0
  255. testerkit-0.4.0/examples/05-part-spec/drivers/psu.py +122 -0
  256. testerkit-0.4.0/examples/05-part-spec/parts/buck_3v3.yaml +45 -0
  257. testerkit-0.4.0/examples/05-part-spec/pyproject.toml +16 -0
  258. testerkit-0.4.0/examples/05-part-spec/pytest.ini +7 -0
  259. testerkit-0.4.0/examples/05-part-spec/testerkit.yaml +3 -0
  260. testerkit-0.4.0/examples/05-part-spec/tests/test_rail.py +52 -0
  261. testerkit-0.4.0/examples/05-part-spec/tests/test_rail.yaml +26 -0
  262. testerkit-0.4.0/examples/06-station-catalog/README.md +135 -0
  263. testerkit-0.4.0/examples/06-station-catalog/catalog/generic_dmm.yaml +60 -0
  264. testerkit-0.4.0/examples/06-station-catalog/catalog/generic_psu.yaml +76 -0
  265. testerkit-0.4.0/examples/06-station-catalog/drivers/__init__.py +29 -0
  266. testerkit-0.4.0/examples/06-station-catalog/drivers/dmm.py +128 -0
  267. testerkit-0.4.0/examples/06-station-catalog/drivers/psu.py +122 -0
  268. testerkit-0.4.0/examples/06-station-catalog/fixtures/buck_3v3_bench.yaml +19 -0
  269. testerkit-0.4.0/examples/06-station-catalog/parts/buck_3v3.yaml +45 -0
  270. testerkit-0.4.0/examples/06-station-catalog/pyproject.toml +16 -0
  271. testerkit-0.4.0/examples/06-station-catalog/pytest.ini +8 -0
  272. testerkit-0.4.0/examples/06-station-catalog/stations/bench_01.yaml +23 -0
  273. testerkit-0.4.0/examples/06-station-catalog/testerkit.yaml +5 -0
  274. testerkit-0.4.0/examples/06-station-catalog/tests/test_rail.py +114 -0
  275. testerkit-0.4.0/examples/06-station-catalog/tests/test_rail.yaml +41 -0
  276. testerkit-0.4.0/examples/07-profiles/README.md +77 -0
  277. testerkit-0.4.0/examples/07-profiles/catalog/generic_dmm.yaml +60 -0
  278. testerkit-0.4.0/examples/07-profiles/catalog/generic_psu.yaml +76 -0
  279. testerkit-0.4.0/examples/07-profiles/drivers/__init__.py +29 -0
  280. testerkit-0.4.0/examples/07-profiles/drivers/dmm.py +128 -0
  281. testerkit-0.4.0/examples/07-profiles/drivers/psu.py +122 -0
  282. testerkit-0.4.0/examples/07-profiles/fixtures/buck_3v3_bench.yaml +20 -0
  283. testerkit-0.4.0/examples/07-profiles/parts/buck_3v3.yaml +45 -0
  284. testerkit-0.4.0/examples/07-profiles/profiles/characterization.yaml +14 -0
  285. testerkit-0.4.0/examples/07-profiles/profiles/development.yaml +12 -0
  286. testerkit-0.4.0/examples/07-profiles/profiles/production.yaml +13 -0
  287. testerkit-0.4.0/examples/07-profiles/profiles/rail_family.yaml +9 -0
  288. testerkit-0.4.0/examples/07-profiles/pyproject.toml +16 -0
  289. testerkit-0.4.0/examples/07-profiles/pytest.ini +6 -0
  290. testerkit-0.4.0/examples/07-profiles/scripts/seed_channels.py +58 -0
  291. testerkit-0.4.0/examples/07-profiles/stations/bench_01.yaml +27 -0
  292. testerkit-0.4.0/examples/07-profiles/stations/types/bench.yaml +13 -0
  293. testerkit-0.4.0/examples/07-profiles/testerkit.yaml +11 -0
  294. testerkit-0.4.0/examples/07-profiles/tests/test_rail.py +36 -0
  295. testerkit-0.4.0/examples/07-profiles/tests/test_rail.yaml +16 -0
  296. testerkit-0.4.0/examples/08-waveform-evidence/README.md +58 -0
  297. testerkit-0.4.0/examples/08-waveform-evidence/conftest.py +28 -0
  298. testerkit-0.4.0/examples/08-waveform-evidence/drivers/__init__.py +6 -0
  299. testerkit-0.4.0/examples/08-waveform-evidence/drivers/psu.py +25 -0
  300. testerkit-0.4.0/examples/08-waveform-evidence/drivers/scope.py +95 -0
  301. testerkit-0.4.0/examples/08-waveform-evidence/pyproject.toml +16 -0
  302. testerkit-0.4.0/examples/08-waveform-evidence/pytest.ini +5 -0
  303. testerkit-0.4.0/examples/08-waveform-evidence/testerkit.yaml +3 -0
  304. testerkit-0.4.0/examples/08-waveform-evidence/tests/test_psu_step_response.py +60 -0
  305. testerkit-0.4.0/examples/09-instrument-streaming/README.md +125 -0
  306. testerkit-0.4.0/examples/09-instrument-streaming/drivers/__init__.py +5 -0
  307. testerkit-0.4.0/examples/09-instrument-streaming/drivers/dmm.py +43 -0
  308. testerkit-0.4.0/examples/09-instrument-streaming/pyproject.toml +16 -0
  309. testerkit-0.4.0/examples/09-instrument-streaming/scripts/live_dmm_monitor.py +66 -0
  310. testerkit-0.4.0/examples/09-instrument-streaming/scripts/live_dmm_reader.py +58 -0
  311. testerkit-0.4.0/examples/09-instrument-streaming/scripts/live_monitor_ui.py +151 -0
  312. testerkit-0.4.0/examples/09-instrument-streaming/stations/bench_01.yaml +9 -0
  313. testerkit-0.4.0/examples/09-instrument-streaming/testerkit.yaml +7 -0
  314. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/README.md +99 -0
  315. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/conftest.py +11 -0
  316. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/drivers/__init__.py +6 -0
  317. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/drivers/psu.py +27 -0
  318. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/drivers/scene.py +44 -0
  319. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/pyproject.toml +16 -0
  320. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/pytest.ini +4 -0
  321. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/stations/bench_01.yaml +9 -0
  322. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/testerkit.yaml +3 -0
  323. testerkit-0.4.0/examples/10-artifacts-and-byte-streams/tests/test_burn_in.py +114 -0
  324. testerkit-0.4.0/examples/11-querying-data/README.md +107 -0
  325. testerkit-0.4.0/examples/11-querying-data/pyproject.toml +16 -0
  326. testerkit-0.4.0/examples/11-querying-data/scripts/analyze.py +131 -0
  327. testerkit-0.4.0/examples/11-querying-data/scripts/seed_runs.py +87 -0
  328. testerkit-0.4.0/examples/11-querying-data/testerkit.yaml +2 -0
  329. testerkit-0.4.0/examples/12-parallel-sites/README.md +126 -0
  330. testerkit-0.4.0/examples/12-parallel-sites/drivers/__init__.py +11 -0
  331. testerkit-0.4.0/examples/12-parallel-sites/drivers/dmm.py +128 -0
  332. testerkit-0.4.0/examples/12-parallel-sites/drivers/psu.py +122 -0
  333. testerkit-0.4.0/examples/12-parallel-sites/fixtures/dual_site_bench.yaml +42 -0
  334. testerkit-0.4.0/examples/12-parallel-sites/pyproject.toml +16 -0
  335. testerkit-0.4.0/examples/12-parallel-sites/pytest.ini +11 -0
  336. testerkit-0.4.0/examples/12-parallel-sites/stations/bench_dual.yaml +25 -0
  337. testerkit-0.4.0/examples/12-parallel-sites/testerkit.yaml +5 -0
  338. testerkit-0.4.0/examples/12-parallel-sites/tests/test_dual_rail.py +28 -0
  339. testerkit-0.4.0/examples/12-parallel-sites/tests/test_dual_rail.yaml +11 -0
  340. testerkit-0.4.0/examples/README.md +60 -0
  341. testerkit-0.4.0/examples/interactive_station.py +381 -0
  342. testerkit-0.4.0/examples/scripts/demo_duckdb.py +116 -0
  343. testerkit-0.4.0/examples/scripts/demo_queries.sql +77 -0
  344. testerkit-0.4.0/examples/scripts/query_results.py +264 -0
  345. testerkit-0.4.0/examples/scripts/seed_artifact_demo.py +187 -0
  346. testerkit-0.4.0/examples/static/station.css +94 -0
  347. testerkit-0.4.0/pyproject.toml +246 -0
  348. testerkit-0.4.0/scripts/SCREENSHOTS.md +143 -0
  349. testerkit-0.4.0/scripts/_ontology_graph_template.html +359 -0
  350. testerkit-0.4.0/scripts/bench_at_rest_encoding.py +180 -0
  351. testerkit-0.4.0/scripts/bench_channel_scaling.py +66 -0
  352. testerkit-0.4.0/scripts/bench_file_scaling.py +79 -0
  353. testerkit-0.4.0/scripts/bench_index_scale.py +250 -0
  354. testerkit-0.4.0/scripts/bench_index_shape.py +289 -0
  355. testerkit-0.4.0/scripts/bench_measurement_storage.py +201 -0
  356. testerkit-0.4.0/scripts/build-skill-zip.py +182 -0
  357. testerkit-0.4.0/scripts/build_ontology_docs.py +413 -0
  358. testerkit-0.4.0/scripts/check-screenshot-drift.py +86 -0
  359. testerkit-0.4.0/scripts/fmt_yaml.py +57 -0
  360. testerkit-0.4.0/scripts/generate_reference_docs.py +1063 -0
  361. testerkit-0.4.0/scripts/regenerate-ui-screenshots.py +417 -0
  362. testerkit-0.4.0/scripts/seed-demo-data.py +415 -0
  363. testerkit-0.4.0/src/testerkit/__init__.py +68 -0
  364. testerkit-0.4.0/src/testerkit/analysis/__init__.py +9 -0
  365. testerkit-0.4.0/src/testerkit/analysis/_common.py +24 -0
  366. testerkit-0.4.0/src/testerkit/analysis/measurement_facets.py +524 -0
  367. testerkit-0.4.0/src/testerkit/analysis/measurements_query.py +1458 -0
  368. testerkit-0.4.0/src/testerkit/analysis/metrics.py +389 -0
  369. testerkit-0.4.0/src/testerkit/analysis/runs_query.py +434 -0
  370. testerkit-0.4.0/src/testerkit/analysis/steps_query.py +413 -0
  371. testerkit-0.4.0/src/testerkit/api/__init__.py +6 -0
  372. testerkit-0.4.0/src/testerkit/api/_mime.py +71 -0
  373. testerkit-0.4.0/src/testerkit/api/app.py +1171 -0
  374. testerkit-0.4.0/src/testerkit/api/dialogs/__init__.py +36 -0
  375. testerkit-0.4.0/src/testerkit/api/dialogs/manager.py +617 -0
  376. testerkit-0.4.0/src/testerkit/api/dialogs/models.py +79 -0
  377. testerkit-0.4.0/src/testerkit/api/models.py +80 -0
  378. testerkit-0.4.0/src/testerkit/api/responses.py +205 -0
  379. testerkit-0.4.0/src/testerkit/api/runner.py +222 -0
  380. testerkit-0.4.0/src/testerkit/api/schemas.py +311 -0
  381. testerkit-0.4.0/src/testerkit/benchmark/__init__.py +34 -0
  382. testerkit-0.4.0/src/testerkit/benchmark/concurrency.py +248 -0
  383. testerkit-0.4.0/src/testerkit/benchmark/core.py +232 -0
  384. testerkit-0.4.0/src/testerkit/benchmark/runner.py +628 -0
  385. testerkit-0.4.0/src/testerkit/benchmark/scenario.py +313 -0
  386. testerkit-0.4.0/src/testerkit/benchmark/system.py +191 -0
  387. testerkit-0.4.0/src/testerkit/benchmark/workloads.py +507 -0
  388. testerkit-0.4.0/src/testerkit/catalog/__init__.py +6 -0
  389. testerkit-0.4.0/src/testerkit/catalog/generic/generic_dmm.yaml +61 -0
  390. testerkit-0.4.0/src/testerkit/catalog/generic/generic_eload.yaml +31 -0
  391. testerkit-0.4.0/src/testerkit/catalog/generic/generic_fgen.yaml +56 -0
  392. testerkit-0.4.0/src/testerkit/catalog/generic/generic_oscilloscope.yaml +45 -0
  393. testerkit-0.4.0/src/testerkit/catalog/generic/generic_psu.yaml +77 -0
  394. testerkit-0.4.0/src/testerkit/catalog/generic/generic_smu.yaml +73 -0
  395. testerkit-0.4.0/src/testerkit/channels.py +538 -0
  396. testerkit-0.4.0/src/testerkit/cli/__init__.py +32 -0
  397. testerkit-0.4.0/src/testerkit/cli/_common.py +113 -0
  398. testerkit-0.4.0/src/testerkit/cli/_time.py +179 -0
  399. testerkit-0.4.0/src/testerkit/cli/benchmark_cmd.py +56 -0
  400. testerkit-0.4.0/src/testerkit/cli/catalog_cmd.py +39 -0
  401. testerkit-0.4.0/src/testerkit/cli/daemon.py +157 -0
  402. testerkit-0.4.0/src/testerkit/cli/data_cmd.py +1040 -0
  403. testerkit-0.4.0/src/testerkit/cli/discover_cmd.py +94 -0
  404. testerkit-0.4.0/src/testerkit/cli/docs_cmd.py +100 -0
  405. testerkit-0.4.0/src/testerkit/cli/instrument.py +172 -0
  406. testerkit-0.4.0/src/testerkit/cli/mcp_cmd.py +37 -0
  407. testerkit-0.4.0/src/testerkit/cli/metrics.py +366 -0
  408. testerkit-0.4.0/src/testerkit/cli/project.py +312 -0
  409. testerkit-0.4.0/src/testerkit/cli/root.py +14 -0
  410. testerkit-0.4.0/src/testerkit/cli/runs.py +412 -0
  411. testerkit-0.4.0/src/testerkit/cli/schema_cmd.py +87 -0
  412. testerkit-0.4.0/src/testerkit/cli/serve_cmd.py +50 -0
  413. testerkit-0.4.0/src/testerkit/cli/setup_cmd.py +604 -0
  414. testerkit-0.4.0/src/testerkit/cli/station.py +294 -0
  415. testerkit-0.4.0/src/testerkit/cli/validate.py +112 -0
  416. testerkit-0.4.0/src/testerkit/client.py +463 -0
  417. testerkit-0.4.0/src/testerkit/connect.py +635 -0
  418. testerkit-0.4.0/src/testerkit/data/__init__.py +8 -0
  419. testerkit-0.4.0/src/testerkit/data/_accumulator_pool.py +455 -0
  420. testerkit-0.4.0/src/testerkit/data/_atomic.py +59 -0
  421. testerkit-0.4.0/src/testerkit/data/_collection_indices.py +67 -0
  422. testerkit-0.4.0/src/testerkit/data/_daemon_lifecycle.py +535 -0
  423. testerkit-0.4.0/src/testerkit/data/_duckdb_daemon.py +695 -0
  424. testerkit-0.4.0/src/testerkit/data/_duckdb_flight_server.py +813 -0
  425. testerkit-0.4.0/src/testerkit/data/_event_filters.py +15 -0
  426. testerkit-0.4.0/src/testerkit/data/_event_reader.py +101 -0
  427. testerkit-0.4.0/src/testerkit/data/_flight_errors.py +199 -0
  428. testerkit-0.4.0/src/testerkit/data/_flight_query.py +202 -0
  429. testerkit-0.4.0/src/testerkit/data/_flight_retry.py +148 -0
  430. testerkit-0.4.0/src/testerkit/data/_flight_subscribe.py +67 -0
  431. testerkit-0.4.0/src/testerkit/data/_index_epoch.py +342 -0
  432. testerkit-0.4.0/src/testerkit/data/_ipc_writer.py +185 -0
  433. testerkit-0.4.0/src/testerkit/data/_json_safe.py +63 -0
  434. testerkit-0.4.0/src/testerkit/data/_process.py +18 -0
  435. testerkit-0.4.0/src/testerkit/data/_push_relay.py +124 -0
  436. testerkit-0.4.0/src/testerkit/data/_runs_duckdb_daemon.py +2704 -0
  437. testerkit-0.4.0/src/testerkit/data/_session_reaper.py +110 -0
  438. testerkit-0.4.0/src/testerkit/data/_sql_helpers.py +30 -0
  439. testerkit-0.4.0/src/testerkit/data/_store.py +24 -0
  440. testerkit-0.4.0/src/testerkit/data/backends/__init__.py +7 -0
  441. testerkit-0.4.0/src/testerkit/data/backends/_event_accumulator.py +957 -0
  442. testerkit-0.4.0/src/testerkit/data/backends/_row_helpers.py +1172 -0
  443. testerkit-0.4.0/src/testerkit/data/backends/parquet.py +1143 -0
  444. testerkit-0.4.0/src/testerkit/data/backends/protocol.py +35 -0
  445. testerkit-0.4.0/src/testerkit/data/channels/__init__.py +8 -0
  446. testerkit-0.4.0/src/testerkit/data/channels/_flight_daemon.py +75 -0
  447. testerkit-0.4.0/src/testerkit/data/channels/client.py +242 -0
  448. testerkit-0.4.0/src/testerkit/data/channels/flight_manager.py +88 -0
  449. testerkit-0.4.0/src/testerkit/data/channels/index.py +664 -0
  450. testerkit-0.4.0/src/testerkit/data/channels/models.py +418 -0
  451. testerkit-0.4.0/src/testerkit/data/channels/server.py +162 -0
  452. testerkit-0.4.0/src/testerkit/data/channels/store.py +1481 -0
  453. testerkit-0.4.0/src/testerkit/data/data_dir.py +61 -0
  454. testerkit-0.4.0/src/testerkit/data/duckdb_manager.py +79 -0
  455. testerkit-0.4.0/src/testerkit/data/event_log.py +384 -0
  456. testerkit-0.4.0/src/testerkit/data/event_store.py +768 -0
  457. testerkit-0.4.0/src/testerkit/data/events.py +1025 -0
  458. testerkit-0.4.0/src/testerkit/data/exporters/__init__.py +6 -0
  459. testerkit-0.4.0/src/testerkit/data/exporters/_helpers.py +40 -0
  460. testerkit-0.4.0/src/testerkit/data/exporters/csv_exporter.py +168 -0
  461. testerkit-0.4.0/src/testerkit/data/exporters/hdf5.py +234 -0
  462. testerkit-0.4.0/src/testerkit/data/exporters/json_exporter.py +229 -0
  463. testerkit-0.4.0/src/testerkit/data/exporters/mdf4.py +201 -0
  464. testerkit-0.4.0/src/testerkit/data/exporters/stdf.py +255 -0
  465. testerkit-0.4.0/src/testerkit/data/exporters/tdms.py +292 -0
  466. testerkit-0.4.0/src/testerkit/data/files/__init__.py +71 -0
  467. testerkit-0.4.0/src/testerkit/data/files/_backend.py +207 -0
  468. testerkit-0.4.0/src/testerkit/data/files/_catalog_daemon.py +84 -0
  469. testerkit-0.4.0/src/testerkit/data/files/catalog.py +218 -0
  470. testerkit-0.4.0/src/testerkit/data/files/catalog_manager.py +325 -0
  471. testerkit-0.4.0/src/testerkit/data/files/models.py +60 -0
  472. testerkit-0.4.0/src/testerkit/data/files/serializers.py +414 -0
  473. testerkit-0.4.0/src/testerkit/data/files/store.py +463 -0
  474. testerkit-0.4.0/src/testerkit/data/files/streaming.py +783 -0
  475. testerkit-0.4.0/src/testerkit/data/models.py +604 -0
  476. testerkit-0.4.0/src/testerkit/data/ref.py +152 -0
  477. testerkit-0.4.0/src/testerkit/data/retention.py +297 -0
  478. testerkit-0.4.0/src/testerkit/data/run_store.py +367 -0
  479. testerkit-0.4.0/src/testerkit/data/runs_duckdb_manager.py +103 -0
  480. testerkit-0.4.0/src/testerkit/data/schema_dispatch.py +191 -0
  481. testerkit-0.4.0/src/testerkit/data/schema_migrate.py +76 -0
  482. testerkit-0.4.0/src/testerkit/data/schema_versions.py +85 -0
  483. testerkit-0.4.0/src/testerkit/data/schemas.py +288 -0
  484. testerkit-0.4.0/src/testerkit/data/subscribers/__init__.py +48 -0
  485. testerkit-0.4.0/src/testerkit/data/subscribers/_base.py +20 -0
  486. testerkit-0.4.0/src/testerkit/data/subscribers/_output_file.py +25 -0
  487. testerkit-0.4.0/src/testerkit/data/subscribers/replay.py +55 -0
  488. testerkit-0.4.0/src/testerkit/environment.py +84 -0
  489. testerkit-0.4.0/src/testerkit/execution/__init__.py +11 -0
  490. testerkit-0.4.0/src/testerkit/execution/_git.py +190 -0
  491. testerkit-0.4.0/src/testerkit/execution/_state.py +740 -0
  492. testerkit-0.4.0/src/testerkit/execution/accessors.py +54 -0
  493. testerkit-0.4.0/src/testerkit/execution/audit.py +51 -0
  494. testerkit-0.4.0/src/testerkit/execution/cascade.py +85 -0
  495. testerkit-0.4.0/src/testerkit/execution/connections.py +491 -0
  496. testerkit-0.4.0/src/testerkit/execution/harness.py +1931 -0
  497. testerkit-0.4.0/src/testerkit/execution/instrument_events.py +42 -0
  498. testerkit-0.4.0/src/testerkit/execution/limits.py +154 -0
  499. testerkit-0.4.0/src/testerkit/execution/metadata.py +102 -0
  500. testerkit-0.4.0/src/testerkit/execution/mocks.py +63 -0
  501. testerkit-0.4.0/src/testerkit/execution/profiles.py +616 -0
  502. testerkit-0.4.0/src/testerkit/execution/run_scope.py +1331 -0
  503. testerkit-0.4.0/src/testerkit/execution/session_scope.py +196 -0
  504. testerkit-0.4.0/src/testerkit/execution/sidecar.py +280 -0
  505. testerkit-0.4.0/src/testerkit/execution/site_runner.py +705 -0
  506. testerkit-0.4.0/src/testerkit/execution/sites.py +183 -0
  507. testerkit-0.4.0/src/testerkit/execution/sync.py +294 -0
  508. testerkit-0.4.0/src/testerkit/execution/uut_provider.py +231 -0
  509. testerkit-0.4.0/src/testerkit/execution/vectors.py +205 -0
  510. testerkit-0.4.0/src/testerkit/execution/verify.py +396 -0
  511. testerkit-0.4.0/src/testerkit/expand.py +75 -0
  512. testerkit-0.4.0/src/testerkit/files.py +235 -0
  513. testerkit-0.4.0/src/testerkit/fixtures/__init__.py +6 -0
  514. testerkit-0.4.0/src/testerkit/fixtures/manager.py +357 -0
  515. testerkit-0.4.0/src/testerkit/grafana/__init__.py +1 -0
  516. testerkit-0.4.0/src/testerkit/grafana/bootstrap.py +61 -0
  517. testerkit-0.4.0/src/testerkit/grafana/cli.py +314 -0
  518. testerkit-0.4.0/src/testerkit/grafana/dashboards/asset_utilization.json +92 -0
  519. testerkit-0.4.0/src/testerkit/grafana/dashboards/channel_explorer.json +77 -0
  520. testerkit-0.4.0/src/testerkit/grafana/dashboards/event_log.json +92 -0
  521. testerkit-0.4.0/src/testerkit/grafana/dashboards/failure_pareto.json +104 -0
  522. testerkit-0.4.0/src/testerkit/grafana/dashboards/measurement_distribution.json +97 -0
  523. testerkit-0.4.0/src/testerkit/grafana/dashboards/measurement_trend.json +161 -0
  524. testerkit-0.4.0/src/testerkit/grafana/dashboards/station_comparison.json +95 -0
  525. testerkit-0.4.0/src/testerkit/grafana/dashboards/test_duration.json +104 -0
  526. testerkit-0.4.0/src/testerkit/grafana/dashboards/unit_traceability.json +73 -0
  527. testerkit-0.4.0/src/testerkit/grafana/dashboards/yield_overview.json +189 -0
  528. testerkit-0.4.0/src/testerkit/grafana/provisioning/dashboards.yaml.j2 +12 -0
  529. testerkit-0.4.0/src/testerkit/grafana/provisioning/datasources.yaml.j2 +17 -0
  530. testerkit-0.4.0/src/testerkit/grafana/server.py +282 -0
  531. testerkit-0.4.0/src/testerkit/init.py +724 -0
  532. testerkit-0.4.0/src/testerkit/instruments/__init__.py +10 -0
  533. testerkit-0.4.0/src/testerkit/instruments/base.py +82 -0
  534. testerkit-0.4.0/src/testerkit/instruments/discovery/__init__.py +62 -0
  535. testerkit-0.4.0/src/testerkit/instruments/discovery/_base.py +174 -0
  536. testerkit-0.4.0/src/testerkit/instruments/discovery/lxi.py +152 -0
  537. testerkit-0.4.0/src/testerkit/instruments/discovery/ni.py +95 -0
  538. testerkit-0.4.0/src/testerkit/instruments/discovery/serial.py +73 -0
  539. testerkit-0.4.0/src/testerkit/instruments/discovery/visa.py +98 -0
  540. testerkit-0.4.0/src/testerkit/instruments/lifecycle.py +213 -0
  541. testerkit-0.4.0/src/testerkit/instruments/loader.py +79 -0
  542. testerkit-0.4.0/src/testerkit/instruments/locks.py +178 -0
  543. testerkit-0.4.0/src/testerkit/instruments/mocks.py +230 -0
  544. testerkit-0.4.0/src/testerkit/instruments/observer.py +270 -0
  545. testerkit-0.4.0/src/testerkit/instruments/observers/__init__.py +36 -0
  546. testerkit-0.4.0/src/testerkit/instruments/observers/_base.py +68 -0
  547. testerkit-0.4.0/src/testerkit/instruments/observers/daqmx.py +70 -0
  548. testerkit-0.4.0/src/testerkit/instruments/observers/descriptor.py +69 -0
  549. testerkit-0.4.0/src/testerkit/instruments/observers/generic.py +92 -0
  550. testerkit-0.4.0/src/testerkit/instruments/observers/lantz.py +31 -0
  551. testerkit-0.4.0/src/testerkit/instruments/observers/modbus.py +96 -0
  552. testerkit-0.4.0/src/testerkit/instruments/observers/motion.py +68 -0
  553. testerkit-0.4.0/src/testerkit/instruments/observers/ni_modular.py +73 -0
  554. testerkit-0.4.0/src/testerkit/instruments/observers/ophyd.py +80 -0
  555. testerkit-0.4.0/src/testerkit/instruments/observers/pymeasure.py +120 -0
  556. testerkit-0.4.0/src/testerkit/instruments/observers/qcodes.py +66 -0
  557. testerkit-0.4.0/src/testerkit/instruments/observers/scpi.py +88 -0
  558. testerkit-0.4.0/src/testerkit/instruments/observers/tektronix.py +57 -0
  559. testerkit-0.4.0/src/testerkit/instruments/observers/visa.py +103 -0
  560. testerkit-0.4.0/src/testerkit/instruments/pool.py +459 -0
  561. testerkit-0.4.0/src/testerkit/instruments/proxy.py +59 -0
  562. testerkit-0.4.0/src/testerkit/instruments/route_manager.py +329 -0
  563. testerkit-0.4.0/src/testerkit/instruments/routed_proxy.py +88 -0
  564. testerkit-0.4.0/src/testerkit/instruments/server.py +508 -0
  565. testerkit-0.4.0/src/testerkit/instruments/switch.py +43 -0
  566. testerkit-0.4.0/src/testerkit/instruments/visa.py +294 -0
  567. testerkit-0.4.0/src/testerkit/matching/__init__.py +6 -0
  568. testerkit-0.4.0/src/testerkit/matching/service.py +969 -0
  569. testerkit-0.4.0/src/testerkit/mcp/__init__.py +6 -0
  570. testerkit-0.4.0/src/testerkit/mcp/server.py +681 -0
  571. testerkit-0.4.0/src/testerkit/mcp/tools.py +1868 -0
  572. testerkit-0.4.0/src/testerkit/models/__init__.py +18 -0
  573. testerkit-0.4.0/src/testerkit/models/capability.py +598 -0
  574. testerkit-0.4.0/src/testerkit/models/catalog.py +76 -0
  575. testerkit-0.4.0/src/testerkit/models/data_options.py +153 -0
  576. testerkit-0.4.0/src/testerkit/models/enums.py +334 -0
  577. testerkit-0.4.0/src/testerkit/models/instrument.py +152 -0
  578. testerkit-0.4.0/src/testerkit/models/instrument_asset.py +25 -0
  579. testerkit-0.4.0/src/testerkit/models/part.py +271 -0
  580. testerkit-0.4.0/src/testerkit/models/part_manifest.py +96 -0
  581. testerkit-0.4.0/src/testerkit/models/project.py +114 -0
  582. testerkit-0.4.0/src/testerkit/models/station.py +140 -0
  583. testerkit-0.4.0/src/testerkit/models/test_config.py +748 -0
  584. testerkit-0.4.0/src/testerkit/ontology/__init__.py +39 -0
  585. testerkit-0.4.0/src/testerkit/ontology/schema.py +188 -0
  586. testerkit-0.4.0/src/testerkit/ontology/testerkit.yaml +1420 -0
  587. testerkit-0.4.0/src/testerkit/parts/__init__.py +8 -0
  588. testerkit-0.4.0/src/testerkit/parts/context.py +181 -0
  589. testerkit-0.4.0/src/testerkit/parts/folder.py +251 -0
  590. testerkit-0.4.0/src/testerkit/parts/loader.py +27 -0
  591. testerkit-0.4.0/src/testerkit/prompts/__init__.py +17 -0
  592. testerkit-0.4.0/src/testerkit/prompts/core.py +133 -0
  593. testerkit-0.4.0/src/testerkit/pytest_plugin/__init__.py +1287 -0
  594. testerkit-0.4.0/src/testerkit/pytest_plugin/autouse.py +369 -0
  595. testerkit-0.4.0/src/testerkit/pytest_plugin/helpers.py +354 -0
  596. testerkit-0.4.0/src/testerkit/pytest_plugin/hooks.py +1982 -0
  597. testerkit-0.4.0/src/testerkit/pytest_plugin/markers.py +203 -0
  598. testerkit-0.4.0/src/testerkit/pytest_plugin/retry.py +37 -0
  599. testerkit-0.4.0/src/testerkit/pytest_plugin/sweeps.py +117 -0
  600. testerkit-0.4.0/src/testerkit/queries.py +78 -0
  601. testerkit-0.4.0/src/testerkit/reports/__init__.py +6 -0
  602. testerkit-0.4.0/src/testerkit/reports/core.py +492 -0
  603. testerkit-0.4.0/src/testerkit/reports/datasheet.py +831 -0
  604. testerkit-0.4.0/src/testerkit/reports/templates/datasheet.html +383 -0
  605. testerkit-0.4.0/src/testerkit/reports/templates/default.html +153 -0
  606. testerkit-0.4.0/src/testerkit/sbom.py +142 -0
  607. testerkit-0.4.0/src/testerkit/schema_export.py +101 -0
  608. testerkit-0.4.0/src/testerkit/signals.py +63 -0
  609. testerkit-0.4.0/src/testerkit/skills/README.md +58 -0
  610. testerkit-0.4.0/src/testerkit/skills/templates/project-instructions.md +125 -0
  611. testerkit-0.4.0/src/testerkit/skills/testerkit-analysis/SKILL.md +87 -0
  612. testerkit-0.4.0/src/testerkit/skills/testerkit-capture/SKILL.md +114 -0
  613. testerkit-0.4.0/src/testerkit/skills/testerkit-data/SKILL.md +138 -0
  614. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/SKILL.md +100 -0
  615. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/scaffold-writer.md +115 -0
  616. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/section-extractor.md +98 -0
  617. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/section-reviewer.md +153 -0
  618. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/section-splitter.md +89 -0
  619. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/section-writer.md +226 -0
  620. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/references/catalog-pipeline.md +271 -0
  621. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/references/process-queue.md +42 -0
  622. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/references/scaffold.md +156 -0
  623. testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/references/test-pipeline.md +312 -0
  624. testerkit-0.4.0/src/testerkit/skills/testerkit-debug/SKILL.md +127 -0
  625. testerkit-0.4.0/src/testerkit/skills/testerkit-interactive/SKILL.md +188 -0
  626. testerkit-0.4.0/src/testerkit/skills/testerkit-interactive/references/live-ui-patterns.md +102 -0
  627. testerkit-0.4.0/src/testerkit/skills/testerkit-mocks/SKILL.md +128 -0
  628. testerkit-0.4.0/src/testerkit/skills/testerkit-parts/SKILL.md +126 -0
  629. testerkit-0.4.0/src/testerkit/skills/testerkit-profiles/SKILL.md +139 -0
  630. testerkit-0.4.0/src/testerkit/skills/testerkit-sites/SKILL.md +140 -0
  631. testerkit-0.4.0/src/testerkit/skills/testerkit-stations/SKILL.md +146 -0
  632. testerkit-0.4.0/src/testerkit/skills/testerkit-tests/SKILL.md +136 -0
  633. testerkit-0.4.0/src/testerkit/store.py +1639 -0
  634. testerkit-0.4.0/src/testerkit/ui/__init__.py +71 -0
  635. testerkit-0.4.0/src/testerkit/ui/_asgi.py +162 -0
  636. testerkit-0.4.0/src/testerkit/ui/app.py +32 -0
  637. testerkit-0.4.0/src/testerkit/ui/components/__init__.py +13 -0
  638. testerkit-0.4.0/src/testerkit/ui/components/artifact_viewer.py +250 -0
  639. testerkit-0.4.0/src/testerkit/ui/components/channel_values.py +159 -0
  640. testerkit-0.4.0/src/testerkit/ui/components/event_timeline.py +222 -0
  641. testerkit-0.4.0/src/testerkit/ui/components/execution_gantt.py +210 -0
  642. testerkit-0.4.0/src/testerkit/ui/components/file_streams.py +147 -0
  643. testerkit-0.4.0/src/testerkit/ui/components/instrument_activity.py +146 -0
  644. testerkit-0.4.0/src/testerkit/ui/components/session_table.py +118 -0
  645. testerkit-0.4.0/src/testerkit/ui/pages/__init__.py +25 -0
  646. testerkit-0.4.0/src/testerkit/ui/pages/channels/__init__.py +4 -0
  647. testerkit-0.4.0/src/testerkit/ui/pages/channels/detail.py +932 -0
  648. testerkit-0.4.0/src/testerkit/ui/pages/channels/list.py +515 -0
  649. testerkit-0.4.0/src/testerkit/ui/pages/dashboard.py +236 -0
  650. testerkit-0.4.0/src/testerkit/ui/pages/designer/__init__.py +5 -0
  651. testerkit-0.4.0/src/testerkit/ui/pages/designer/graph.py +635 -0
  652. testerkit-0.4.0/src/testerkit/ui/pages/designer/matching.py +663 -0
  653. testerkit-0.4.0/src/testerkit/ui/pages/designer/page.py +593 -0
  654. testerkit-0.4.0/src/testerkit/ui/pages/designer/properties.py +591 -0
  655. testerkit-0.4.0/src/testerkit/ui/pages/designer/state.py +468 -0
  656. testerkit-0.4.0/src/testerkit/ui/pages/docs/__init__.py +6 -0
  657. testerkit-0.4.0/src/testerkit/ui/pages/docs/index.py +95 -0
  658. testerkit-0.4.0/src/testerkit/ui/pages/docs/page.py +698 -0
  659. testerkit-0.4.0/src/testerkit/ui/pages/events/__init__.py +3 -0
  660. testerkit-0.4.0/src/testerkit/ui/pages/events/list.py +263 -0
  661. testerkit-0.4.0/src/testerkit/ui/pages/explore.py +1108 -0
  662. testerkit-0.4.0/src/testerkit/ui/pages/files/__init__.py +4 -0
  663. testerkit-0.4.0/src/testerkit/ui/pages/files/detail.py +426 -0
  664. testerkit-0.4.0/src/testerkit/ui/pages/files/list.py +447 -0
  665. testerkit-0.4.0/src/testerkit/ui/pages/fixtures/__init__.py +8 -0
  666. testerkit-0.4.0/src/testerkit/ui/pages/fixtures/detail.py +280 -0
  667. testerkit-0.4.0/src/testerkit/ui/pages/fixtures/edit.py +370 -0
  668. testerkit-0.4.0/src/testerkit/ui/pages/fixtures/list.py +180 -0
  669. testerkit-0.4.0/src/testerkit/ui/pages/fixtures/new.py +195 -0
  670. testerkit-0.4.0/src/testerkit/ui/pages/instruments/__init__.py +4 -0
  671. testerkit-0.4.0/src/testerkit/ui/pages/instruments/detail.py +320 -0
  672. testerkit-0.4.0/src/testerkit/ui/pages/instruments/edit.py +482 -0
  673. testerkit-0.4.0/src/testerkit/ui/pages/instruments/list.py +249 -0
  674. testerkit-0.4.0/src/testerkit/ui/pages/instruments/new.py +200 -0
  675. testerkit-0.4.0/src/testerkit/ui/pages/launch.py +261 -0
  676. testerkit-0.4.0/src/testerkit/ui/pages/live.py +124 -0
  677. testerkit-0.4.0/src/testerkit/ui/pages/metrics_page.py +1229 -0
  678. testerkit-0.4.0/src/testerkit/ui/pages/parts/__init__.py +11 -0
  679. testerkit-0.4.0/src/testerkit/ui/pages/parts/detail.py +202 -0
  680. testerkit-0.4.0/src/testerkit/ui/pages/parts/edit.py +310 -0
  681. testerkit-0.4.0/src/testerkit/ui/pages/parts/list.py +160 -0
  682. testerkit-0.4.0/src/testerkit/ui/pages/parts/new.py +170 -0
  683. testerkit-0.4.0/src/testerkit/ui/pages/parts/requirements.py +153 -0
  684. testerkit-0.4.0/src/testerkit/ui/pages/parts/stations.py +199 -0
  685. testerkit-0.4.0/src/testerkit/ui/pages/profiles/__init__.py +4 -0
  686. testerkit-0.4.0/src/testerkit/ui/pages/profiles/detail.py +113 -0
  687. testerkit-0.4.0/src/testerkit/ui/pages/profiles/list.py +86 -0
  688. testerkit-0.4.0/src/testerkit/ui/pages/results/__init__.py +4 -0
  689. testerkit-0.4.0/src/testerkit/ui/pages/results/detail.py +631 -0
  690. testerkit-0.4.0/src/testerkit/ui/pages/results/list.py +230 -0
  691. testerkit-0.4.0/src/testerkit/ui/pages/stations/__init__.py +4 -0
  692. testerkit-0.4.0/src/testerkit/ui/pages/stations/detail.py +256 -0
  693. testerkit-0.4.0/src/testerkit/ui/pages/stations/edit.py +273 -0
  694. testerkit-0.4.0/src/testerkit/ui/pages/stations/list.py +180 -0
  695. testerkit-0.4.0/src/testerkit/ui/pages/stations/new.py +311 -0
  696. testerkit-0.4.0/src/testerkit/ui/pages/tests/__init__.py +4 -0
  697. testerkit-0.4.0/src/testerkit/ui/pages/tests/detail.py +152 -0
  698. testerkit-0.4.0/src/testerkit/ui/pages/tests/list.py +194 -0
  699. testerkit-0.4.0/src/testerkit/ui/pages/uuts/__init__.py +4 -0
  700. testerkit-0.4.0/src/testerkit/ui/pages/uuts/list.py +97 -0
  701. testerkit-0.4.0/src/testerkit/ui/shared/__init__.py +8 -0
  702. testerkit-0.4.0/src/testerkit/ui/shared/components.py +1826 -0
  703. testerkit-0.4.0/src/testerkit/ui/shared/dialogs.py +105 -0
  704. testerkit-0.4.0/src/testerkit/ui/shared/event_binding.py +194 -0
  705. testerkit-0.4.0/src/testerkit/ui/shared/layout.py +314 -0
  706. testerkit-0.4.0/src/testerkit/ui/shared/services.py +1719 -0
  707. testerkit-0.4.0/src/testerkit/ui/shared/timestamps.py +21 -0
  708. testerkit-0.4.0/src/testerkit/ui/static/branding/favicon-16.png +0 -0
  709. testerkit-0.4.0/src/testerkit/ui/static/branding/favicon-32.png +0 -0
  710. testerkit-0.4.0/src/testerkit/ui/static/branding/favicon-48.png +0 -0
  711. testerkit-0.4.0/src/testerkit/ui/static/branding/testerkit-icon-256.png +0 -0
  712. testerkit-0.4.0/src/testerkit/ui/static/branding/testerkit-mark.svg +1 -0
  713. testerkit-0.4.0/src/testerkit/ui/static/branding/testerkit-wordmark.svg +1 -0
  714. testerkit-0.4.0/src/testerkit/ui/static/global.css +465 -0
  715. testerkit-0.4.0/src/testerkit/utils/__init__.py +17 -0
  716. testerkit-0.4.0/src/testerkit/utils/enum_meta.py +800 -0
  717. testerkit-0.4.0/src/testerkit/utils/paths.py +75 -0
  718. testerkit-0.4.0/src/testerkit/utils/ranges.py +257 -0
  719. testerkit-0.4.0/src/testerkit/validation.py +82 -0
  720. testerkit-0.4.0/src/testerkit/verbs.py +142 -0
  721. testerkit-0.4.0/tests/__init__.py +0 -0
  722. testerkit-0.4.0/tests/conftest.py +126 -0
  723. testerkit-0.4.0/tests/fixtures/specs/base_board.yaml +28 -0
  724. testerkit-0.4.0/tests/fixtures/specs/base_board_with_driver.yaml +28 -0
  725. testerkit-0.4.0/tests/fixtures/specs/circular_a.yaml +13 -0
  726. testerkit-0.4.0/tests/fixtures/specs/circular_b.yaml +13 -0
  727. testerkit-0.4.0/tests/fixtures/specs/power_board_v1.yaml +116 -0
  728. testerkit-0.4.0/tests/fixtures/specs/variant_board.yaml +14 -0
  729. testerkit-0.4.0/tests/fixtures/specs/variant_driver_inherit.yaml +3 -0
  730. testerkit-0.4.0/tests/fixtures/specs/variant_driver_override.yaml +4 -0
  731. testerkit-0.4.0/tests/fixtures/specs/variant_inherit_all.yaml +3 -0
  732. testerkit-0.4.0/tests/test_ai_surfaces_accuracy.py +245 -0
  733. testerkit-0.4.0/tests/test_api/test_mime_sniff.py +46 -0
  734. testerkit-0.4.0/tests/test_api/test_ref_endpoint.py +216 -0
  735. testerkit-0.4.0/tests/test_api/test_run_detail.py +152 -0
  736. testerkit-0.4.0/tests/test_api/test_steps_endpoint.py +124 -0
  737. testerkit-0.4.0/tests/test_api/test_utc_timestamp.py +83 -0
  738. testerkit-0.4.0/tests/test_catalog/__init__.py +0 -0
  739. testerkit-0.4.0/tests/test_catalog/test_loader.py +487 -0
  740. testerkit-0.4.0/tests/test_catalog/test_spec_bands.py +86 -0
  741. testerkit-0.4.0/tests/test_cli/__init__.py +0 -0
  742. testerkit-0.4.0/tests/test_cli/test_data_index.py +625 -0
  743. testerkit-0.4.0/tests/test_cli/test_time_utils.py +283 -0
  744. testerkit-0.4.0/tests/test_client.py +36 -0
  745. testerkit-0.4.0/tests/test_config/__init__.py +1 -0
  746. testerkit-0.4.0/tests/test_config/test_expand_helpers.py +255 -0
  747. testerkit-0.4.0/tests/test_config/test_expander_wiring.py +67 -0
  748. testerkit-0.4.0/tests/test_config/test_markers.py +202 -0
  749. testerkit-0.4.0/tests/test_config/test_models.py +153 -0
  750. testerkit-0.4.0/tests/test_config/test_station_compliance.py +101 -0
  751. testerkit-0.4.0/tests/test_config/test_switch_route.py +81 -0
  752. testerkit-0.4.0/tests/test_connect.py +410 -0
  753. testerkit-0.4.0/tests/test_conventions.py +316 -0
  754. testerkit-0.4.0/tests/test_data/__init__.py +1 -0
  755. testerkit-0.4.0/tests/test_data/conftest.py +383 -0
  756. testerkit-0.4.0/tests/test_data/golden/schema_v0_1/events.arrow +0 -0
  757. testerkit-0.4.0/tests/test_data/golden/schema_v0_1/files.meta.json +1 -0
  758. testerkit-0.4.0/tests/test_data/golden/schema_v0_1/runs.parquet +0 -0
  759. testerkit-0.4.0/tests/test_data/test_atomic.py +67 -0
  760. testerkit-0.4.0/tests/test_data/test_channel_payload_column_unified.py +215 -0
  761. testerkit-0.4.0/tests/test_data/test_channel_server.py +343 -0
  762. testerkit-0.4.0/tests/test_data/test_channel_store.py +478 -0
  763. testerkit-0.4.0/tests/test_data/test_channel_store_finalizer.py +81 -0
  764. testerkit-0.4.0/tests/test_data/test_channel_verbs.py +133 -0
  765. testerkit-0.4.0/tests/test_data/test_channel_write_core.py +333 -0
  766. testerkit-0.4.0/tests/test_data/test_channels_received_at_sampled_at.py +351 -0
  767. testerkit-0.4.0/tests/test_data/test_channels_typed_leaf_types.py +241 -0
  768. testerkit-0.4.0/tests/test_data/test_checkpoints.py +174 -0
  769. testerkit-0.4.0/tests/test_data/test_daemon_lifecycle.py +129 -0
  770. testerkit-0.4.0/tests/test_data/test_dangling_refs.py +38 -0
  771. testerkit-0.4.0/tests/test_data/test_event_log.py +176 -0
  772. testerkit-0.4.0/tests/test_data/test_event_reader.py +98 -0
  773. testerkit-0.4.0/tests/test_data/test_event_registry_consistency.py +76 -0
  774. testerkit-0.4.0/tests/test_data/test_event_store.py +271 -0
  775. testerkit-0.4.0/tests/test_data/test_event_store_finalizer.py +78 -0
  776. testerkit-0.4.0/tests/test_data/test_event_store_write_resilience.py +196 -0
  777. testerkit-0.4.0/tests/test_data/test_events.py +268 -0
  778. testerkit-0.4.0/tests/test_data/test_events_index_epoch.py +235 -0
  779. testerkit-0.4.0/tests/test_data/test_export_hdf5.py +198 -0
  780. testerkit-0.4.0/tests/test_data/test_export_mdf4.py +159 -0
  781. testerkit-0.4.0/tests/test_data/test_export_stdf.py +237 -0
  782. testerkit-0.4.0/tests/test_data/test_export_tdms.py +144 -0
  783. testerkit-0.4.0/tests/test_data/test_files_catalog.py +150 -0
  784. testerkit-0.4.0/tests/test_data/test_filestore_attributes.py +311 -0
  785. testerkit-0.4.0/tests/test_data/test_filestore_backend_swap.py +102 -0
  786. testerkit-0.4.0/tests/test_data/test_filestore_e2e.py +323 -0
  787. testerkit-0.4.0/tests/test_data/test_filestore_put.py +449 -0
  788. testerkit-0.4.0/tests/test_data/test_filestore_streaming.py +586 -0
  789. testerkit-0.4.0/tests/test_data/test_filestore_unify_refs.py +240 -0
  790. testerkit-0.4.0/tests/test_data/test_flight_server_subscribe.py +284 -0
  791. testerkit-0.4.0/tests/test_data/test_golden_corpus.py +127 -0
  792. testerkit-0.4.0/tests/test_data/test_index_epoch.py +379 -0
  793. testerkit-0.4.0/tests/test_data/test_ingestion_drift.py +212 -0
  794. testerkit-0.4.0/tests/test_data/test_instrument_arrays.py +92 -0
  795. testerkit-0.4.0/tests/test_data/test_instrument_events.py +117 -0
  796. testerkit-0.4.0/tests/test_data/test_instruments_per_step.py +432 -0
  797. testerkit-0.4.0/tests/test_data/test_materializer.py +402 -0
  798. testerkit-0.4.0/tests/test_data/test_materializer_auto_promotion.py +562 -0
  799. testerkit-0.4.0/tests/test_data/test_measurement_attribution.py +192 -0
  800. testerkit-0.4.0/tests/test_data/test_measurement_writer.py +60 -0
  801. testerkit-0.4.0/tests/test_data/test_models.py +213 -0
  802. testerkit-0.4.0/tests/test_data/test_observation_pin.py +313 -0
  803. testerkit-0.4.0/tests/test_data/test_overlay_schema_consistency.py +728 -0
  804. testerkit-0.4.0/tests/test_data/test_perf.py +1148 -0
  805. testerkit-0.4.0/tests/test_data/test_perf_daemon.py +801 -0
  806. testerkit-0.4.0/tests/test_data/test_promote_references.py +84 -0
  807. testerkit-0.4.0/tests/test_data/test_push_relay.py +126 -0
  808. testerkit-0.4.0/tests/test_data/test_ref.py +126 -0
  809. testerkit-0.4.0/tests/test_data/test_relocation.py +40 -0
  810. testerkit-0.4.0/tests/test_data/test_replay.py +155 -0
  811. testerkit-0.4.0/tests/test_data/test_retention.py +212 -0
  812. testerkit-0.4.0/tests/test_data/test_retry_model.py +356 -0
  813. testerkit-0.4.0/tests/test_data/test_run_store.py +308 -0
  814. testerkit-0.4.0/tests/test_data/test_runs_daemon_concurrency.py +315 -0
  815. testerkit-0.4.0/tests/test_data/test_runs_duckdb_daemon_subscriber.py +340 -0
  816. testerkit-0.4.0/tests/test_data/test_runs_index_selfheal.py +370 -0
  817. testerkit-0.4.0/tests/test_data/test_schema_coexistence.py +91 -0
  818. testerkit-0.4.0/tests/test_data/test_schema_convention.py +50 -0
  819. testerkit-0.4.0/tests/test_data/test_schema_dispatch.py +260 -0
  820. testerkit-0.4.0/tests/test_data/test_schema_migrate.py +109 -0
  821. testerkit-0.4.0/tests/test_data/test_serializers_registry.py +353 -0
  822. testerkit-0.4.0/tests/test_data/test_session_reaper.py +106 -0
  823. testerkit-0.4.0/tests/test_data/test_terminal_fence.py +85 -0
  824. testerkit-0.4.0/tests/test_data/test_v020_subscription_poc.py +381 -0
  825. testerkit-0.4.0/tests/test_data/test_vector_grained_records.py +1148 -0
  826. testerkit-0.4.0/tests/test_data/test_warm_index_persistence.py +143 -0
  827. testerkit-0.4.0/tests/test_data/test_write_schema.py +201 -0
  828. testerkit-0.4.0/tests/test_data/test_xydata_and_complex.py +219 -0
  829. testerkit-0.4.0/tests/test_datasheet.py +309 -0
  830. testerkit-0.4.0/tests/test_dialog_demo.py +92 -0
  831. testerkit-0.4.0/tests/test_dialogs/__init__.py +0 -0
  832. testerkit-0.4.0/tests/test_dialogs/test_dialog_events.py +144 -0
  833. testerkit-0.4.0/tests/test_discovery/__init__.py +0 -0
  834. testerkit-0.4.0/tests/test_discovery/test_models.py +32 -0
  835. testerkit-0.4.0/tests/test_discovery/test_scanner.py +76 -0
  836. testerkit-0.4.0/tests/test_e2e/test_example_scripts.py +68 -0
  837. testerkit-0.4.0/tests/test_e2e/test_examples.py +66 -0
  838. testerkit-0.4.0/tests/test_e2e/test_spec_to_results.py +461 -0
  839. testerkit-0.4.0/tests/test_e2e/test_workflows.py +307 -0
  840. testerkit-0.4.0/tests/test_environment.py +60 -0
  841. testerkit-0.4.0/tests/test_execution/__init__.py +1 -0
  842. testerkit-0.4.0/tests/test_execution/test_class_container_reservation.py +162 -0
  843. testerkit-0.4.0/tests/test_execution/test_class_keying.py +86 -0
  844. testerkit-0.4.0/tests/test_execution/test_class_step_containers.py +831 -0
  845. testerkit-0.4.0/tests/test_execution/test_connections_resolution.py +711 -0
  846. testerkit-0.4.0/tests/test_execution/test_context_session_attrs.py +141 -0
  847. testerkit-0.4.0/tests/test_execution/test_files_stream_verb.py +286 -0
  848. testerkit-0.4.0/tests/test_execution/test_grain_reshape_e2e_acceptance.py +728 -0
  849. testerkit-0.4.0/tests/test_execution/test_harness.py +885 -0
  850. testerkit-0.4.0/tests/test_execution/test_limits.py +317 -0
  851. testerkit-0.4.0/tests/test_execution/test_logger.py +391 -0
  852. testerkit-0.4.0/tests/test_execution/test_markers_sidecar.py +393 -0
  853. testerkit-0.4.0/tests/test_execution/test_multi_uut_e2e.py +161 -0
  854. testerkit-0.4.0/tests/test_execution/test_observe_blob_claim.py +212 -0
  855. testerkit-0.4.0/tests/test_execution/test_observe_dispatch_and_namespace.py +313 -0
  856. testerkit-0.4.0/tests/test_execution/test_observe_emit_event.py +316 -0
  857. testerkit-0.4.0/tests/test_execution/test_observe_handle_latching.py +256 -0
  858. testerkit-0.4.0/tests/test_execution/test_observe_mirrors_to_vector.py +118 -0
  859. testerkit-0.4.0/tests/test_execution/test_outcome_cascade.py +177 -0
  860. testerkit-0.4.0/tests/test_execution/test_part_resolution.py +112 -0
  861. testerkit-0.4.0/tests/test_execution/test_phase1_grain_reshape.py +200 -0
  862. testerkit-0.4.0/tests/test_execution/test_phase_and_mocks.py +279 -0
  863. testerkit-0.4.0/tests/test_execution/test_phase_wiring.py +205 -0
  864. testerkit-0.4.0/tests/test_execution/test_profile_facets.py +303 -0
  865. testerkit-0.4.0/tests/test_execution/test_prompt_fixture.py +284 -0
  866. testerkit-0.4.0/tests/test_execution/test_pytest_native_plugin.py +678 -0
  867. testerkit-0.4.0/tests/test_execution/test_required_inputs.py +187 -0
  868. testerkit-0.4.0/tests/test_execution/test_session_scope_tokens.py +52 -0
  869. testerkit-0.4.0/tests/test_execution/test_site_flag.py +275 -0
  870. testerkit-0.4.0/tests/test_execution/test_site_runner.py +146 -0
  871. testerkit-0.4.0/tests/test_execution/test_site_termination.py +169 -0
  872. testerkit-0.4.0/tests/test_execution/test_sites.py +364 -0
  873. testerkit-0.4.0/tests/test_execution/test_step_end_owning_context.py +49 -0
  874. testerkit-0.4.0/tests/test_execution/test_stream_verb_and_power_user.py +260 -0
  875. testerkit-0.4.0/tests/test_execution/test_sync.py +237 -0
  876. testerkit-0.4.0/tests/test_execution/test_top_level_verbs.py +89 -0
  877. testerkit-0.4.0/tests/test_execution/test_uut_provider.py +237 -0
  878. testerkit-0.4.0/tests/test_execution/test_vector_step_index_emit.py +157 -0
  879. testerkit-0.4.0/tests/test_execution/test_vectors.py +257 -0
  880. testerkit-0.4.0/tests/test_execution/test_vectors_fixture.py +336 -0
  881. testerkit-0.4.0/tests/test_execution/test_verb_symmetry_observe_verify.py +173 -0
  882. testerkit-0.4.0/tests/test_execution/test_verify_cascade.py +250 -0
  883. testerkit-0.4.0/tests/test_execution/test_verify_polymorphic.py +294 -0
  884. testerkit-0.4.0/tests/test_execution/test_when_limits.py +334 -0
  885. testerkit-0.4.0/tests/test_exporters.py +643 -0
  886. testerkit-0.4.0/tests/test_fixtures/test_manager.py +208 -0
  887. testerkit-0.4.0/tests/test_grafana_server.py +138 -0
  888. testerkit-0.4.0/tests/test_init.py +201 -0
  889. testerkit-0.4.0/tests/test_instruments/__init__.py +0 -0
  890. testerkit-0.4.0/tests/test_instruments/test_base.py +106 -0
  891. testerkit-0.4.0/tests/test_instruments/test_channel_lifecycle.py +336 -0
  892. testerkit-0.4.0/tests/test_instruments/test_discovery.py +186 -0
  893. testerkit-0.4.0/tests/test_instruments/test_lifecycle.py +111 -0
  894. testerkit-0.4.0/tests/test_instruments/test_loader.py +286 -0
  895. testerkit-0.4.0/tests/test_instruments/test_locks.py +169 -0
  896. testerkit-0.4.0/tests/test_instruments/test_lxi.py +97 -0
  897. testerkit-0.4.0/tests/test_instruments/test_mocks.py +343 -0
  898. testerkit-0.4.0/tests/test_instruments/test_models.py +217 -0
  899. testerkit-0.4.0/tests/test_instruments/test_observer.py +169 -0
  900. testerkit-0.4.0/tests/test_instruments/test_observer_blob_claim.py +365 -0
  901. testerkit-0.4.0/tests/test_instruments/test_observers/__init__.py +0 -0
  902. testerkit-0.4.0/tests/test_instruments/test_observers/conftest.py +44 -0
  903. testerkit-0.4.0/tests/test_instruments/test_observers/test_daqmx.py +56 -0
  904. testerkit-0.4.0/tests/test_instruments/test_observers/test_generic.py +101 -0
  905. testerkit-0.4.0/tests/test_instruments/test_observers/test_lantz.py +71 -0
  906. testerkit-0.4.0/tests/test_instruments/test_observers/test_modbus.py +60 -0
  907. testerkit-0.4.0/tests/test_instruments/test_observers/test_motion.py +76 -0
  908. testerkit-0.4.0/tests/test_instruments/test_observers/test_ni_modular.py +58 -0
  909. testerkit-0.4.0/tests/test_instruments/test_observers/test_ophyd.py +78 -0
  910. testerkit-0.4.0/tests/test_instruments/test_observers/test_pymeasure.py +226 -0
  911. testerkit-0.4.0/tests/test_instruments/test_observers/test_qcodes.py +71 -0
  912. testerkit-0.4.0/tests/test_instruments/test_observers/test_registry.py +128 -0
  913. testerkit-0.4.0/tests/test_instruments/test_observers/test_scpi.py +49 -0
  914. testerkit-0.4.0/tests/test_instruments/test_observers/test_tektronix.py +58 -0
  915. testerkit-0.4.0/tests/test_instruments/test_observers/test_visa.py +97 -0
  916. testerkit-0.4.0/tests/test_instruments/test_pool.py +372 -0
  917. testerkit-0.4.0/tests/test_instruments/test_proxy.py +245 -0
  918. testerkit-0.4.0/tests/test_instruments/test_route_manager.py +307 -0
  919. testerkit-0.4.0/tests/test_instruments/test_routed_proxy.py +108 -0
  920. testerkit-0.4.0/tests/test_instruments/test_server.py +772 -0
  921. testerkit-0.4.0/tests/test_matching/__init__.py +1 -0
  922. testerkit-0.4.0/tests/test_matching/test_channel_matching.py +642 -0
  923. testerkit-0.4.0/tests/test_matching/test_conditions.py +525 -0
  924. testerkit-0.4.0/tests/test_matching/test_recommend.py +396 -0
  925. testerkit-0.4.0/tests/test_matching/test_service.py +537 -0
  926. testerkit-0.4.0/tests/test_measurements_query/__init__.py +0 -0
  927. testerkit-0.4.0/tests/test_measurements_query/test_index_derivation.py +123 -0
  928. testerkit-0.4.0/tests/test_measurements_query/test_measurement_facets.py +167 -0
  929. testerkit-0.4.0/tests/test_measurements_query/test_measurements_query_sql.py +1424 -0
  930. testerkit-0.4.0/tests/test_ontology.py +40 -0
  931. testerkit-0.4.0/tests/test_parts/test_loader.py +284 -0
  932. testerkit-0.4.0/tests/test_parts/test_models.py +175 -0
  933. testerkit-0.4.0/tests/test_parts/test_part_specband.py +89 -0
  934. testerkit-0.4.0/tests/test_plugin_fixtures.py +350 -0
  935. testerkit-0.4.0/tests/test_queries_surface.py +45 -0
  936. testerkit-0.4.0/tests/test_reports.py +329 -0
  937. testerkit-0.4.0/tests/test_runs_query/__init__.py +0 -0
  938. testerkit-0.4.0/tests/test_runs_query/test_runs_query.py +480 -0
  939. testerkit-0.4.0/tests/test_sbom.py +151 -0
  940. testerkit-0.4.0/tests/test_schemas.py +32 -0
  941. testerkit-0.4.0/tests/test_signals.py +40 -0
  942. testerkit-0.4.0/tests/test_steps_query/__init__.py +0 -0
  943. testerkit-0.4.0/tests/test_steps_query/test_steps_query.py +315 -0
  944. testerkit-0.4.0/tests/test_ui/__init__.py +0 -0
  945. testerkit-0.4.0/tests/test_ui/test_files_page_service.py +130 -0
  946. testerkit-0.4.0/tests/test_ui/test_fixtures_provenance.py +109 -0
  947. testerkit-0.4.0/tests/test_ui/test_instruments_provenance.py +103 -0
  948. testerkit-0.4.0/tests/test_ui/test_parts_provenance.py +135 -0
  949. testerkit-0.4.0/tests/test_ui/test_run_detail_service.py +120 -0
  950. testerkit-0.4.0/tests/test_ui/test_stations_provenance.py +128 -0
  951. testerkit-0.4.0/tests/test_ui/test_subscribe_with_refresh.py +157 -0
  952. testerkit-0.4.0/tests/test_ui/test_ui_surface.py +62 -0
  953. testerkit-0.4.0/tests/test_ui/test_utc_date_input.py +63 -0
  954. testerkit-0.4.0/tests/test_ui/test_uuts_from_runs.py +121 -0
  955. testerkit-0.4.0/tests/test_utils/__init__.py +1 -0
  956. testerkit-0.4.0/tests/test_utils/test_enum_meta.py +140 -0
  957. testerkit-0.4.0/tests/test_utils/test_ranges.py +240 -0
  958. testerkit-0.4.0/tests/test_uut_options.py +106 -0
  959. testerkit-0.4.0/tests/test_yield/__init__.py +0 -0
  960. testerkit-0.4.0/tests/test_yield/test_cli.py +196 -0
  961. testerkit-0.4.0/tests/test_yield/test_metrics.py +298 -0
@@ -0,0 +1,39 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ *.egg-info/
5
+ dist/
6
+ /data/
7
+ /examples/*/data/
8
+ .ruff_cache/
9
+ .pytest_cache/
10
+ .coverage
11
+ .claude/settings.local.json
12
+ .claude/scheduled_tasks.lock
13
+ .tmp/
14
+ examples/uv.lock
15
+ examples/*/uv.lock
16
+ dist/
17
+ .playwright-mcp/
18
+ report_*.html
19
+ *.mp4
20
+ *.pdf
21
+
22
+ # Generated skill refs (built from docs/ and models.py)
23
+ testerkit/skills/refs/
24
+
25
+ # JSON schemas — regenerated via `testerkit schema export` / `testerkit init`
26
+ # / `testerkit schema refresh`. The source of truth is the live Pydantic
27
+ # models in src/testerkit/models/. Don't commit snapshots.
28
+ /schemas/
29
+ .benchmarks/
30
+
31
+ # Transient logs (daemon, serve, stream, uicheck)
32
+ *.log
33
+
34
+ # Local databases and env files
35
+ *.duckdb
36
+ *.duckdb.wal
37
+ .env
38
+ .env.local
39
+ .env.*.local
@@ -0,0 +1,559 @@
1
+ # Changelog
2
+
3
+ All notable changes to TesterKit are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
6
+ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ Pre-1.0 note: the public API is unstable. Breaking changes are possible in any
9
+ 0.x release and will be called out in this changelog.
10
+
11
+ ## [Unreleased]
12
+
13
+ ## [0.4.0] - 2026-07-18
14
+
15
+ The rebrand release: **Litmus is now TesterKit.** Releases through 0.3.1 were
16
+ published on PyPI as `litmus-test`; from 0.4.0 the package is `testerkit`.
17
+ Version numbering continues unbroken — the rename is cosmetic, the software's
18
+ maturity is not.
19
+
20
+ ### Changed
21
+
22
+ - **BREAKING** Renamed the entire project `litmus` → `testerkit`. The PyPI
23
+ distribution is `testerkit` (was `litmus-test`); the import package is
24
+ `testerkit` (was `litmus`); the CLI is `testerkit` (was `litmus`); environment
25
+ variables are `TESTERKIT_*` (were `LITMUS_*`); the project config file is
26
+ `testerkit.yaml` (was `litmus.yaml`); the bundled agent skills are `testerkit-*`;
27
+ the MCP server is `testerkit`. There are **no aliases** — update imports,
28
+ scripts, environment variables, and config filenames. The on-disk data-dir key
29
+ changed to `testerkit`; existing local data under the old key is not migrated
30
+ (pre-1.0).
31
+
32
+ ### Added
33
+
34
+ - Class-hoisted instrument fixtures hold their reservation across the whole test
35
+ class (sequence): a class that `usefixtures` an instrument role reserves it for
36
+ the lifetime of the class container step — not just per method — via reentrant
37
+ refcounting, so the lock never drops between two methods of the same class.
38
+ - The operator UI carries the TesterKit brand: wordmark in the sidebar, mark in
39
+ the header, and a real favicon — replacing the placeholder lightning-bolt emoji.
40
+ Documentation screenshots were regenerated against the new look.
41
+
42
+ ### Fixed
43
+
44
+ - Flight daemon thread pools are capped (~96 → ~56 threads per daemon).
45
+ - Event export and the HTTP/MCP daemon-warm path route through the EventStore seam.
46
+ - Metrics UI: an empty phase filter means ALL phases, not none.
47
+ - `testerkit init` merges an existing `.vscode/settings.json` instead of skipping it.
48
+ - The AI read surface is split into the `testerkit-data` skill, with a hard rule
49
+ against reading raw parquet.
50
+
51
+ ## [0.3.1] - 2026-07-06
52
+
53
+ Out-of-the-box: a fresh `testerkit init --starter` runs, surfaces live and finished runs
54
+ across every reader, and enables the VS Code Test Explorer with no setup.
55
+
56
+ ### Added
57
+
58
+ - Live in-flight runs: the runs materializer launches with the pytest session, so a run materializes without a reader. `testerkit runs`, the HTTP API, and MCP tools show in-flight runs as `RUNNING`.
59
+ - `testerkit init` enables the VS Code pytest Test Explorer in the generated `.vscode/settings.json`.
60
+ - `testerkit init` gains `--no-input` / `--no-ai` for headless scaffolding.
61
+
62
+ ### Changed
63
+
64
+ - Starter is one vectorized test now: a single inline `testerkit_sweeps` + `testerkit_limits(characteristic=…)` test (`test_output_voltage[3.3]/[5.0]/[5.5]`), no sidecar, spec-driven limit, swept `vin` recorded as an input.
65
+ - Starter `testerkit.yaml` drops internal tuning knobs it never sets.
66
+
67
+ ### Fixed
68
+
69
+ - `testerkit init` no longer hangs in Codespaces/CI (skips the AI-setup prompt under `--no-input`/`--no-ai`/`CI`/`CODESPACES`).
70
+ - `testerkit init --starter` instrument assets use `id == role` so calibration joins the station.
71
+ - `testerkit validate` detects file types by structural shape — bare `testerkit validate` on a fresh starter used to fail 3 of 6 files.
72
+ - Per-test route cleanup no longer requests a fixture during teardown (`PytestRemovedIn10Warning`).
73
+ - `testerkit-tests` skill: `observe` is for output evidence, `stream` its live sibling, never an input.
74
+ - Stale `psu.yaml`/`dmm.yaml` asset names in `docs/tutorial/quickstart.md`.
75
+
76
+ ## [0.3.0] - 2026-07-06
77
+
78
+ Execution-grain and schema-versioning release. Steps and vectors get a clean
79
+ at-rest grain — a step carries its own measurements; vectors exist only as
80
+ condition points (sweeps / inner loops). The at-rest schema starts a distinct
81
+ pre-1.0 line (baseline `0.1`) with read-time version dispatch, `slot` becomes
82
+ `site` throughout, and instruments gain per-step reservations. (The analytics
83
+ suite moves to 0.4.0.)
84
+
85
+ Pre-1.0: this release rewrites the at-rest schema, and the schema stays on a
86
+ 0.x line — each minor is a breaking epoch that battle-tests the version
87
+ apparatus, so 1.0 is earned later, not frozen now. Regenerate `data/` from
88
+ fresh `0.1` artifacts; older parquet is read via version dispatch or quarantined.
89
+
90
+ ### Changed
91
+
92
+ - **BREAKING** `slot` → `site` everywhere: 0-based `site_index` (always present, default 0) and frozen `site_name`; CLI flags and STDF `SITE_NUM` follow.
93
+ - **BREAKING** step executions de-fused — one row per execution, retries counted as occurrences instead of overwriting the prior attempt.
94
+ - **BREAKING** `uut_serial` → `uut_serial_number` at rest and in the API.
95
+ - **BREAKING** measurement storage reshaped to the step/vector grain — a step carries its own measurements, and per-row values move out of wide per-field columns into three nested `LIST<STRUCT>` columns: `inputs`, `outputs`, `measurements` (one struct per value). Downstream readers of the old flat columns must read the nested columns or query through `MeasurementsQuery`.
96
+ - **BREAKING** dynamic input/output fields drop their `in_`/`out_` name prefixes at rest; discovery is role-based (EAV), so a user's unprefixed field names no longer disrupt the query surface. Reference a field by `(role, name)` (`FieldRef`) instead of a prefixed column name.
97
+ - **BREAKING** at-rest schema reset to a `0.1` baseline — a distinct pre-1.0 line, not frozen; `parent_path` dropped (derived from `step_path`).
98
+ - Timestamps are UTC at every server boundary; clients translate at their own edge (UI / CLI / MCP).
99
+
100
+ ### Added
101
+
102
+ - At-rest schema versioning: a `0.1` baseline registry, whitelist-dispatch readers at all four store boundaries, and an opt-in forward-migrate sink. Newer-stamped files are deferred (a newer daemon re-reads them); unreadable ones are quarantined — never a hard crash.
103
+ - Instrument reservations: re-entrant, timeout-aware resource locks, per-step reserve/release auto-wrap, step-duration server leases, and `instrument.reserved` / `instrument.released` events. Per-step/vector instrument sets are recorded at rest.
104
+ - AI-skills reimagined: 11 focused Agent Skills (`testerkit-<domain>/SKILL.md`) installed per-tool by `testerkit setup` (Claude Code/Codex/Cursor/Copilot, native); a new `testerkit docs show` CLI streaming the shipped docs; removal of the old `testerkit refs` CLI / workflows / command stubs.
105
+
106
+ ### Fixed
107
+
108
+ - Parts page shows run counts and "Observed" rows — observation now keys on the hardware `uut_part_number`, not the config-slug `part_id`.
109
+ - Run-detail measurement counts (Overview + Steps tabs) under the reshaped grain.
110
+ - Channel-detail live refresh under the default `testerkit serve` (the channels Flight→UI bridge was previously wired only on `--reload`).
111
+ - The runs daemon self-heals a corrupt `_index.duckdb` at boot (rebuild from parquet) instead of crash-looping to a blank UI.
112
+ - `/explore` defaults its X axis to a per-measurement occurrence `index` and centers a single-valued axis, so non-swept measurements plot instead of showing an empty chart.
113
+ - `/explore` no longer emits Quasar "Anchor: target not found" console errors.
114
+
115
+ ## [0.2.1] - 2026-06-26
116
+
117
+ Improved documentation: a corpus-wide accuracy pass across the reference,
118
+ how-to, and operator-UI docs, plus the bug fixes it surfaced.
119
+
120
+ ### Fixed
121
+
122
+ - Catalog variant `bands:` now append to the base signal instead of replacing it.
123
+ - `data_dir` no longer falls back to a hardcoded `./results`; it resolves through `testerkit.yaml`.
124
+ - Events filter and Channels list subscribe to `channel.started` (the retired `instrument.read` returned nothing).
125
+ - Grafana measurement views and dashboards work against the schema-2.0 layout.
126
+ - MCP and skill prompts no longer use a retired event type or invalid sidecar YAML.
127
+ - `testerkit setup copilot` writes installer-agnostic `testerkit mcp serve` to `.vscode/mcp.json`.
128
+
129
+ ### Changed
130
+
131
+ - Measurements (`/explore`) Part/Station/Phase filters use the operator-facing URL keys `part`/`station`/`phase`, matching Metrics. Old `?part_id=` URLs no longer apply.
132
+
133
+ ## [0.2.0] - 2026-06-22
134
+
135
+ Data-architecture release. A fourth store (FileStore) joins Runs,
136
+ Events, Channels for blobs / waveforms / streaming captures. Three
137
+ test-author verbs — `observe`, `verify`, `stream` — replace ad-hoc
138
+ measurement recording with a typed, routeable surface. The operator UI
139
+ gains entity-observed-view across inventory pages, two new pages
140
+ (UUTs, Profiles), and an AST-driven Tests rewrite.
141
+
142
+ A follow-on pass deepens the execution data model (vector-grained,
143
+ chronological parquet + EAV), the programmatic read surface (query
144
+ measurements by role + name; consistent, typed query/store interfaces
145
+ with fool-proof lifecycles), and the quality metrics (Ppk, RTY,
146
+ DPMO/DPPM).
147
+
148
+ ### Added
149
+
150
+ - **FileStore** at `testerkit.data.files` — session-keyed artifact store
151
+ with `files.write(name, value)` returning a `file://` URI. Typed
152
+ serializer registry (bytes, Pydantic, ndarray, Waveform, PIL.Image,
153
+ DataFrame, Arrow IPC) with `register_serializer(...)` for custom
154
+ types and a pickle fallback that warns.
155
+ - **Streaming sink** — `files.stream(name, format=...)` for multi-chunk
156
+ captures. Four built-in formats: `raw`, `jsonl`, `tdms`, `h5`.
157
+ - **Three test-author verbs.** `observe` records without judgment and
158
+ routes by value shape (scalars/arrays → ChannelStore, blobs →
159
+ FileStore). `verify` records a scalar measurement and judges against
160
+ a limit (non-scalar raises pointing at `observe`). `stream` explicitly
161
+ routes a sample to ChannelStore. All three available as Context
162
+ methods + bare pytest fixtures.
163
+ - **Channel start/end events** — `ChannelStarted` / `ChannelEnded`
164
+ bracket every channel session.
165
+ - **File start/end events** — `FileStarted` / `FileEnded` bracket
166
+ every streaming sink session. Live consumers range-read the file
167
+ directly via the path in `FileStarted`.
168
+ - **Typed event payload columns** — 22 IDs and names (channel_id,
169
+ uut_serial, role, outcome, etc.) promoted from JSON payload to
170
+ typed DuckDB columns, enabling WHERE pushdown. Measured: 2.74×
171
+ speedup on `outcome=failed` filter over 10k events.
172
+ - **Live waveform plot** on `/channels/{id}` updates push-style as
173
+ samples arrive.
174
+ - **`XYData` model** for paired-array data (IV curves, eye diagrams,
175
+ S-parameter sweeps).
176
+ - **Entity-observed-view across operator UI** — stations, parts,
177
+ fixtures, instruments list pages merge YAML-configured + observed-
178
+ in-runs entities with a Configured/Observed chip and filter.
179
+ - **New `/uuts` page** — one row per distinct UUT serial in run history.
180
+ - **New `/profiles` list + detail pages** — profile registry with
181
+ extends-chain rendering and resolved YAML view.
182
+ - **Rewritten `/tests` page** — AST-driven file-level layout with
183
+ per-test panels, run history, and an "Observed in history" section
184
+ for orphaned step paths. Detail page at `/tests/{path}` with Code +
185
+ Sidecar YAML tabs.
186
+ - **`/files` operator page** at the DATA STORES nav — list every
187
+ FileStore artifact with mime / size / session filters. Per-artifact
188
+ detail page with mime-switched viewers (image, JSON pretty-print,
189
+ JSONL table, CSV table, NPZ Waveform chart, NPY stats, hex
190
+ download). `?download=1` forces Content-Disposition save.
191
+ - **`testerkit_files` MCP tool + `GET /api/files/catalog`** — list
192
+ FileStore artifacts (uri / session / run filters, newest-first) from
193
+ agents and HTTP, mirroring the existing `/files` byte-server.
194
+ - **Mock noise spec** — a station `mock_config` value shaped
195
+ `{nominal, sigma}` returns a fresh `random.gauss(nominal, sigma)` draw
196
+ each call, so mock measurements vary run-to-run (real distributions /
197
+ Cpk / yield) instead of one repeated value.
198
+ - **Spec-limit overlay on `/explore`** — when the Measurement filter is
199
+ narrowed to one measurement and Y is `measurement_value`, scatter /
200
+ line charts overlay that measurement's low/high limits from its most
201
+ recent run as black dashed lines that track the X axis (a step band
202
+ when the limit is condition-indexed, flat when constant).
203
+ - **`/channels` list filters** — Channel ID contains / Type /
204
+ Instrument / Since-Until, URL-mirrored. Live-poll + in-place row
205
+ mutation pattern preserved.
206
+ - **`/channels/{id}` chart groups by session** — scalar channels with
207
+ samples from multiple runs render one series per session, distinct
208
+ color per session, legend (scrolling, under the plot) labelled
209
+ `<uut_serial> · <YYYY-MM-DD HH:MM:SS>`. A **Time | Index** x-axis
210
+ toggle (URL-shared via `?x_mode=`) overlays sessions by sample index
211
+ for shape comparison. An activity-driven badge reads `● live` while
212
+ samples arrive, `○ idle` otherwise. Single-session and waveform
213
+ overlays unchanged.
214
+ - **`/results/{run_id}` "View this run's" card** — Events, Channels,
215
+ and Files deep-link buttons all carry the run's session into the
216
+ target page (URL-only scoping via `session_filter_banner`).
217
+ - **`/launch?test_profile=<name>`** — query param now wires through
218
+ to `LaunchRequest.test_profile` and `--test-profile=` on the pytest
219
+ cmdline. New "Profile" dropdown on the launch form.
220
+ - **User-facing API surface re-organization.** 22 names promoted
221
+ across `testerkit` top-level + new `testerkit.queries` submodule + new
222
+ `testerkit.ui` helpers:
223
+ - `from testerkit import connect, observe, verify, stream, Mock, Waveform, XYData, Outcome, TesterKitClient`
224
+ - `from testerkit.queries import RunsQuery, StepsQuery, MeasurementsQuery, EventStore`
225
+ - `from testerkit.ui import page_layout, data_table, subscribe, channel_data, bind_channel_store, ...`
226
+
227
+ Deep paths still work; docs / examples / tutorials swept (47
228
+ files) to use the shallow paths. Verbs (`observe` / `verify` /
229
+ `stream`) are now importable functions in addition to the pytest
230
+ fixture form.
231
+ - **Examples 08–11** ship four end-to-end demos of the data
232
+ architecture: waveform evidence (`observe(Waveform)` + `verify`
233
+ derived scalars), continuous monitoring (`channels.stream` + live
234
+ UI), artifacts + byte streams (`observe` PIL/bytes/Pydantic +
235
+ `files.stream`), querying data (consumer-side via
236
+ `RunsQuery` / `MeasurementsQuery` / `EventStore`). New tutorial
237
+ steps 11–12 + four how-to pages teach the pattern.
238
+ - **Query measurements by role + name.** `MeasurementsQuery` selects via
239
+ `FieldRef` / `FieldRole` (e.g. `parametric(y="v_rail")`),
240
+ scoping to a measurement by role + name instead of the fused wide columns.
241
+ - **RTY + DPMO/DPPM on the yield tab.** Rolled throughput yield
242
+ (`∏` per-step first-pass rate), defects-per-million-opportunities
243
+ (opportunity = a measurement, matching the failure-pareto), and
244
+ defective-parts-per-million, surfaced as headline cards + on the CLI /
245
+ MCP / HTTP yield summary. A pooled `MeasurementsQuery.yield_overall`
246
+ computes the headline numbers over the whole filtered set (distinct
247
+ serials once; RTY as the pooled per-step product).
248
+ - **`format_number()`** shared UI formatter — `g`-format numeric display
249
+ that strips IEEE float-repr noise (e.g. limits `0.04 – 0.06`, not
250
+ `…0600000000000005`).
251
+ - **`scripts/seed-demo-data.py`** — official maintained script that
252
+ generates a representative analytics dataset (multiple parts / serials /
253
+ stations, realistic failures + measurement spread, backdated over a
254
+ multi-day window) so the metrics screenshots and dashboards show real data.
255
+ - **Optional-close store contract + lean `Store` Protocol.** `RunStore` /
256
+ `EventStore` / `ChannelStore` / `FileStore` are construct-and-reuse;
257
+ `with` / `close()` are optional, and `EventStore` + `ChannelStore` carry
258
+ `weakref.finalize` nets so a forgotten `close()` can't leak the
259
+ in-process resources.
260
+ - **Vector-grained execution model.** `VectorStarted` / `VectorEnded`
261
+ events + retry-aware step events; measurements nested under the vector
262
+ in a chronological-telling parquet with an EAV projection. Observation
263
+ pinning records `uut_pin` on output lanes.
264
+
265
+ ### Changed
266
+
267
+ - **`testerkit benchmark` reports concurrency per store, measured honestly.**
268
+ The write-throughput sweep (1 → 2 → 4 writers) now runs for **events,
269
+ channels, files, and runs** — each with its own scaling curve and
270
+ per-writer efficiency — instead of a single runs-only sweep collapsed into
271
+ one headline factor (dropped). Two measurement fixes: the round wall is now
272
+ the true overlapped span (`max(end) − min(start)` across workers, not the
273
+ slowest worker's self-timed loop, which overstated throughput); and the
274
+ runs workers no longer perform a synchronous `notify_new_run` the real
275
+ `save_test_run` path never does (that phantom ACK was artificially
276
+ serializing the runs sweep). New `report.json` key `concurrency_by_store`
277
+ (replaces `concurrency_sweep`).
278
+ - **Metrics are per-phase now.** The quality dashboards (Yield / Pareto /
279
+ Cpk / Retest) default to **`phase = production`** and the **last 30 days**
280
+ instead of "all phases except development, all time" — production is the
281
+ only phase where FPY / Cpk / pareto are meaningful (development is mock /
282
+ dirty-git data; characterization deliberately drives out-of-spec). The
283
+ Phase filter switches it. The empty state names the cause ("No production
284
+ runs in the window — change the Phase filter or widen the date range")
285
+ rather than the misleading "No measurements yet."
286
+ - **BREAKING — `product` → `part` and `dut` → `uut` rename.** The
287
+ type/definition entity is now **Part** and the physical instance is
288
+ now **UUT** (unit under test), aligning with ASAM AoPart / STDF /
289
+ ATML terminology and generalizing beyond electronics. Renamed
290
+ across the YAML schema (`products/` → `parts/`), pytest fixtures,
291
+ event/parquet fields (`uut_serial`, `uut_part_number`), parquet
292
+ columns, operator-UI routes (`/parts`, `/uuts`), and the HTTP / MCP
293
+ query surfaces. Pre-1.0, there is no compatibility shim: existing
294
+ `product_*` / `dut_*` YAML and parquet must be regenerated or
295
+ migrated.
296
+ - **Operator-readable session labels everywhere.** Pages that displayed
297
+ session UUID prefixes now resolve to `<uut_serial> · <YYYY-MM-DD
298
+ HH:MM:SS>` via a shared lookup helper (`/channels` data tab,
299
+ `/files` detail Session field, the session filter banner on
300
+ `/events` / `/channels` / `/files`). Banner distinguishes the
301
+ filter-active state (blue) from the session-not-found state (amber)
302
+ so stale bookmarks have explicit copy.
303
+ - **Session URL param standardized to `?session_id=`** across
304
+ `/channels`, `/channels/{id}`, `/files`, `/events`, `/results/{run_id}`
305
+ deep-links. Bookmarks using the prior `?session=` form on `/channels`
306
+ no longer carry; deep-link from a fresh `/results/{run_id}` to
307
+ rebuild.
308
+ - **`namespace=` parameter parity.** `files.write` and `files.stream`
309
+ now accept `namespace=` matching the existing `channels.write` /
310
+ `channels.stream` / `observe` / `verify` / `stream` surfaces. An
311
+ artifact recorded via `observe(name, value, namespace="psu")` and
312
+ one recorded via `files.write(name, value, namespace="psu")` land at
313
+ the same effective name.
314
+ - **`FileStore` serves artifact bytes by URI** via `read(uri)` /
315
+ `read_range(uri, ...)` / `open_input(uri)`. The UI service,
316
+ materializer, `/files-static` route, and HTTP API read through these.
317
+ - Channel detail Sequences tab renamed to Capabilities (the tab's
318
+ content was always station capabilities; sequences are deferred).
319
+ - ChannelStore schema: `timestamp` → `received_at` (store-side, always
320
+ present) + new nullable `sampled_at` (hardware-side); `samples` →
321
+ `value` (unify scalar/array payload column); `properties`/`attrs` →
322
+ `attributes`; typed leaf-types (`bool`, `int`, `float`, `str` for
323
+ scalar and array shapes).
324
+ - Materializer auto-promotion: observation-only vectors now produce
325
+ `DONE` rows in the parquet measurement table instead of disappearing
326
+ from the analytical view.
327
+ - Two new operator-UI reference pages (`uuts.md`, `profiles.md`) bring
328
+ the total to 18. Four reference pages updated for the chip + filter.
329
+ Tests reference page rewritten for the AST layout.
330
+ - **BREAKING — `Cpk` / `Cp` → `Ppk` / `Pp`.** The capability metric computes
331
+ `STDDEV_SAMP` (overall, long-term σ) — which is Ppk/Pp's basis, not
332
+ within-subgroup Cpk/Cp — so it was renamed for honesty across
333
+ `MeasurementsQuery`, the CLI command, the MCP action, the `/metrics/ppk`
334
+ route, the operator-UI tab, and the docs. True Cpk (within-subgroup /
335
+ I-MR σ) is deferred to v0.3.0.
336
+ - **BREAKING — measurements queried by role + name.** The fused
337
+ `out_<name>` / `in_<name>` wide columns are dropped;
338
+ `RunStore.get_measurements` and the run-detail read surface return
339
+ role-split inputs / outputs.
340
+ - **BREAKING — channel schema: `data_type` → `value_type`** (cross-store
341
+ datatype-name consistency) and channel `offset` → `sample_offset`. A
342
+ channel's `unit` is unified with the channel descriptor and fails loud
343
+ on conflict (matching `stream`).
344
+ - **Scalar `units` → `unit`** across the recording verbs and models
345
+ (collections stay plural); `unit=` is accepted on every recording verb.
346
+ - **Consistent query/store interfaces.** Uniform query method names + a
347
+ shared `dynamic_attrs` decoder; typed `Row` returns + `ColumnSchema`
348
+ describe-columns; `FileStore`'s `data_dir` is now the private
349
+ keyword-only `_data_dir` (an infrastructure path, not user-facing).
350
+ - `execution/logger.py` → `run_scope.py` (and the `logger` fixture →
351
+ `_run_scope`); `StreamCheckpoint` split into `ChannelCheckpoint` +
352
+ `FileCheckpoint`; store-lifecycle events renamed for grammatical
353
+ consistency.
354
+ - The ~3k-line `cli.py` monolith split into a `cli/` package; the System
355
+ Designer page marked experimental. `run_id` is now in the per-run
356
+ parquet filename (prevents silent overwrite).
357
+
358
+ ### Removed
359
+
360
+ - `InstrumentRead` event class — per-sample events at DAQ rates flooded
361
+ the EventStore. Sample data lives in ChannelStore; start/end events
362
+ (`ChannelStarted` / `ChannelEnded`) replace it.
363
+ - `StreamFrameIndex` event class — same flood problem at chunk rate.
364
+ Live consumers read the file directly.
365
+ - Dormant measurement-ref struct slot on the run schema (unused).
366
+
367
+ ### Fixed
368
+
369
+ - **Live-channel UI panels deliver on the event loop.** Channel-data
370
+ callbacks fired on the Flight reader thread, mutating NiceGUI elements
371
+ off the loop; they now marshal through the UI loop (same contract the
372
+ event path already used).
373
+ - `/channels/{id}` 500 error on pure-scalar channels.
374
+ - **`/explore` default axes pick a real parameter.** A measurement-
375
+ scoped URL with no axis params fell through to the first schema
376
+ column — often an id like `characteristic_id` for X and a stimulus
377
+ input for Y. X now prefers a swept `in_*` input (then `vector_index`
378
+ / time, never an `*_id`); Y prefers `measurement_value`.
379
+ - `Context.stream` and `channels.write` did not emit `ChannelStarted`
380
+ (only the observer path did). All writer paths now emit it.
381
+ - `/live/{run_id}` Streams panel showed streams from all runs;
382
+ subscription now scopes by `run_id`.
383
+ - **`observe()` URIs reach parquet `out_*` columns.** Before this
384
+ fix, `context.observe("uut_photo", img)` wrote the file to
385
+ FileStore but the URI lived only on `Context._observations` —
386
+ `logger.log_measurement` projected `out_*` from
387
+ `vector.observations` (empty), so the operator UI's Measurements
388
+ tab showed no artifacts. Now `observe` mirrors to the active
389
+ vector at write time.
390
+ - **Warm-query perf gates stabilized.** Two single-shot perf timers
391
+ flaked under suite load (~30% of full runs). Hard caps (100ms / 200ms)
392
+ unchanged; sampling now takes the
393
+ min over 11 calls so transient spikes don't trip the gate.
394
+ - **`StepBuilder` propagates `PASSED` step outcomes** on the default-vector
395
+ (`step.measure()`) path. Previously only `FAILED` propagated, so a passing
396
+ step written via the catch-all `TesterKitClient` results API ended
397
+ `outcome=None` — excluded from step counts and leaving the run outcome
398
+ `None`. Now consistent with the explicit `step.vector()` path.
399
+ - **Yield headline cards are pooled.** They previously combined the
400
+ per-(part × station × period) rows, which broke RTY (multiplied as a
401
+ product across groups) and Final Yield (double-counted serials across
402
+ groups, so Final < FPY). `yield_overall` computes them over the whole
403
+ filtered set instead.
404
+ - **Daemon write-path resilience.** A daemon killed mid-write reacquires a
405
+ fresh one and resends the un-acked batches (idempotent via
406
+ `ON CONFLICT (id) DO NOTHING`); subscribers resume from their cursor; a
407
+ spawn that times out fails fast and surfaces the crash reason.
408
+
409
+ ### Deferred to v0.3.0
410
+
411
+ - **Local shared-memory transport** (item 22) — PoC measured 2×
412
+ latency over Flight loopback, not the 3–10× estimated. Revisit on
413
+ symptoms (UI lag traced to transport; >10 kHz capture saturation).
414
+ - **Consumer SDK `testerkit.live`** (item 20) — store APIs are
415
+ available; higher-level consumer surface not yet designed.
416
+ - **Hardware video encoder formats** (item 23) — `mp4` / `wav` /
417
+ `flac` handlers on top of the streaming-sink machinery.
418
+ - **Channels + files as test INPUTS** — current verbs are producer-only;
419
+ a first-class input surface (`channels.read` / `files.read`) lands
420
+ in v0.3.0.
421
+ - **Analytics metrics release** — true Cpk (within-subgroup / I-MR σ,
422
+ distinct from the overall-σ Ppk shipped here), per-measurement SPC
423
+ control charts (I-MR / X̄-R + Western Electric rules), yield cross-tab by
424
+ station / fixture / operator, and a generic `pareto(by=measure)`. Roadmap:
425
+ `docs/_internal/explorations/0.3.0-analytics-metrics.md`.
426
+
427
+ ## [0.1.3] - 2026-05-24
428
+
429
+ Documentation-heavy release. Full per-screen reference for the operator
430
+ UI plus a Diátaxis × topic reorg that lands every doc page in a
431
+ predictable `<quadrant>/<category>/<topic>.md` cell, with cross-quadrant
432
+ "See also" navigation between them.
433
+
434
+ ### Added
435
+
436
+ - **16 per-screen reference pages** under `docs/reference/operator-ui/`
437
+ — every NiceGUI page (Dashboard, Launch Test, Live monitor, Results
438
+ list/detail, Metrics, Measurements, Events, Channels list/detail,
439
+ System Designer, Stations, Parts, Fixtures, Instruments, Tests)
440
+ documented from the running source. Each carries a cropped
441
+ testid-anchored screenshot.
442
+ - **Cropped UI screenshots** via new `scripts/regenerate-ui-screenshots.py`
443
+ (Playwright + headless `testerkit serve`) — manifest-driven, PNGs commit
444
+ into `docs/_assets/operator-ui/`.
445
+ - **Tour bridge** at `docs/how-to/overview/operator-ui-tour.md` —
446
+ orientation map of all 14 sidebar entries.
447
+ - **Diagnostic how-tos**: `find-flaky-tests`, `compare-runs`,
448
+ `export-results`, `operator-prompts`, plus two MCP-driven recipes
449
+ (`mcp-query-runs`, `mcp-debug-failures`).
450
+ - **Grafana integration** reference at `docs/integration/data/grafana.md`
451
+ (pgwire data source + ten shipped dashboards).
452
+ - **Live API explorer** subsection in `reference/runtime/api.md`
453
+ covering Swagger UI / ReDoc / OpenAPI JSON.
454
+ - **Tutorial step 10** expanded with Results + Metrics walkthroughs.
455
+ - Pre-commit hook `screenshot-drift-reminder` — non-blocking nudge to
456
+ rerun the screenshot script when a UI file with a manifest-tracked
457
+ testid changes.
458
+
459
+ ### Changed
460
+
461
+ - **Docs reorg — Diátaxis × topic matrix.** 64 file moves into
462
+ per-category subdirectories (`overview/` / `configuration/` /
463
+ `execution/` / `data/` / etc.) so the matrix axis is consistent across
464
+ quadrants. Same path tail across quadrants gives natural cross-links:
465
+ `concepts/configuration/fixtures.md` ↔
466
+ `how-to/configuration/configuring-stations.md` ↔
467
+ `reference/configuration.md`. Filename prefixes (`testerkit-`,
468
+ `catalog-`, `why-`) dropped — directory carries the namespace. Three
469
+ former "why-" concept pages rewritten to read as concept references,
470
+ not blog posts.
471
+ - **In-app docs viewer** now supports nested subdirectory pages: route
472
+ changed to `{page:path}`, `_parse_section_outline` switched to
473
+ `rglob`, sidebar groups render as accordion (current page's group
474
+ auto-expands).
475
+ - **Operator-UI table cleanup**: dropped run UUIDs from operator-facing
476
+ tables (operators identify runs by UUT serial + start time, not
477
+ UUID). Events page Session filter changed from free-text input to
478
+ autocomplete dropdown labelled `<timestamp> • <client>` (pytest /
479
+ jupyter / etc.). Live monitor's Run ID kept but de-emphasized (still
480
+ copyable for URL bookmarking).
481
+ - `docs/_assets/` now bundled into the wheel (was missing — operator-UI
482
+ screenshots wouldn't render on `pip install`ed copies).
483
+ - Generator path table (`scripts/generate_reference_docs.py`) updated
484
+ for the 5 moved generated reference pages; pre-commit drift-hook
485
+ regex follows.
486
+
487
+ ### Fixed
488
+
489
+ - **Test race**: a run-status test helper polled for `RunStarted` then
490
+ read partially-materialised steps; it now waits for the run to
491
+ finalise (`ended_at IS NOT NULL`) before reading.
492
+ - **System Designer auto-save**: edits to a fixture silently failed to
493
+ save — the save raised an error that was swallowed, so changes weren't
494
+ persisted. Auto-save now writes the fixture correctly.
495
+ - Docs viewer's `/docs/_assets/` path was being gobbled by the
496
+ `{page:path}` catch-all and returning HTML instead of PNGs. Mounted
497
+ as static files before the dynamic route.
498
+
499
+ ## [0.1.2] - 2026-05-19
500
+
501
+ First installable PyPI release. Both 0.1.0 and 0.1.1 wheels shipped without
502
+ `testerkit/data/` due to an over-broad `data` exclude pattern in
503
+ `pyproject.toml`, so the bundled pytest plugin failed to import on every
504
+ fresh install; those releases are yanked.
505
+
506
+ ### Added
507
+
508
+ - `verify(...)` and `logger.measure(...)` accept a plain dict for `limit=`
509
+ (coerced via `Limit.model_validate`). Tutorials and examples now use the
510
+ dict form; `from testerkit import Limit` stays available for the model object.
511
+ - `verify_requires_limit: bool | None` on `ProfileConfig` — set to `False`
512
+ on a characterization profile to route `verify()` to record-only
513
+ semantics when no limit resolves (instead of `MissingLimitError`).
514
+ - `testerkit refs list` / `testerkit refs show <topic>` — stream curated reference
515
+ docs (`tiers`, `verify`, `mocks`, `profiles`) to stdout. CLAUDE.md
516
+ templates now point agents at this CLI instead of baking absolute paths.
517
+
518
+ ### Fixed
519
+
520
+ - Packaging: scoped the `data` exclude pattern in `pyproject.toml` to
521
+ `/data` (top-level only) so `src/testerkit/data/` ships in the wheel.
522
+ - Run outcome stamping is now retry-aware. A test that errors on attempt 1
523
+ and passes on the `testerkit_retry` retry stamps the RUN as `passed`
524
+ (matching pytest-rerunfailures, STDF MIR.RTST_COD, and Jenkins flaky-
525
+ test-handler conventions). The errored attempt's step row stays in
526
+ the run for retest / flake analysis.
527
+
528
+ ## [0.1.0] - 2026-04-15
529
+
530
+ Initial public release on PyPI as `testerkit`.
531
+
532
+ ### Added
533
+
534
+ - Pytest-native hardware tests — plain `def test_*` functions with
535
+ fixtures and markers for vector expansion, limit checking, measurement
536
+ recording, retries, and mock injection
537
+ - Station / fixture / part / sequence YAML configuration, loaded through a
538
+ single store layer with Pydantic validation
539
+ - Instrument fixtures resolved from station config (no `conftest.py`
540
+ boilerplate required)
541
+ - `--mock-instruments` mode for hardware-free development
542
+ - Parquet result storage with per-step instrument traceability
543
+ (serial, cal due date, firmware)
544
+ - DuckDB-backed analytics layer over the Parquet silver/gold layout
545
+ - Operator UI (`testerkit serve`) built on NiceGUI
546
+ - FastAPI HTTP API and MCP server, with parity between the two
547
+ - Capability matching (`testerkit_match`) against an instrument catalog
548
+ - CLI: `testerkit init`, `discover`, `station init`, `new-test`, `serve`, `runs`,
549
+ `show`, `instrument list`, `mcp serve`, `setup`
550
+ - Optional extras for output formats (`stdf`, `hdf5`, `tdms`, `mdf4`),
551
+ transports (`s3`, `gcs`, `azure`, `sftp`), and integrations (`pymeasure`,
552
+ `ni`, `lxi`, `grafana`, `pdf`, `sbom`)
553
+
554
+ [Unreleased]: https://github.com/pragmatest-dev/testerkit/compare/v0.2.0...HEAD
555
+ [0.2.0]: https://github.com/pragmatest-dev/testerkit/compare/v0.1.3...v0.2.0
556
+ [0.1.3]: https://github.com/pragmatest-dev/testerkit/compare/v0.1.2...v0.1.3
557
+ [0.1.2]: https://github.com/pragmatest-dev/testerkit/releases/tag/v0.1.2
558
+ [0.1.1]: https://github.com/pragmatest-dev/testerkit/releases/tag/v0.1.1
559
+ [0.1.0]: https://github.com/pragmatest-dev/testerkit/releases/tag/v0.1.0