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.
- testerkit-0.4.0/.gitignore +39 -0
- testerkit-0.4.0/CHANGELOG.md +559 -0
- testerkit-0.4.0/CONTRIBUTING.md +619 -0
- testerkit-0.4.0/LICENSE +191 -0
- testerkit-0.4.0/PKG-INFO +250 -0
- testerkit-0.4.0/README.md +173 -0
- testerkit-0.4.0/SECURITY.md +27 -0
- testerkit-0.4.0/docs/_assets/operator-ui/channels/table.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/dashboard/runs.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/dashboard/stations.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/events/filters.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/events/table.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/explore/chart.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/explore/filters.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/explore/plot-controls.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/files/table.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/launch/form.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/metrics/filters.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/metrics/pareto.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/metrics/ppk.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/metrics/yield.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/results/detail-header.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/results/detail-measurements.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/results/detail-overview.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/results/detail-steps.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/results/stats.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/results/table.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/tour/designer.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/tour/docs.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/tour/fixtures.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/tour/instruments.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/tour/parts.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/tour/profiles.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/tour/stations.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/tour/tests.png +0 -0
- testerkit-0.4.0/docs/_assets/operator-ui/tour/uuts.png +0 -0
- testerkit-0.4.0/docs/_internal/development-axioms.md +304 -0
- testerkit-0.4.0/docs/_internal/event-log-wal-format.md +177 -0
- testerkit-0.4.0/docs/_internal/explorations/0.3.0-at-rest-reshape.md +158 -0
- testerkit-0.4.0/docs/_internal/explorations/0.3.1-ootb-experience.md +103 -0
- testerkit-0.4.0/docs/_internal/explorations/0.4.0-analytics-metrics.md +83 -0
- testerkit-0.4.0/docs/_internal/explorations/ai-test-writing-compliance.md +166 -0
- testerkit-0.4.0/docs/_internal/explorations/best-available-identity.md +107 -0
- testerkit-0.4.0/docs/_internal/explorations/blog-ideas.md +19 -0
- testerkit-0.4.0/docs/_internal/explorations/channels-real-stream-handoff.md +640 -0
- testerkit-0.4.0/docs/_internal/explorations/channels-write-scaling.md +427 -0
- testerkit-0.4.0/docs/_internal/explorations/checkpoint-split-plan.md +124 -0
- testerkit-0.4.0/docs/_internal/explorations/data-store-backends.md +141 -0
- testerkit-0.4.0/docs/_internal/explorations/data-store-unification-invariants.md +87 -0
- testerkit-0.4.0/docs/_internal/explorations/data-stores-claim-check.md +925 -0
- testerkit-0.4.0/docs/_internal/explorations/data-stores-refinements.md +429 -0
- testerkit-0.4.0/docs/_internal/explorations/data-stores.md +1591 -0
- testerkit-0.4.0/docs/_internal/explorations/derived-index-versioning.md +451 -0
- testerkit-0.4.0/docs/_internal/explorations/docs-corpus-review.md +825 -0
- testerkit-0.4.0/docs/_internal/explorations/examples-portability.md +97 -0
- testerkit-0.4.0/docs/_internal/explorations/exporter-conformance-audit.md +36 -0
- testerkit-0.4.0/docs/_internal/explorations/instrument-access-model.md +82 -0
- testerkit-0.4.0/docs/_internal/explorations/instrument-reservation-execution.md +377 -0
- testerkit-0.4.0/docs/_internal/explorations/instrument-reservation.md +616 -0
- testerkit-0.4.0/docs/_internal/explorations/live-ui-pattern.md +73 -0
- testerkit-0.4.0/docs/_internal/explorations/measurement-storage-eav.md +245 -0
- testerkit-0.4.0/docs/_internal/explorations/post-0.2.2-plan.md +67 -0
- testerkit-0.4.0/docs/_internal/explorations/pre-1.0-epoch-strategy.md +68 -0
- testerkit-0.4.0/docs/_internal/explorations/projection-normalization.md +118 -0
- testerkit-0.4.0/docs/_internal/explorations/query-by-role-name.md +573 -0
- testerkit-0.4.0/docs/_internal/explorations/read-surface-unification.md +288 -0
- testerkit-0.4.0/docs/_internal/explorations/runs-execution-model.md +699 -0
- testerkit-0.4.0/docs/_internal/explorations/schema-versioning-migration.md +611 -0
- testerkit-0.4.0/docs/_internal/explorations/session-foundation.md +778 -0
- testerkit-0.4.0/docs/_internal/explorations/site-model-consolidation.md +164 -0
- testerkit-0.4.0/docs/_internal/explorations/slot-to-site-rename.md +225 -0
- testerkit-0.4.0/docs/_internal/explorations/step-vector-grain-reshape-execution.md +335 -0
- testerkit-0.4.0/docs/_internal/explorations/step-vector-grain-reshape.md +229 -0
- testerkit-0.4.0/docs/_internal/explorations/store-event-rename-plan.md +119 -0
- testerkit-0.4.0/docs/_internal/explorations/store-perf-writemany-handoff.md +116 -0
- testerkit-0.4.0/docs/_internal/explorations/streaming-media.md +69 -0
- testerkit-0.4.0/docs/_internal/explorations/streaming-unification.md +340 -0
- testerkit-0.4.0/docs/_internal/explorations/versioning-resiliency-backlog.md +178 -0
- testerkit-0.4.0/docs/_internal/project-history-narrative.md +298 -0
- testerkit-0.4.0/docs/_internal/project-history-summary.md +51 -0
- testerkit-0.4.0/docs/_internal/runs-architecture-map.md +106 -0
- testerkit-0.4.0/docs/concepts/configuration/capabilities.md +447 -0
- testerkit-0.4.0/docs/concepts/configuration/fixtures.md +335 -0
- testerkit-0.4.0/docs/concepts/configuration/index.md +14 -0
- testerkit-0.4.0/docs/concepts/configuration/parts.md +276 -0
- testerkit-0.4.0/docs/concepts/configuration/stations.md +214 -0
- testerkit-0.4.0/docs/concepts/data/data-stores.md +199 -0
- testerkit-0.4.0/docs/concepts/data/event-log.md +185 -0
- testerkit-0.4.0/docs/concepts/data/event-sourcing.md +76 -0
- testerkit-0.4.0/docs/concepts/data/flight-streaming.md +58 -0
- testerkit-0.4.0/docs/concepts/data/index.md +17 -0
- testerkit-0.4.0/docs/concepts/data/sessions.md +78 -0
- testerkit-0.4.0/docs/concepts/data/three-verbs.md +260 -0
- testerkit-0.4.0/docs/concepts/execution/index.md +13 -0
- testerkit-0.4.0/docs/concepts/execution/outcomes.md +199 -0
- testerkit-0.4.0/docs/concepts/execution/step-hierarchy.md +170 -0
- testerkit-0.4.0/docs/concepts/execution/step-manifest.md +115 -0
- testerkit-0.4.0/docs/concepts/index.md +40 -0
- testerkit-0.4.0/docs/concepts/overview/ai-integration.md +57 -0
- testerkit-0.4.0/docs/concepts/overview/architecture.md +357 -0
- testerkit-0.4.0/docs/concepts/overview/index.md +14 -0
- testerkit-0.4.0/docs/concepts/overview/platform-vs-framework.md +147 -0
- testerkit-0.4.0/docs/concepts/overview/pytest.md +53 -0
- testerkit-0.4.0/docs/concepts/overview/tiers.md +46 -0
- testerkit-0.4.0/docs/how-to/catalog/datasheet-to-test.md +169 -0
- testerkit-0.4.0/docs/how-to/catalog/index.md +11 -0
- testerkit-0.4.0/docs/how-to/configuration/configuring-stations.md +364 -0
- testerkit-0.4.0/docs/how-to/configuration/custom-drivers.md +484 -0
- testerkit-0.4.0/docs/how-to/configuration/index.md +13 -0
- testerkit-0.4.0/docs/how-to/configuration/mock-mode.md +342 -0
- testerkit-0.4.0/docs/how-to/data/benchmarking.md +120 -0
- testerkit-0.4.0/docs/how-to/data/capture-an-artifact.md +84 -0
- testerkit-0.4.0/docs/how-to/data/capture-waveform.md +110 -0
- testerkit-0.4.0/docs/how-to/data/choosing-a-channel-verb.md +108 -0
- testerkit-0.4.0/docs/how-to/data/compare-runs.md +120 -0
- testerkit-0.4.0/docs/how-to/data/export-results.md +104 -0
- testerkit-0.4.0/docs/how-to/data/find-flaky-tests.md +108 -0
- testerkit-0.4.0/docs/how-to/data/grafana-dashboards.md +148 -0
- testerkit-0.4.0/docs/how-to/data/index.md +23 -0
- testerkit-0.4.0/docs/how-to/data/mcp-debug-failures.md +125 -0
- testerkit-0.4.0/docs/how-to/data/mcp-query-runs.md +120 -0
- testerkit-0.4.0/docs/how-to/data/querying-channels.md +117 -0
- testerkit-0.4.0/docs/how-to/data/querying-events.md +85 -0
- testerkit-0.4.0/docs/how-to/data/stream-live-channel.md +134 -0
- testerkit-0.4.0/docs/how-to/execution/custom-operator-ui.md +136 -0
- testerkit-0.4.0/docs/how-to/execution/index.md +21 -0
- testerkit-0.4.0/docs/how-to/execution/limits.md +193 -0
- testerkit-0.4.0/docs/how-to/execution/managing-sessions.md +100 -0
- testerkit-0.4.0/docs/how-to/execution/multi-uut-testing.md +211 -0
- testerkit-0.4.0/docs/how-to/execution/operator-prompts.md +151 -0
- testerkit-0.4.0/docs/how-to/execution/profiles.md +304 -0
- testerkit-0.4.0/docs/how-to/execution/spec-driven-testing.md +169 -0
- testerkit-0.4.0/docs/how-to/execution/test-context.md +212 -0
- testerkit-0.4.0/docs/how-to/execution/traceability.md +252 -0
- testerkit-0.4.0/docs/how-to/execution/vector-expansion.md +394 -0
- testerkit-0.4.0/docs/how-to/execution/writing-tests.md +363 -0
- testerkit-0.4.0/docs/how-to/index.md +59 -0
- testerkit-0.4.0/docs/how-to/overview/index.md +11 -0
- testerkit-0.4.0/docs/how-to/overview/mcp-integration.md +168 -0
- testerkit-0.4.0/docs/how-to/overview/operator-ui-tour.md +234 -0
- testerkit-0.4.0/docs/integration/data/grafana.md +162 -0
- testerkit-0.4.0/docs/integration/data/index.md +15 -0
- testerkit-0.4.0/docs/integration/data/lakehouse-import.md +226 -0
- testerkit-0.4.0/docs/integration/data/logging.md +131 -0
- testerkit-0.4.0/docs/integration/data/results-api.md +51 -0
- testerkit-0.4.0/docs/integration/index.md +20 -0
- testerkit-0.4.0/docs/integration/runtime/harness.md +281 -0
- testerkit-0.4.0/docs/integration/runtime/index.md +13 -0
- testerkit-0.4.0/docs/integration/runtime/instruments.md +284 -0
- testerkit-0.4.0/docs/integration/runtime/pytest-existing.md +315 -0
- testerkit-0.4.0/docs/overview.md +116 -0
- testerkit-0.4.0/docs/reference/catalog/cookbook.md +389 -0
- testerkit-0.4.0/docs/reference/catalog/index.md +11 -0
- testerkit-0.4.0/docs/reference/catalog/schema.md +375 -0
- testerkit-0.4.0/docs/reference/cli.md +660 -0
- testerkit-0.4.0/docs/reference/configuration.md +406 -0
- testerkit-0.4.0/docs/reference/data/channels-schema.md +145 -0
- testerkit-0.4.0/docs/reference/data/event-types.md +554 -0
- testerkit-0.4.0/docs/reference/data/events-schema.md +120 -0
- testerkit-0.4.0/docs/reference/data/files-schema.md +141 -0
- testerkit-0.4.0/docs/reference/data/index.md +18 -0
- testerkit-0.4.0/docs/reference/data/models.md +2229 -0
- testerkit-0.4.0/docs/reference/data/outputs.md +82 -0
- testerkit-0.4.0/docs/reference/data/parquet-schema.md +529 -0
- testerkit-0.4.0/docs/reference/data/performance-limits.md +224 -0
- testerkit-0.4.0/docs/reference/data/query-api.md +247 -0
- testerkit-0.4.0/docs/reference/index.md +69 -0
- testerkit-0.4.0/docs/reference/operator-ui/channels/detail.md +82 -0
- testerkit-0.4.0/docs/reference/operator-ui/channels/list.md +70 -0
- testerkit-0.4.0/docs/reference/operator-ui/dashboard.md +87 -0
- testerkit-0.4.0/docs/reference/operator-ui/designer.md +167 -0
- testerkit-0.4.0/docs/reference/operator-ui/events.md +89 -0
- testerkit-0.4.0/docs/reference/operator-ui/files.md +74 -0
- testerkit-0.4.0/docs/reference/operator-ui/fixtures.md +100 -0
- testerkit-0.4.0/docs/reference/operator-ui/instruments.md +126 -0
- testerkit-0.4.0/docs/reference/operator-ui/launch.md +79 -0
- testerkit-0.4.0/docs/reference/operator-ui/live.md +102 -0
- testerkit-0.4.0/docs/reference/operator-ui/measurements.md +159 -0
- testerkit-0.4.0/docs/reference/operator-ui/metrics.md +217 -0
- testerkit-0.4.0/docs/reference/operator-ui/parts.md +98 -0
- testerkit-0.4.0/docs/reference/operator-ui/profiles.md +103 -0
- testerkit-0.4.0/docs/reference/operator-ui/results/detail.md +214 -0
- testerkit-0.4.0/docs/reference/operator-ui/results/list.md +106 -0
- testerkit-0.4.0/docs/reference/operator-ui/stations.md +98 -0
- testerkit-0.4.0/docs/reference/operator-ui/tests.md +173 -0
- testerkit-0.4.0/docs/reference/operator-ui/uuts.md +67 -0
- testerkit-0.4.0/docs/reference/overview/index.md +11 -0
- testerkit-0.4.0/docs/reference/overview/pytest-native.md +142 -0
- testerkit-0.4.0/docs/reference/overview/skills.md +177 -0
- testerkit-0.4.0/docs/reference/pytest/fixtures.md +342 -0
- testerkit-0.4.0/docs/reference/pytest/index.md +12 -0
- testerkit-0.4.0/docs/reference/pytest/markers.md +257 -0
- testerkit-0.4.0/docs/reference/runtime/api.md +246 -0
- testerkit-0.4.0/docs/reference/runtime/client.md +280 -0
- testerkit-0.4.0/docs/reference/runtime/connect.md +140 -0
- testerkit-0.4.0/docs/reference/runtime/index.md +13 -0
- testerkit-0.4.0/docs/tutorial/01-first-test.md +113 -0
- testerkit-0.4.0/docs/tutorial/02-mock-instruments.md +88 -0
- testerkit-0.4.0/docs/tutorial/03-fixtures.md +169 -0
- testerkit-0.4.0/docs/tutorial/04-limits.md +139 -0
- testerkit-0.4.0/docs/tutorial/05-configuration.md +194 -0
- testerkit-0.4.0/docs/tutorial/06-specifications.md +273 -0
- testerkit-0.4.0/docs/tutorial/07-real-instruments.md +245 -0
- testerkit-0.4.0/docs/tutorial/08-capabilities.md +223 -0
- testerkit-0.4.0/docs/tutorial/09-production.md +374 -0
- testerkit-0.4.0/docs/tutorial/10-live-monitoring.md +156 -0
- testerkit-0.4.0/docs/tutorial/11-waveforms-and-evidence.md +169 -0
- testerkit-0.4.0/docs/tutorial/12-continuous-monitoring.md +145 -0
- testerkit-0.4.0/docs/tutorial/13-parallel-testing.md +233 -0
- testerkit-0.4.0/docs/tutorial/index.md +61 -0
- testerkit-0.4.0/docs/tutorial/quickstart.md +282 -0
- testerkit-0.4.0/evals/README.md +96 -0
- testerkit-0.4.0/examples/01-vanilla/README.md +99 -0
- testerkit-0.4.0/examples/01-vanilla/conftest.py +35 -0
- testerkit-0.4.0/examples/01-vanilla/drivers/__init__.py +29 -0
- testerkit-0.4.0/examples/01-vanilla/drivers/dmm.py +128 -0
- testerkit-0.4.0/examples/01-vanilla/drivers/psu.py +122 -0
- testerkit-0.4.0/examples/01-vanilla/pyproject.toml +16 -0
- testerkit-0.4.0/examples/01-vanilla/pytest.ini +12 -0
- testerkit-0.4.0/examples/01-vanilla/testerkit.yaml +3 -0
- testerkit-0.4.0/examples/01-vanilla/tests/test_rail.py +33 -0
- testerkit-0.4.0/examples/02-verify/README.md +100 -0
- testerkit-0.4.0/examples/02-verify/conftest.py +34 -0
- testerkit-0.4.0/examples/02-verify/drivers/__init__.py +29 -0
- testerkit-0.4.0/examples/02-verify/drivers/dmm.py +128 -0
- testerkit-0.4.0/examples/02-verify/drivers/psu.py +122 -0
- testerkit-0.4.0/examples/02-verify/pyproject.toml +16 -0
- testerkit-0.4.0/examples/02-verify/pytest.ini +7 -0
- testerkit-0.4.0/examples/02-verify/testerkit.yaml +3 -0
- testerkit-0.4.0/examples/02-verify/tests/test_rail.py +61 -0
- testerkit-0.4.0/examples/03-inline-limits/README.md +37 -0
- testerkit-0.4.0/examples/03-inline-limits/conftest.py +24 -0
- testerkit-0.4.0/examples/03-inline-limits/drivers/__init__.py +29 -0
- testerkit-0.4.0/examples/03-inline-limits/drivers/dmm.py +128 -0
- testerkit-0.4.0/examples/03-inline-limits/drivers/psu.py +122 -0
- testerkit-0.4.0/examples/03-inline-limits/pyproject.toml +16 -0
- testerkit-0.4.0/examples/03-inline-limits/pytest.ini +2 -0
- testerkit-0.4.0/examples/03-inline-limits/testerkit.yaml +3 -0
- testerkit-0.4.0/examples/03-inline-limits/tests/test_rail.py +42 -0
- testerkit-0.4.0/examples/03-inline-limits/tests/test_sequence.py +78 -0
- testerkit-0.4.0/examples/04-sidecar-markers/README.md +73 -0
- testerkit-0.4.0/examples/04-sidecar-markers/conftest.py +24 -0
- testerkit-0.4.0/examples/04-sidecar-markers/drivers/__init__.py +29 -0
- testerkit-0.4.0/examples/04-sidecar-markers/drivers/dmm.py +128 -0
- testerkit-0.4.0/examples/04-sidecar-markers/drivers/psu.py +122 -0
- testerkit-0.4.0/examples/04-sidecar-markers/pyproject.toml +16 -0
- testerkit-0.4.0/examples/04-sidecar-markers/pytest.ini +2 -0
- testerkit-0.4.0/examples/04-sidecar-markers/testerkit.yaml +3 -0
- testerkit-0.4.0/examples/04-sidecar-markers/tests/test_rail.py +53 -0
- testerkit-0.4.0/examples/04-sidecar-markers/tests/test_rail.yaml +25 -0
- testerkit-0.4.0/examples/05-part-spec/README.md +52 -0
- testerkit-0.4.0/examples/05-part-spec/conftest.py +24 -0
- testerkit-0.4.0/examples/05-part-spec/drivers/__init__.py +29 -0
- testerkit-0.4.0/examples/05-part-spec/drivers/dmm.py +128 -0
- testerkit-0.4.0/examples/05-part-spec/drivers/psu.py +122 -0
- testerkit-0.4.0/examples/05-part-spec/parts/buck_3v3.yaml +45 -0
- testerkit-0.4.0/examples/05-part-spec/pyproject.toml +16 -0
- testerkit-0.4.0/examples/05-part-spec/pytest.ini +7 -0
- testerkit-0.4.0/examples/05-part-spec/testerkit.yaml +3 -0
- testerkit-0.4.0/examples/05-part-spec/tests/test_rail.py +52 -0
- testerkit-0.4.0/examples/05-part-spec/tests/test_rail.yaml +26 -0
- testerkit-0.4.0/examples/06-station-catalog/README.md +135 -0
- testerkit-0.4.0/examples/06-station-catalog/catalog/generic_dmm.yaml +60 -0
- testerkit-0.4.0/examples/06-station-catalog/catalog/generic_psu.yaml +76 -0
- testerkit-0.4.0/examples/06-station-catalog/drivers/__init__.py +29 -0
- testerkit-0.4.0/examples/06-station-catalog/drivers/dmm.py +128 -0
- testerkit-0.4.0/examples/06-station-catalog/drivers/psu.py +122 -0
- testerkit-0.4.0/examples/06-station-catalog/fixtures/buck_3v3_bench.yaml +19 -0
- testerkit-0.4.0/examples/06-station-catalog/parts/buck_3v3.yaml +45 -0
- testerkit-0.4.0/examples/06-station-catalog/pyproject.toml +16 -0
- testerkit-0.4.0/examples/06-station-catalog/pytest.ini +8 -0
- testerkit-0.4.0/examples/06-station-catalog/stations/bench_01.yaml +23 -0
- testerkit-0.4.0/examples/06-station-catalog/testerkit.yaml +5 -0
- testerkit-0.4.0/examples/06-station-catalog/tests/test_rail.py +114 -0
- testerkit-0.4.0/examples/06-station-catalog/tests/test_rail.yaml +41 -0
- testerkit-0.4.0/examples/07-profiles/README.md +77 -0
- testerkit-0.4.0/examples/07-profiles/catalog/generic_dmm.yaml +60 -0
- testerkit-0.4.0/examples/07-profiles/catalog/generic_psu.yaml +76 -0
- testerkit-0.4.0/examples/07-profiles/drivers/__init__.py +29 -0
- testerkit-0.4.0/examples/07-profiles/drivers/dmm.py +128 -0
- testerkit-0.4.0/examples/07-profiles/drivers/psu.py +122 -0
- testerkit-0.4.0/examples/07-profiles/fixtures/buck_3v3_bench.yaml +20 -0
- testerkit-0.4.0/examples/07-profiles/parts/buck_3v3.yaml +45 -0
- testerkit-0.4.0/examples/07-profiles/profiles/characterization.yaml +14 -0
- testerkit-0.4.0/examples/07-profiles/profiles/development.yaml +12 -0
- testerkit-0.4.0/examples/07-profiles/profiles/production.yaml +13 -0
- testerkit-0.4.0/examples/07-profiles/profiles/rail_family.yaml +9 -0
- testerkit-0.4.0/examples/07-profiles/pyproject.toml +16 -0
- testerkit-0.4.0/examples/07-profiles/pytest.ini +6 -0
- testerkit-0.4.0/examples/07-profiles/scripts/seed_channels.py +58 -0
- testerkit-0.4.0/examples/07-profiles/stations/bench_01.yaml +27 -0
- testerkit-0.4.0/examples/07-profiles/stations/types/bench.yaml +13 -0
- testerkit-0.4.0/examples/07-profiles/testerkit.yaml +11 -0
- testerkit-0.4.0/examples/07-profiles/tests/test_rail.py +36 -0
- testerkit-0.4.0/examples/07-profiles/tests/test_rail.yaml +16 -0
- testerkit-0.4.0/examples/08-waveform-evidence/README.md +58 -0
- testerkit-0.4.0/examples/08-waveform-evidence/conftest.py +28 -0
- testerkit-0.4.0/examples/08-waveform-evidence/drivers/__init__.py +6 -0
- testerkit-0.4.0/examples/08-waveform-evidence/drivers/psu.py +25 -0
- testerkit-0.4.0/examples/08-waveform-evidence/drivers/scope.py +95 -0
- testerkit-0.4.0/examples/08-waveform-evidence/pyproject.toml +16 -0
- testerkit-0.4.0/examples/08-waveform-evidence/pytest.ini +5 -0
- testerkit-0.4.0/examples/08-waveform-evidence/testerkit.yaml +3 -0
- testerkit-0.4.0/examples/08-waveform-evidence/tests/test_psu_step_response.py +60 -0
- testerkit-0.4.0/examples/09-instrument-streaming/README.md +125 -0
- testerkit-0.4.0/examples/09-instrument-streaming/drivers/__init__.py +5 -0
- testerkit-0.4.0/examples/09-instrument-streaming/drivers/dmm.py +43 -0
- testerkit-0.4.0/examples/09-instrument-streaming/pyproject.toml +16 -0
- testerkit-0.4.0/examples/09-instrument-streaming/scripts/live_dmm_monitor.py +66 -0
- testerkit-0.4.0/examples/09-instrument-streaming/scripts/live_dmm_reader.py +58 -0
- testerkit-0.4.0/examples/09-instrument-streaming/scripts/live_monitor_ui.py +151 -0
- testerkit-0.4.0/examples/09-instrument-streaming/stations/bench_01.yaml +9 -0
- testerkit-0.4.0/examples/09-instrument-streaming/testerkit.yaml +7 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/README.md +99 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/conftest.py +11 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/drivers/__init__.py +6 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/drivers/psu.py +27 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/drivers/scene.py +44 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/pyproject.toml +16 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/pytest.ini +4 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/stations/bench_01.yaml +9 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/testerkit.yaml +3 -0
- testerkit-0.4.0/examples/10-artifacts-and-byte-streams/tests/test_burn_in.py +114 -0
- testerkit-0.4.0/examples/11-querying-data/README.md +107 -0
- testerkit-0.4.0/examples/11-querying-data/pyproject.toml +16 -0
- testerkit-0.4.0/examples/11-querying-data/scripts/analyze.py +131 -0
- testerkit-0.4.0/examples/11-querying-data/scripts/seed_runs.py +87 -0
- testerkit-0.4.0/examples/11-querying-data/testerkit.yaml +2 -0
- testerkit-0.4.0/examples/12-parallel-sites/README.md +126 -0
- testerkit-0.4.0/examples/12-parallel-sites/drivers/__init__.py +11 -0
- testerkit-0.4.0/examples/12-parallel-sites/drivers/dmm.py +128 -0
- testerkit-0.4.0/examples/12-parallel-sites/drivers/psu.py +122 -0
- testerkit-0.4.0/examples/12-parallel-sites/fixtures/dual_site_bench.yaml +42 -0
- testerkit-0.4.0/examples/12-parallel-sites/pyproject.toml +16 -0
- testerkit-0.4.0/examples/12-parallel-sites/pytest.ini +11 -0
- testerkit-0.4.0/examples/12-parallel-sites/stations/bench_dual.yaml +25 -0
- testerkit-0.4.0/examples/12-parallel-sites/testerkit.yaml +5 -0
- testerkit-0.4.0/examples/12-parallel-sites/tests/test_dual_rail.py +28 -0
- testerkit-0.4.0/examples/12-parallel-sites/tests/test_dual_rail.yaml +11 -0
- testerkit-0.4.0/examples/README.md +60 -0
- testerkit-0.4.0/examples/interactive_station.py +381 -0
- testerkit-0.4.0/examples/scripts/demo_duckdb.py +116 -0
- testerkit-0.4.0/examples/scripts/demo_queries.sql +77 -0
- testerkit-0.4.0/examples/scripts/query_results.py +264 -0
- testerkit-0.4.0/examples/scripts/seed_artifact_demo.py +187 -0
- testerkit-0.4.0/examples/static/station.css +94 -0
- testerkit-0.4.0/pyproject.toml +246 -0
- testerkit-0.4.0/scripts/SCREENSHOTS.md +143 -0
- testerkit-0.4.0/scripts/_ontology_graph_template.html +359 -0
- testerkit-0.4.0/scripts/bench_at_rest_encoding.py +180 -0
- testerkit-0.4.0/scripts/bench_channel_scaling.py +66 -0
- testerkit-0.4.0/scripts/bench_file_scaling.py +79 -0
- testerkit-0.4.0/scripts/bench_index_scale.py +250 -0
- testerkit-0.4.0/scripts/bench_index_shape.py +289 -0
- testerkit-0.4.0/scripts/bench_measurement_storage.py +201 -0
- testerkit-0.4.0/scripts/build-skill-zip.py +182 -0
- testerkit-0.4.0/scripts/build_ontology_docs.py +413 -0
- testerkit-0.4.0/scripts/check-screenshot-drift.py +86 -0
- testerkit-0.4.0/scripts/fmt_yaml.py +57 -0
- testerkit-0.4.0/scripts/generate_reference_docs.py +1063 -0
- testerkit-0.4.0/scripts/regenerate-ui-screenshots.py +417 -0
- testerkit-0.4.0/scripts/seed-demo-data.py +415 -0
- testerkit-0.4.0/src/testerkit/__init__.py +68 -0
- testerkit-0.4.0/src/testerkit/analysis/__init__.py +9 -0
- testerkit-0.4.0/src/testerkit/analysis/_common.py +24 -0
- testerkit-0.4.0/src/testerkit/analysis/measurement_facets.py +524 -0
- testerkit-0.4.0/src/testerkit/analysis/measurements_query.py +1458 -0
- testerkit-0.4.0/src/testerkit/analysis/metrics.py +389 -0
- testerkit-0.4.0/src/testerkit/analysis/runs_query.py +434 -0
- testerkit-0.4.0/src/testerkit/analysis/steps_query.py +413 -0
- testerkit-0.4.0/src/testerkit/api/__init__.py +6 -0
- testerkit-0.4.0/src/testerkit/api/_mime.py +71 -0
- testerkit-0.4.0/src/testerkit/api/app.py +1171 -0
- testerkit-0.4.0/src/testerkit/api/dialogs/__init__.py +36 -0
- testerkit-0.4.0/src/testerkit/api/dialogs/manager.py +617 -0
- testerkit-0.4.0/src/testerkit/api/dialogs/models.py +79 -0
- testerkit-0.4.0/src/testerkit/api/models.py +80 -0
- testerkit-0.4.0/src/testerkit/api/responses.py +205 -0
- testerkit-0.4.0/src/testerkit/api/runner.py +222 -0
- testerkit-0.4.0/src/testerkit/api/schemas.py +311 -0
- testerkit-0.4.0/src/testerkit/benchmark/__init__.py +34 -0
- testerkit-0.4.0/src/testerkit/benchmark/concurrency.py +248 -0
- testerkit-0.4.0/src/testerkit/benchmark/core.py +232 -0
- testerkit-0.4.0/src/testerkit/benchmark/runner.py +628 -0
- testerkit-0.4.0/src/testerkit/benchmark/scenario.py +313 -0
- testerkit-0.4.0/src/testerkit/benchmark/system.py +191 -0
- testerkit-0.4.0/src/testerkit/benchmark/workloads.py +507 -0
- testerkit-0.4.0/src/testerkit/catalog/__init__.py +6 -0
- testerkit-0.4.0/src/testerkit/catalog/generic/generic_dmm.yaml +61 -0
- testerkit-0.4.0/src/testerkit/catalog/generic/generic_eload.yaml +31 -0
- testerkit-0.4.0/src/testerkit/catalog/generic/generic_fgen.yaml +56 -0
- testerkit-0.4.0/src/testerkit/catalog/generic/generic_oscilloscope.yaml +45 -0
- testerkit-0.4.0/src/testerkit/catalog/generic/generic_psu.yaml +77 -0
- testerkit-0.4.0/src/testerkit/catalog/generic/generic_smu.yaml +73 -0
- testerkit-0.4.0/src/testerkit/channels.py +538 -0
- testerkit-0.4.0/src/testerkit/cli/__init__.py +32 -0
- testerkit-0.4.0/src/testerkit/cli/_common.py +113 -0
- testerkit-0.4.0/src/testerkit/cli/_time.py +179 -0
- testerkit-0.4.0/src/testerkit/cli/benchmark_cmd.py +56 -0
- testerkit-0.4.0/src/testerkit/cli/catalog_cmd.py +39 -0
- testerkit-0.4.0/src/testerkit/cli/daemon.py +157 -0
- testerkit-0.4.0/src/testerkit/cli/data_cmd.py +1040 -0
- testerkit-0.4.0/src/testerkit/cli/discover_cmd.py +94 -0
- testerkit-0.4.0/src/testerkit/cli/docs_cmd.py +100 -0
- testerkit-0.4.0/src/testerkit/cli/instrument.py +172 -0
- testerkit-0.4.0/src/testerkit/cli/mcp_cmd.py +37 -0
- testerkit-0.4.0/src/testerkit/cli/metrics.py +366 -0
- testerkit-0.4.0/src/testerkit/cli/project.py +312 -0
- testerkit-0.4.0/src/testerkit/cli/root.py +14 -0
- testerkit-0.4.0/src/testerkit/cli/runs.py +412 -0
- testerkit-0.4.0/src/testerkit/cli/schema_cmd.py +87 -0
- testerkit-0.4.0/src/testerkit/cli/serve_cmd.py +50 -0
- testerkit-0.4.0/src/testerkit/cli/setup_cmd.py +604 -0
- testerkit-0.4.0/src/testerkit/cli/station.py +294 -0
- testerkit-0.4.0/src/testerkit/cli/validate.py +112 -0
- testerkit-0.4.0/src/testerkit/client.py +463 -0
- testerkit-0.4.0/src/testerkit/connect.py +635 -0
- testerkit-0.4.0/src/testerkit/data/__init__.py +8 -0
- testerkit-0.4.0/src/testerkit/data/_accumulator_pool.py +455 -0
- testerkit-0.4.0/src/testerkit/data/_atomic.py +59 -0
- testerkit-0.4.0/src/testerkit/data/_collection_indices.py +67 -0
- testerkit-0.4.0/src/testerkit/data/_daemon_lifecycle.py +535 -0
- testerkit-0.4.0/src/testerkit/data/_duckdb_daemon.py +695 -0
- testerkit-0.4.0/src/testerkit/data/_duckdb_flight_server.py +813 -0
- testerkit-0.4.0/src/testerkit/data/_event_filters.py +15 -0
- testerkit-0.4.0/src/testerkit/data/_event_reader.py +101 -0
- testerkit-0.4.0/src/testerkit/data/_flight_errors.py +199 -0
- testerkit-0.4.0/src/testerkit/data/_flight_query.py +202 -0
- testerkit-0.4.0/src/testerkit/data/_flight_retry.py +148 -0
- testerkit-0.4.0/src/testerkit/data/_flight_subscribe.py +67 -0
- testerkit-0.4.0/src/testerkit/data/_index_epoch.py +342 -0
- testerkit-0.4.0/src/testerkit/data/_ipc_writer.py +185 -0
- testerkit-0.4.0/src/testerkit/data/_json_safe.py +63 -0
- testerkit-0.4.0/src/testerkit/data/_process.py +18 -0
- testerkit-0.4.0/src/testerkit/data/_push_relay.py +124 -0
- testerkit-0.4.0/src/testerkit/data/_runs_duckdb_daemon.py +2704 -0
- testerkit-0.4.0/src/testerkit/data/_session_reaper.py +110 -0
- testerkit-0.4.0/src/testerkit/data/_sql_helpers.py +30 -0
- testerkit-0.4.0/src/testerkit/data/_store.py +24 -0
- testerkit-0.4.0/src/testerkit/data/backends/__init__.py +7 -0
- testerkit-0.4.0/src/testerkit/data/backends/_event_accumulator.py +957 -0
- testerkit-0.4.0/src/testerkit/data/backends/_row_helpers.py +1172 -0
- testerkit-0.4.0/src/testerkit/data/backends/parquet.py +1143 -0
- testerkit-0.4.0/src/testerkit/data/backends/protocol.py +35 -0
- testerkit-0.4.0/src/testerkit/data/channels/__init__.py +8 -0
- testerkit-0.4.0/src/testerkit/data/channels/_flight_daemon.py +75 -0
- testerkit-0.4.0/src/testerkit/data/channels/client.py +242 -0
- testerkit-0.4.0/src/testerkit/data/channels/flight_manager.py +88 -0
- testerkit-0.4.0/src/testerkit/data/channels/index.py +664 -0
- testerkit-0.4.0/src/testerkit/data/channels/models.py +418 -0
- testerkit-0.4.0/src/testerkit/data/channels/server.py +162 -0
- testerkit-0.4.0/src/testerkit/data/channels/store.py +1481 -0
- testerkit-0.4.0/src/testerkit/data/data_dir.py +61 -0
- testerkit-0.4.0/src/testerkit/data/duckdb_manager.py +79 -0
- testerkit-0.4.0/src/testerkit/data/event_log.py +384 -0
- testerkit-0.4.0/src/testerkit/data/event_store.py +768 -0
- testerkit-0.4.0/src/testerkit/data/events.py +1025 -0
- testerkit-0.4.0/src/testerkit/data/exporters/__init__.py +6 -0
- testerkit-0.4.0/src/testerkit/data/exporters/_helpers.py +40 -0
- testerkit-0.4.0/src/testerkit/data/exporters/csv_exporter.py +168 -0
- testerkit-0.4.0/src/testerkit/data/exporters/hdf5.py +234 -0
- testerkit-0.4.0/src/testerkit/data/exporters/json_exporter.py +229 -0
- testerkit-0.4.0/src/testerkit/data/exporters/mdf4.py +201 -0
- testerkit-0.4.0/src/testerkit/data/exporters/stdf.py +255 -0
- testerkit-0.4.0/src/testerkit/data/exporters/tdms.py +292 -0
- testerkit-0.4.0/src/testerkit/data/files/__init__.py +71 -0
- testerkit-0.4.0/src/testerkit/data/files/_backend.py +207 -0
- testerkit-0.4.0/src/testerkit/data/files/_catalog_daemon.py +84 -0
- testerkit-0.4.0/src/testerkit/data/files/catalog.py +218 -0
- testerkit-0.4.0/src/testerkit/data/files/catalog_manager.py +325 -0
- testerkit-0.4.0/src/testerkit/data/files/models.py +60 -0
- testerkit-0.4.0/src/testerkit/data/files/serializers.py +414 -0
- testerkit-0.4.0/src/testerkit/data/files/store.py +463 -0
- testerkit-0.4.0/src/testerkit/data/files/streaming.py +783 -0
- testerkit-0.4.0/src/testerkit/data/models.py +604 -0
- testerkit-0.4.0/src/testerkit/data/ref.py +152 -0
- testerkit-0.4.0/src/testerkit/data/retention.py +297 -0
- testerkit-0.4.0/src/testerkit/data/run_store.py +367 -0
- testerkit-0.4.0/src/testerkit/data/runs_duckdb_manager.py +103 -0
- testerkit-0.4.0/src/testerkit/data/schema_dispatch.py +191 -0
- testerkit-0.4.0/src/testerkit/data/schema_migrate.py +76 -0
- testerkit-0.4.0/src/testerkit/data/schema_versions.py +85 -0
- testerkit-0.4.0/src/testerkit/data/schemas.py +288 -0
- testerkit-0.4.0/src/testerkit/data/subscribers/__init__.py +48 -0
- testerkit-0.4.0/src/testerkit/data/subscribers/_base.py +20 -0
- testerkit-0.4.0/src/testerkit/data/subscribers/_output_file.py +25 -0
- testerkit-0.4.0/src/testerkit/data/subscribers/replay.py +55 -0
- testerkit-0.4.0/src/testerkit/environment.py +84 -0
- testerkit-0.4.0/src/testerkit/execution/__init__.py +11 -0
- testerkit-0.4.0/src/testerkit/execution/_git.py +190 -0
- testerkit-0.4.0/src/testerkit/execution/_state.py +740 -0
- testerkit-0.4.0/src/testerkit/execution/accessors.py +54 -0
- testerkit-0.4.0/src/testerkit/execution/audit.py +51 -0
- testerkit-0.4.0/src/testerkit/execution/cascade.py +85 -0
- testerkit-0.4.0/src/testerkit/execution/connections.py +491 -0
- testerkit-0.4.0/src/testerkit/execution/harness.py +1931 -0
- testerkit-0.4.0/src/testerkit/execution/instrument_events.py +42 -0
- testerkit-0.4.0/src/testerkit/execution/limits.py +154 -0
- testerkit-0.4.0/src/testerkit/execution/metadata.py +102 -0
- testerkit-0.4.0/src/testerkit/execution/mocks.py +63 -0
- testerkit-0.4.0/src/testerkit/execution/profiles.py +616 -0
- testerkit-0.4.0/src/testerkit/execution/run_scope.py +1331 -0
- testerkit-0.4.0/src/testerkit/execution/session_scope.py +196 -0
- testerkit-0.4.0/src/testerkit/execution/sidecar.py +280 -0
- testerkit-0.4.0/src/testerkit/execution/site_runner.py +705 -0
- testerkit-0.4.0/src/testerkit/execution/sites.py +183 -0
- testerkit-0.4.0/src/testerkit/execution/sync.py +294 -0
- testerkit-0.4.0/src/testerkit/execution/uut_provider.py +231 -0
- testerkit-0.4.0/src/testerkit/execution/vectors.py +205 -0
- testerkit-0.4.0/src/testerkit/execution/verify.py +396 -0
- testerkit-0.4.0/src/testerkit/expand.py +75 -0
- testerkit-0.4.0/src/testerkit/files.py +235 -0
- testerkit-0.4.0/src/testerkit/fixtures/__init__.py +6 -0
- testerkit-0.4.0/src/testerkit/fixtures/manager.py +357 -0
- testerkit-0.4.0/src/testerkit/grafana/__init__.py +1 -0
- testerkit-0.4.0/src/testerkit/grafana/bootstrap.py +61 -0
- testerkit-0.4.0/src/testerkit/grafana/cli.py +314 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/asset_utilization.json +92 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/channel_explorer.json +77 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/event_log.json +92 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/failure_pareto.json +104 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/measurement_distribution.json +97 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/measurement_trend.json +161 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/station_comparison.json +95 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/test_duration.json +104 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/unit_traceability.json +73 -0
- testerkit-0.4.0/src/testerkit/grafana/dashboards/yield_overview.json +189 -0
- testerkit-0.4.0/src/testerkit/grafana/provisioning/dashboards.yaml.j2 +12 -0
- testerkit-0.4.0/src/testerkit/grafana/provisioning/datasources.yaml.j2 +17 -0
- testerkit-0.4.0/src/testerkit/grafana/server.py +282 -0
- testerkit-0.4.0/src/testerkit/init.py +724 -0
- testerkit-0.4.0/src/testerkit/instruments/__init__.py +10 -0
- testerkit-0.4.0/src/testerkit/instruments/base.py +82 -0
- testerkit-0.4.0/src/testerkit/instruments/discovery/__init__.py +62 -0
- testerkit-0.4.0/src/testerkit/instruments/discovery/_base.py +174 -0
- testerkit-0.4.0/src/testerkit/instruments/discovery/lxi.py +152 -0
- testerkit-0.4.0/src/testerkit/instruments/discovery/ni.py +95 -0
- testerkit-0.4.0/src/testerkit/instruments/discovery/serial.py +73 -0
- testerkit-0.4.0/src/testerkit/instruments/discovery/visa.py +98 -0
- testerkit-0.4.0/src/testerkit/instruments/lifecycle.py +213 -0
- testerkit-0.4.0/src/testerkit/instruments/loader.py +79 -0
- testerkit-0.4.0/src/testerkit/instruments/locks.py +178 -0
- testerkit-0.4.0/src/testerkit/instruments/mocks.py +230 -0
- testerkit-0.4.0/src/testerkit/instruments/observer.py +270 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/__init__.py +36 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/_base.py +68 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/daqmx.py +70 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/descriptor.py +69 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/generic.py +92 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/lantz.py +31 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/modbus.py +96 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/motion.py +68 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/ni_modular.py +73 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/ophyd.py +80 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/pymeasure.py +120 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/qcodes.py +66 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/scpi.py +88 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/tektronix.py +57 -0
- testerkit-0.4.0/src/testerkit/instruments/observers/visa.py +103 -0
- testerkit-0.4.0/src/testerkit/instruments/pool.py +459 -0
- testerkit-0.4.0/src/testerkit/instruments/proxy.py +59 -0
- testerkit-0.4.0/src/testerkit/instruments/route_manager.py +329 -0
- testerkit-0.4.0/src/testerkit/instruments/routed_proxy.py +88 -0
- testerkit-0.4.0/src/testerkit/instruments/server.py +508 -0
- testerkit-0.4.0/src/testerkit/instruments/switch.py +43 -0
- testerkit-0.4.0/src/testerkit/instruments/visa.py +294 -0
- testerkit-0.4.0/src/testerkit/matching/__init__.py +6 -0
- testerkit-0.4.0/src/testerkit/matching/service.py +969 -0
- testerkit-0.4.0/src/testerkit/mcp/__init__.py +6 -0
- testerkit-0.4.0/src/testerkit/mcp/server.py +681 -0
- testerkit-0.4.0/src/testerkit/mcp/tools.py +1868 -0
- testerkit-0.4.0/src/testerkit/models/__init__.py +18 -0
- testerkit-0.4.0/src/testerkit/models/capability.py +598 -0
- testerkit-0.4.0/src/testerkit/models/catalog.py +76 -0
- testerkit-0.4.0/src/testerkit/models/data_options.py +153 -0
- testerkit-0.4.0/src/testerkit/models/enums.py +334 -0
- testerkit-0.4.0/src/testerkit/models/instrument.py +152 -0
- testerkit-0.4.0/src/testerkit/models/instrument_asset.py +25 -0
- testerkit-0.4.0/src/testerkit/models/part.py +271 -0
- testerkit-0.4.0/src/testerkit/models/part_manifest.py +96 -0
- testerkit-0.4.0/src/testerkit/models/project.py +114 -0
- testerkit-0.4.0/src/testerkit/models/station.py +140 -0
- testerkit-0.4.0/src/testerkit/models/test_config.py +748 -0
- testerkit-0.4.0/src/testerkit/ontology/__init__.py +39 -0
- testerkit-0.4.0/src/testerkit/ontology/schema.py +188 -0
- testerkit-0.4.0/src/testerkit/ontology/testerkit.yaml +1420 -0
- testerkit-0.4.0/src/testerkit/parts/__init__.py +8 -0
- testerkit-0.4.0/src/testerkit/parts/context.py +181 -0
- testerkit-0.4.0/src/testerkit/parts/folder.py +251 -0
- testerkit-0.4.0/src/testerkit/parts/loader.py +27 -0
- testerkit-0.4.0/src/testerkit/prompts/__init__.py +17 -0
- testerkit-0.4.0/src/testerkit/prompts/core.py +133 -0
- testerkit-0.4.0/src/testerkit/pytest_plugin/__init__.py +1287 -0
- testerkit-0.4.0/src/testerkit/pytest_plugin/autouse.py +369 -0
- testerkit-0.4.0/src/testerkit/pytest_plugin/helpers.py +354 -0
- testerkit-0.4.0/src/testerkit/pytest_plugin/hooks.py +1982 -0
- testerkit-0.4.0/src/testerkit/pytest_plugin/markers.py +203 -0
- testerkit-0.4.0/src/testerkit/pytest_plugin/retry.py +37 -0
- testerkit-0.4.0/src/testerkit/pytest_plugin/sweeps.py +117 -0
- testerkit-0.4.0/src/testerkit/queries.py +78 -0
- testerkit-0.4.0/src/testerkit/reports/__init__.py +6 -0
- testerkit-0.4.0/src/testerkit/reports/core.py +492 -0
- testerkit-0.4.0/src/testerkit/reports/datasheet.py +831 -0
- testerkit-0.4.0/src/testerkit/reports/templates/datasheet.html +383 -0
- testerkit-0.4.0/src/testerkit/reports/templates/default.html +153 -0
- testerkit-0.4.0/src/testerkit/sbom.py +142 -0
- testerkit-0.4.0/src/testerkit/schema_export.py +101 -0
- testerkit-0.4.0/src/testerkit/signals.py +63 -0
- testerkit-0.4.0/src/testerkit/skills/README.md +58 -0
- testerkit-0.4.0/src/testerkit/skills/templates/project-instructions.md +125 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-analysis/SKILL.md +87 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-capture/SKILL.md +114 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-data/SKILL.md +138 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/SKILL.md +100 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/scaffold-writer.md +115 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/section-extractor.md +98 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/section-reviewer.md +153 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/section-splitter.md +89 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/agents/section-writer.md +226 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/references/catalog-pipeline.md +271 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/references/process-queue.md +42 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/references/scaffold.md +156 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-datasheets/references/test-pipeline.md +312 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-debug/SKILL.md +127 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-interactive/SKILL.md +188 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-interactive/references/live-ui-patterns.md +102 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-mocks/SKILL.md +128 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-parts/SKILL.md +126 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-profiles/SKILL.md +139 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-sites/SKILL.md +140 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-stations/SKILL.md +146 -0
- testerkit-0.4.0/src/testerkit/skills/testerkit-tests/SKILL.md +136 -0
- testerkit-0.4.0/src/testerkit/store.py +1639 -0
- testerkit-0.4.0/src/testerkit/ui/__init__.py +71 -0
- testerkit-0.4.0/src/testerkit/ui/_asgi.py +162 -0
- testerkit-0.4.0/src/testerkit/ui/app.py +32 -0
- testerkit-0.4.0/src/testerkit/ui/components/__init__.py +13 -0
- testerkit-0.4.0/src/testerkit/ui/components/artifact_viewer.py +250 -0
- testerkit-0.4.0/src/testerkit/ui/components/channel_values.py +159 -0
- testerkit-0.4.0/src/testerkit/ui/components/event_timeline.py +222 -0
- testerkit-0.4.0/src/testerkit/ui/components/execution_gantt.py +210 -0
- testerkit-0.4.0/src/testerkit/ui/components/file_streams.py +147 -0
- testerkit-0.4.0/src/testerkit/ui/components/instrument_activity.py +146 -0
- testerkit-0.4.0/src/testerkit/ui/components/session_table.py +118 -0
- testerkit-0.4.0/src/testerkit/ui/pages/__init__.py +25 -0
- testerkit-0.4.0/src/testerkit/ui/pages/channels/__init__.py +4 -0
- testerkit-0.4.0/src/testerkit/ui/pages/channels/detail.py +932 -0
- testerkit-0.4.0/src/testerkit/ui/pages/channels/list.py +515 -0
- testerkit-0.4.0/src/testerkit/ui/pages/dashboard.py +236 -0
- testerkit-0.4.0/src/testerkit/ui/pages/designer/__init__.py +5 -0
- testerkit-0.4.0/src/testerkit/ui/pages/designer/graph.py +635 -0
- testerkit-0.4.0/src/testerkit/ui/pages/designer/matching.py +663 -0
- testerkit-0.4.0/src/testerkit/ui/pages/designer/page.py +593 -0
- testerkit-0.4.0/src/testerkit/ui/pages/designer/properties.py +591 -0
- testerkit-0.4.0/src/testerkit/ui/pages/designer/state.py +468 -0
- testerkit-0.4.0/src/testerkit/ui/pages/docs/__init__.py +6 -0
- testerkit-0.4.0/src/testerkit/ui/pages/docs/index.py +95 -0
- testerkit-0.4.0/src/testerkit/ui/pages/docs/page.py +698 -0
- testerkit-0.4.0/src/testerkit/ui/pages/events/__init__.py +3 -0
- testerkit-0.4.0/src/testerkit/ui/pages/events/list.py +263 -0
- testerkit-0.4.0/src/testerkit/ui/pages/explore.py +1108 -0
- testerkit-0.4.0/src/testerkit/ui/pages/files/__init__.py +4 -0
- testerkit-0.4.0/src/testerkit/ui/pages/files/detail.py +426 -0
- testerkit-0.4.0/src/testerkit/ui/pages/files/list.py +447 -0
- testerkit-0.4.0/src/testerkit/ui/pages/fixtures/__init__.py +8 -0
- testerkit-0.4.0/src/testerkit/ui/pages/fixtures/detail.py +280 -0
- testerkit-0.4.0/src/testerkit/ui/pages/fixtures/edit.py +370 -0
- testerkit-0.4.0/src/testerkit/ui/pages/fixtures/list.py +180 -0
- testerkit-0.4.0/src/testerkit/ui/pages/fixtures/new.py +195 -0
- testerkit-0.4.0/src/testerkit/ui/pages/instruments/__init__.py +4 -0
- testerkit-0.4.0/src/testerkit/ui/pages/instruments/detail.py +320 -0
- testerkit-0.4.0/src/testerkit/ui/pages/instruments/edit.py +482 -0
- testerkit-0.4.0/src/testerkit/ui/pages/instruments/list.py +249 -0
- testerkit-0.4.0/src/testerkit/ui/pages/instruments/new.py +200 -0
- testerkit-0.4.0/src/testerkit/ui/pages/launch.py +261 -0
- testerkit-0.4.0/src/testerkit/ui/pages/live.py +124 -0
- testerkit-0.4.0/src/testerkit/ui/pages/metrics_page.py +1229 -0
- testerkit-0.4.0/src/testerkit/ui/pages/parts/__init__.py +11 -0
- testerkit-0.4.0/src/testerkit/ui/pages/parts/detail.py +202 -0
- testerkit-0.4.0/src/testerkit/ui/pages/parts/edit.py +310 -0
- testerkit-0.4.0/src/testerkit/ui/pages/parts/list.py +160 -0
- testerkit-0.4.0/src/testerkit/ui/pages/parts/new.py +170 -0
- testerkit-0.4.0/src/testerkit/ui/pages/parts/requirements.py +153 -0
- testerkit-0.4.0/src/testerkit/ui/pages/parts/stations.py +199 -0
- testerkit-0.4.0/src/testerkit/ui/pages/profiles/__init__.py +4 -0
- testerkit-0.4.0/src/testerkit/ui/pages/profiles/detail.py +113 -0
- testerkit-0.4.0/src/testerkit/ui/pages/profiles/list.py +86 -0
- testerkit-0.4.0/src/testerkit/ui/pages/results/__init__.py +4 -0
- testerkit-0.4.0/src/testerkit/ui/pages/results/detail.py +631 -0
- testerkit-0.4.0/src/testerkit/ui/pages/results/list.py +230 -0
- testerkit-0.4.0/src/testerkit/ui/pages/stations/__init__.py +4 -0
- testerkit-0.4.0/src/testerkit/ui/pages/stations/detail.py +256 -0
- testerkit-0.4.0/src/testerkit/ui/pages/stations/edit.py +273 -0
- testerkit-0.4.0/src/testerkit/ui/pages/stations/list.py +180 -0
- testerkit-0.4.0/src/testerkit/ui/pages/stations/new.py +311 -0
- testerkit-0.4.0/src/testerkit/ui/pages/tests/__init__.py +4 -0
- testerkit-0.4.0/src/testerkit/ui/pages/tests/detail.py +152 -0
- testerkit-0.4.0/src/testerkit/ui/pages/tests/list.py +194 -0
- testerkit-0.4.0/src/testerkit/ui/pages/uuts/__init__.py +4 -0
- testerkit-0.4.0/src/testerkit/ui/pages/uuts/list.py +97 -0
- testerkit-0.4.0/src/testerkit/ui/shared/__init__.py +8 -0
- testerkit-0.4.0/src/testerkit/ui/shared/components.py +1826 -0
- testerkit-0.4.0/src/testerkit/ui/shared/dialogs.py +105 -0
- testerkit-0.4.0/src/testerkit/ui/shared/event_binding.py +194 -0
- testerkit-0.4.0/src/testerkit/ui/shared/layout.py +314 -0
- testerkit-0.4.0/src/testerkit/ui/shared/services.py +1719 -0
- testerkit-0.4.0/src/testerkit/ui/shared/timestamps.py +21 -0
- testerkit-0.4.0/src/testerkit/ui/static/branding/favicon-16.png +0 -0
- testerkit-0.4.0/src/testerkit/ui/static/branding/favicon-32.png +0 -0
- testerkit-0.4.0/src/testerkit/ui/static/branding/favicon-48.png +0 -0
- testerkit-0.4.0/src/testerkit/ui/static/branding/testerkit-icon-256.png +0 -0
- testerkit-0.4.0/src/testerkit/ui/static/branding/testerkit-mark.svg +1 -0
- testerkit-0.4.0/src/testerkit/ui/static/branding/testerkit-wordmark.svg +1 -0
- testerkit-0.4.0/src/testerkit/ui/static/global.css +465 -0
- testerkit-0.4.0/src/testerkit/utils/__init__.py +17 -0
- testerkit-0.4.0/src/testerkit/utils/enum_meta.py +800 -0
- testerkit-0.4.0/src/testerkit/utils/paths.py +75 -0
- testerkit-0.4.0/src/testerkit/utils/ranges.py +257 -0
- testerkit-0.4.0/src/testerkit/validation.py +82 -0
- testerkit-0.4.0/src/testerkit/verbs.py +142 -0
- testerkit-0.4.0/tests/__init__.py +0 -0
- testerkit-0.4.0/tests/conftest.py +126 -0
- testerkit-0.4.0/tests/fixtures/specs/base_board.yaml +28 -0
- testerkit-0.4.0/tests/fixtures/specs/base_board_with_driver.yaml +28 -0
- testerkit-0.4.0/tests/fixtures/specs/circular_a.yaml +13 -0
- testerkit-0.4.0/tests/fixtures/specs/circular_b.yaml +13 -0
- testerkit-0.4.0/tests/fixtures/specs/power_board_v1.yaml +116 -0
- testerkit-0.4.0/tests/fixtures/specs/variant_board.yaml +14 -0
- testerkit-0.4.0/tests/fixtures/specs/variant_driver_inherit.yaml +3 -0
- testerkit-0.4.0/tests/fixtures/specs/variant_driver_override.yaml +4 -0
- testerkit-0.4.0/tests/fixtures/specs/variant_inherit_all.yaml +3 -0
- testerkit-0.4.0/tests/test_ai_surfaces_accuracy.py +245 -0
- testerkit-0.4.0/tests/test_api/test_mime_sniff.py +46 -0
- testerkit-0.4.0/tests/test_api/test_ref_endpoint.py +216 -0
- testerkit-0.4.0/tests/test_api/test_run_detail.py +152 -0
- testerkit-0.4.0/tests/test_api/test_steps_endpoint.py +124 -0
- testerkit-0.4.0/tests/test_api/test_utc_timestamp.py +83 -0
- testerkit-0.4.0/tests/test_catalog/__init__.py +0 -0
- testerkit-0.4.0/tests/test_catalog/test_loader.py +487 -0
- testerkit-0.4.0/tests/test_catalog/test_spec_bands.py +86 -0
- testerkit-0.4.0/tests/test_cli/__init__.py +0 -0
- testerkit-0.4.0/tests/test_cli/test_data_index.py +625 -0
- testerkit-0.4.0/tests/test_cli/test_time_utils.py +283 -0
- testerkit-0.4.0/tests/test_client.py +36 -0
- testerkit-0.4.0/tests/test_config/__init__.py +1 -0
- testerkit-0.4.0/tests/test_config/test_expand_helpers.py +255 -0
- testerkit-0.4.0/tests/test_config/test_expander_wiring.py +67 -0
- testerkit-0.4.0/tests/test_config/test_markers.py +202 -0
- testerkit-0.4.0/tests/test_config/test_models.py +153 -0
- testerkit-0.4.0/tests/test_config/test_station_compliance.py +101 -0
- testerkit-0.4.0/tests/test_config/test_switch_route.py +81 -0
- testerkit-0.4.0/tests/test_connect.py +410 -0
- testerkit-0.4.0/tests/test_conventions.py +316 -0
- testerkit-0.4.0/tests/test_data/__init__.py +1 -0
- testerkit-0.4.0/tests/test_data/conftest.py +383 -0
- testerkit-0.4.0/tests/test_data/golden/schema_v0_1/events.arrow +0 -0
- testerkit-0.4.0/tests/test_data/golden/schema_v0_1/files.meta.json +1 -0
- testerkit-0.4.0/tests/test_data/golden/schema_v0_1/runs.parquet +0 -0
- testerkit-0.4.0/tests/test_data/test_atomic.py +67 -0
- testerkit-0.4.0/tests/test_data/test_channel_payload_column_unified.py +215 -0
- testerkit-0.4.0/tests/test_data/test_channel_server.py +343 -0
- testerkit-0.4.0/tests/test_data/test_channel_store.py +478 -0
- testerkit-0.4.0/tests/test_data/test_channel_store_finalizer.py +81 -0
- testerkit-0.4.0/tests/test_data/test_channel_verbs.py +133 -0
- testerkit-0.4.0/tests/test_data/test_channel_write_core.py +333 -0
- testerkit-0.4.0/tests/test_data/test_channels_received_at_sampled_at.py +351 -0
- testerkit-0.4.0/tests/test_data/test_channels_typed_leaf_types.py +241 -0
- testerkit-0.4.0/tests/test_data/test_checkpoints.py +174 -0
- testerkit-0.4.0/tests/test_data/test_daemon_lifecycle.py +129 -0
- testerkit-0.4.0/tests/test_data/test_dangling_refs.py +38 -0
- testerkit-0.4.0/tests/test_data/test_event_log.py +176 -0
- testerkit-0.4.0/tests/test_data/test_event_reader.py +98 -0
- testerkit-0.4.0/tests/test_data/test_event_registry_consistency.py +76 -0
- testerkit-0.4.0/tests/test_data/test_event_store.py +271 -0
- testerkit-0.4.0/tests/test_data/test_event_store_finalizer.py +78 -0
- testerkit-0.4.0/tests/test_data/test_event_store_write_resilience.py +196 -0
- testerkit-0.4.0/tests/test_data/test_events.py +268 -0
- testerkit-0.4.0/tests/test_data/test_events_index_epoch.py +235 -0
- testerkit-0.4.0/tests/test_data/test_export_hdf5.py +198 -0
- testerkit-0.4.0/tests/test_data/test_export_mdf4.py +159 -0
- testerkit-0.4.0/tests/test_data/test_export_stdf.py +237 -0
- testerkit-0.4.0/tests/test_data/test_export_tdms.py +144 -0
- testerkit-0.4.0/tests/test_data/test_files_catalog.py +150 -0
- testerkit-0.4.0/tests/test_data/test_filestore_attributes.py +311 -0
- testerkit-0.4.0/tests/test_data/test_filestore_backend_swap.py +102 -0
- testerkit-0.4.0/tests/test_data/test_filestore_e2e.py +323 -0
- testerkit-0.4.0/tests/test_data/test_filestore_put.py +449 -0
- testerkit-0.4.0/tests/test_data/test_filestore_streaming.py +586 -0
- testerkit-0.4.0/tests/test_data/test_filestore_unify_refs.py +240 -0
- testerkit-0.4.0/tests/test_data/test_flight_server_subscribe.py +284 -0
- testerkit-0.4.0/tests/test_data/test_golden_corpus.py +127 -0
- testerkit-0.4.0/tests/test_data/test_index_epoch.py +379 -0
- testerkit-0.4.0/tests/test_data/test_ingestion_drift.py +212 -0
- testerkit-0.4.0/tests/test_data/test_instrument_arrays.py +92 -0
- testerkit-0.4.0/tests/test_data/test_instrument_events.py +117 -0
- testerkit-0.4.0/tests/test_data/test_instruments_per_step.py +432 -0
- testerkit-0.4.0/tests/test_data/test_materializer.py +402 -0
- testerkit-0.4.0/tests/test_data/test_materializer_auto_promotion.py +562 -0
- testerkit-0.4.0/tests/test_data/test_measurement_attribution.py +192 -0
- testerkit-0.4.0/tests/test_data/test_measurement_writer.py +60 -0
- testerkit-0.4.0/tests/test_data/test_models.py +213 -0
- testerkit-0.4.0/tests/test_data/test_observation_pin.py +313 -0
- testerkit-0.4.0/tests/test_data/test_overlay_schema_consistency.py +728 -0
- testerkit-0.4.0/tests/test_data/test_perf.py +1148 -0
- testerkit-0.4.0/tests/test_data/test_perf_daemon.py +801 -0
- testerkit-0.4.0/tests/test_data/test_promote_references.py +84 -0
- testerkit-0.4.0/tests/test_data/test_push_relay.py +126 -0
- testerkit-0.4.0/tests/test_data/test_ref.py +126 -0
- testerkit-0.4.0/tests/test_data/test_relocation.py +40 -0
- testerkit-0.4.0/tests/test_data/test_replay.py +155 -0
- testerkit-0.4.0/tests/test_data/test_retention.py +212 -0
- testerkit-0.4.0/tests/test_data/test_retry_model.py +356 -0
- testerkit-0.4.0/tests/test_data/test_run_store.py +308 -0
- testerkit-0.4.0/tests/test_data/test_runs_daemon_concurrency.py +315 -0
- testerkit-0.4.0/tests/test_data/test_runs_duckdb_daemon_subscriber.py +340 -0
- testerkit-0.4.0/tests/test_data/test_runs_index_selfheal.py +370 -0
- testerkit-0.4.0/tests/test_data/test_schema_coexistence.py +91 -0
- testerkit-0.4.0/tests/test_data/test_schema_convention.py +50 -0
- testerkit-0.4.0/tests/test_data/test_schema_dispatch.py +260 -0
- testerkit-0.4.0/tests/test_data/test_schema_migrate.py +109 -0
- testerkit-0.4.0/tests/test_data/test_serializers_registry.py +353 -0
- testerkit-0.4.0/tests/test_data/test_session_reaper.py +106 -0
- testerkit-0.4.0/tests/test_data/test_terminal_fence.py +85 -0
- testerkit-0.4.0/tests/test_data/test_v020_subscription_poc.py +381 -0
- testerkit-0.4.0/tests/test_data/test_vector_grained_records.py +1148 -0
- testerkit-0.4.0/tests/test_data/test_warm_index_persistence.py +143 -0
- testerkit-0.4.0/tests/test_data/test_write_schema.py +201 -0
- testerkit-0.4.0/tests/test_data/test_xydata_and_complex.py +219 -0
- testerkit-0.4.0/tests/test_datasheet.py +309 -0
- testerkit-0.4.0/tests/test_dialog_demo.py +92 -0
- testerkit-0.4.0/tests/test_dialogs/__init__.py +0 -0
- testerkit-0.4.0/tests/test_dialogs/test_dialog_events.py +144 -0
- testerkit-0.4.0/tests/test_discovery/__init__.py +0 -0
- testerkit-0.4.0/tests/test_discovery/test_models.py +32 -0
- testerkit-0.4.0/tests/test_discovery/test_scanner.py +76 -0
- testerkit-0.4.0/tests/test_e2e/test_example_scripts.py +68 -0
- testerkit-0.4.0/tests/test_e2e/test_examples.py +66 -0
- testerkit-0.4.0/tests/test_e2e/test_spec_to_results.py +461 -0
- testerkit-0.4.0/tests/test_e2e/test_workflows.py +307 -0
- testerkit-0.4.0/tests/test_environment.py +60 -0
- testerkit-0.4.0/tests/test_execution/__init__.py +1 -0
- testerkit-0.4.0/tests/test_execution/test_class_container_reservation.py +162 -0
- testerkit-0.4.0/tests/test_execution/test_class_keying.py +86 -0
- testerkit-0.4.0/tests/test_execution/test_class_step_containers.py +831 -0
- testerkit-0.4.0/tests/test_execution/test_connections_resolution.py +711 -0
- testerkit-0.4.0/tests/test_execution/test_context_session_attrs.py +141 -0
- testerkit-0.4.0/tests/test_execution/test_files_stream_verb.py +286 -0
- testerkit-0.4.0/tests/test_execution/test_grain_reshape_e2e_acceptance.py +728 -0
- testerkit-0.4.0/tests/test_execution/test_harness.py +885 -0
- testerkit-0.4.0/tests/test_execution/test_limits.py +317 -0
- testerkit-0.4.0/tests/test_execution/test_logger.py +391 -0
- testerkit-0.4.0/tests/test_execution/test_markers_sidecar.py +393 -0
- testerkit-0.4.0/tests/test_execution/test_multi_uut_e2e.py +161 -0
- testerkit-0.4.0/tests/test_execution/test_observe_blob_claim.py +212 -0
- testerkit-0.4.0/tests/test_execution/test_observe_dispatch_and_namespace.py +313 -0
- testerkit-0.4.0/tests/test_execution/test_observe_emit_event.py +316 -0
- testerkit-0.4.0/tests/test_execution/test_observe_handle_latching.py +256 -0
- testerkit-0.4.0/tests/test_execution/test_observe_mirrors_to_vector.py +118 -0
- testerkit-0.4.0/tests/test_execution/test_outcome_cascade.py +177 -0
- testerkit-0.4.0/tests/test_execution/test_part_resolution.py +112 -0
- testerkit-0.4.0/tests/test_execution/test_phase1_grain_reshape.py +200 -0
- testerkit-0.4.0/tests/test_execution/test_phase_and_mocks.py +279 -0
- testerkit-0.4.0/tests/test_execution/test_phase_wiring.py +205 -0
- testerkit-0.4.0/tests/test_execution/test_profile_facets.py +303 -0
- testerkit-0.4.0/tests/test_execution/test_prompt_fixture.py +284 -0
- testerkit-0.4.0/tests/test_execution/test_pytest_native_plugin.py +678 -0
- testerkit-0.4.0/tests/test_execution/test_required_inputs.py +187 -0
- testerkit-0.4.0/tests/test_execution/test_session_scope_tokens.py +52 -0
- testerkit-0.4.0/tests/test_execution/test_site_flag.py +275 -0
- testerkit-0.4.0/tests/test_execution/test_site_runner.py +146 -0
- testerkit-0.4.0/tests/test_execution/test_site_termination.py +169 -0
- testerkit-0.4.0/tests/test_execution/test_sites.py +364 -0
- testerkit-0.4.0/tests/test_execution/test_step_end_owning_context.py +49 -0
- testerkit-0.4.0/tests/test_execution/test_stream_verb_and_power_user.py +260 -0
- testerkit-0.4.0/tests/test_execution/test_sync.py +237 -0
- testerkit-0.4.0/tests/test_execution/test_top_level_verbs.py +89 -0
- testerkit-0.4.0/tests/test_execution/test_uut_provider.py +237 -0
- testerkit-0.4.0/tests/test_execution/test_vector_step_index_emit.py +157 -0
- testerkit-0.4.0/tests/test_execution/test_vectors.py +257 -0
- testerkit-0.4.0/tests/test_execution/test_vectors_fixture.py +336 -0
- testerkit-0.4.0/tests/test_execution/test_verb_symmetry_observe_verify.py +173 -0
- testerkit-0.4.0/tests/test_execution/test_verify_cascade.py +250 -0
- testerkit-0.4.0/tests/test_execution/test_verify_polymorphic.py +294 -0
- testerkit-0.4.0/tests/test_execution/test_when_limits.py +334 -0
- testerkit-0.4.0/tests/test_exporters.py +643 -0
- testerkit-0.4.0/tests/test_fixtures/test_manager.py +208 -0
- testerkit-0.4.0/tests/test_grafana_server.py +138 -0
- testerkit-0.4.0/tests/test_init.py +201 -0
- testerkit-0.4.0/tests/test_instruments/__init__.py +0 -0
- testerkit-0.4.0/tests/test_instruments/test_base.py +106 -0
- testerkit-0.4.0/tests/test_instruments/test_channel_lifecycle.py +336 -0
- testerkit-0.4.0/tests/test_instruments/test_discovery.py +186 -0
- testerkit-0.4.0/tests/test_instruments/test_lifecycle.py +111 -0
- testerkit-0.4.0/tests/test_instruments/test_loader.py +286 -0
- testerkit-0.4.0/tests/test_instruments/test_locks.py +169 -0
- testerkit-0.4.0/tests/test_instruments/test_lxi.py +97 -0
- testerkit-0.4.0/tests/test_instruments/test_mocks.py +343 -0
- testerkit-0.4.0/tests/test_instruments/test_models.py +217 -0
- testerkit-0.4.0/tests/test_instruments/test_observer.py +169 -0
- testerkit-0.4.0/tests/test_instruments/test_observer_blob_claim.py +365 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/__init__.py +0 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/conftest.py +44 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_daqmx.py +56 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_generic.py +101 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_lantz.py +71 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_modbus.py +60 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_motion.py +76 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_ni_modular.py +58 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_ophyd.py +78 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_pymeasure.py +226 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_qcodes.py +71 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_registry.py +128 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_scpi.py +49 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_tektronix.py +58 -0
- testerkit-0.4.0/tests/test_instruments/test_observers/test_visa.py +97 -0
- testerkit-0.4.0/tests/test_instruments/test_pool.py +372 -0
- testerkit-0.4.0/tests/test_instruments/test_proxy.py +245 -0
- testerkit-0.4.0/tests/test_instruments/test_route_manager.py +307 -0
- testerkit-0.4.0/tests/test_instruments/test_routed_proxy.py +108 -0
- testerkit-0.4.0/tests/test_instruments/test_server.py +772 -0
- testerkit-0.4.0/tests/test_matching/__init__.py +1 -0
- testerkit-0.4.0/tests/test_matching/test_channel_matching.py +642 -0
- testerkit-0.4.0/tests/test_matching/test_conditions.py +525 -0
- testerkit-0.4.0/tests/test_matching/test_recommend.py +396 -0
- testerkit-0.4.0/tests/test_matching/test_service.py +537 -0
- testerkit-0.4.0/tests/test_measurements_query/__init__.py +0 -0
- testerkit-0.4.0/tests/test_measurements_query/test_index_derivation.py +123 -0
- testerkit-0.4.0/tests/test_measurements_query/test_measurement_facets.py +167 -0
- testerkit-0.4.0/tests/test_measurements_query/test_measurements_query_sql.py +1424 -0
- testerkit-0.4.0/tests/test_ontology.py +40 -0
- testerkit-0.4.0/tests/test_parts/test_loader.py +284 -0
- testerkit-0.4.0/tests/test_parts/test_models.py +175 -0
- testerkit-0.4.0/tests/test_parts/test_part_specband.py +89 -0
- testerkit-0.4.0/tests/test_plugin_fixtures.py +350 -0
- testerkit-0.4.0/tests/test_queries_surface.py +45 -0
- testerkit-0.4.0/tests/test_reports.py +329 -0
- testerkit-0.4.0/tests/test_runs_query/__init__.py +0 -0
- testerkit-0.4.0/tests/test_runs_query/test_runs_query.py +480 -0
- testerkit-0.4.0/tests/test_sbom.py +151 -0
- testerkit-0.4.0/tests/test_schemas.py +32 -0
- testerkit-0.4.0/tests/test_signals.py +40 -0
- testerkit-0.4.0/tests/test_steps_query/__init__.py +0 -0
- testerkit-0.4.0/tests/test_steps_query/test_steps_query.py +315 -0
- testerkit-0.4.0/tests/test_ui/__init__.py +0 -0
- testerkit-0.4.0/tests/test_ui/test_files_page_service.py +130 -0
- testerkit-0.4.0/tests/test_ui/test_fixtures_provenance.py +109 -0
- testerkit-0.4.0/tests/test_ui/test_instruments_provenance.py +103 -0
- testerkit-0.4.0/tests/test_ui/test_parts_provenance.py +135 -0
- testerkit-0.4.0/tests/test_ui/test_run_detail_service.py +120 -0
- testerkit-0.4.0/tests/test_ui/test_stations_provenance.py +128 -0
- testerkit-0.4.0/tests/test_ui/test_subscribe_with_refresh.py +157 -0
- testerkit-0.4.0/tests/test_ui/test_ui_surface.py +62 -0
- testerkit-0.4.0/tests/test_ui/test_utc_date_input.py +63 -0
- testerkit-0.4.0/tests/test_ui/test_uuts_from_runs.py +121 -0
- testerkit-0.4.0/tests/test_utils/__init__.py +1 -0
- testerkit-0.4.0/tests/test_utils/test_enum_meta.py +140 -0
- testerkit-0.4.0/tests/test_utils/test_ranges.py +240 -0
- testerkit-0.4.0/tests/test_uut_options.py +106 -0
- testerkit-0.4.0/tests/test_yield/__init__.py +0 -0
- testerkit-0.4.0/tests/test_yield/test_cli.py +196 -0
- 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
|