Merged
Conversation
Allow users to flag test definitions for attention. The flag persists across test runs, giving users a lightweight way to track work-in-progress issues without needing to leave the app. - Add `flagged` boolean column to test_definitions table - Add flag/unflag disposition actions on Test Definitions and Test Results pages - Add "Flagged" filter on both pages - Add flagged toggle to test definition edit form - Include flagged column in grid display, detail panel, and Excel export - Fix pre-existing bug where inherited dataclass fields were dropped by to_dataframe Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…TG-980) - Notes dialog: styled subtitle (Table/Column/Test), tooltip fix, auto-expand when empty, form reset on add/edit - Test results: merged Review column (disposition + flagged + notes count), Flagged/Has Notes sorting - Test definitions: notes count column, Flagged/Has Notes sorting - Model: add get_notes_count_by_ids, use uuid4 for TestDefinitionNote id - Grid: add column_styles parameter to render_grid_select Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…gged-test-definitions
…ests Extract pure decision/transformation logic from I/O-heavy command functions into standalone functions, then add unit tests for each. No behavioral changes. Extractions: - calculate_sampling_params() from run_profiling.py into profiling_query.py - collect_test_identifiers() and check_identifiers() from run_test_validation.py - build_cat_expressions(), group_cat_tests(), parse_cat_results() from execute_tests_query.py - calculate_prediction_tolerances() and Z_SCORE_MAP from test_thresholds_prediction.py Tests for _score_card_to_results() added directly (already a standalone function). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ed import) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…gged-test-definitions
…gged-test-definitions
Both pydantic (v1) and streamlit-pydantic are unused — the only consumer (ui/forms.py) has zero imports across the codebase. Removing clears the path for PR 1 to introduce pydantic v2 as a transitive dep of the MCP SDK. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add FastMCP server with streamable HTTP transport, JWT authentication reusing existing token schema, and a smoke-test ping tool. Extract shared auth building blocks (JWT signing, password verification, permission checking) from UI into common/auth.py so both the Streamlit UI and MCP server use the same logic. - Add mcp[cli], uvicorn, PyJWT, bcrypt to core dependencies - Add MCP_PORT, MCP_HOST, MCP_ENABLED settings - Create common/auth.py with shared JWT and password utilities - Refactor ui/auth.py to use common/auth.py - Create mcp/server.py with FastMCP app and ping tool - Create mcp/auth.py for MCP-specific authenticate/validate flows - Add `testgen run-app mcp` and `testgen mcp-token` CLI commands - Add 17 unit tests (9 common auth + 8 MCP auth) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Default MCP_ENABLED to "no" until the feature is complete. Standardize
all boolean env var checks to accept ("yes", "true") only — drop "y".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sync main to enterprise See merge request dkinternal/testgen/dataops-testgen!422
Remove direct import of testgen_enterprise_auth from OS auth code. RBAC is now discovered through the plugin system: plugins declare an RBACProvider subclass on their PluginSpec, and PluginHook resolves it at startup. OS default grants all permissions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 8 MCP tools: discovery (inventory, projects, suites), test runs (recent runs), test results (results, failure summary, history), reference (test type lookup) - 2 resources: test-types reference table, glossary - 4 prompts: health_check, investigate_failures, table_health, compare_runs - Model extensions: TestResult (select_results, select_failures, select_history), DataTable (new partial model for data_table_chars) - Inventory service with ORM queries and adaptive compact mode - 53 unit tests for all new modules Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Simplify MCP instructions to focus on data model and navigation. Gracefully skip plugins that fail to load in MCP context (e.g. when Streamlit v2 component registration is unavailable). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat(mcp): add MCP server foundation with JWT auth and ping tool See merge request dkinternal/testgen/dataops-testgen!414
CI and upgrade improvements See merge request dkinternal/testgen/dataops-testgen!423
PluginSpec.page (single class) replaced with PluginSpec.pages (list), allowing a plugin to register more than one Page in a single spec. Application.global_admin_paths now collects paths whose permission is 'global_admin' so the sidebar can switch into the admin context.
- Filter the project dropdown to only projects the user is a member of - Call load_user_role on every render so role reflects current project - Introduce 'global_admin' permission; sidebar enters admin-only context on global_admin pages (no project nav, AdminMenuItem items, AdminCTA) - is_global_admin prop lets non-admin users see the admin CTA in project context
Portal now appends to document.body so position:absolute is document-relative, preventing clip by positioned ancestors. Outside- click and mutual-exclusion logic moved into the component itself. Dialog wraps Portal to provide a modal overlay with a title bar and close button, used by the project settings members form.
Toggle accepts a disabled prop that greys out the input and suppresses the clickable cursor, consistent with other form components. notIn validator rejects values found in a provided list, with an optional formatter and custom error message — used for unique-name validation on the project settings form.
- Table: use .val when reading dataColumns.length for colspan so it reacts to state updates rather than capturing the initial value - Streamlit: add disableV2() to clean up v2 state on component teardown - data_catalog: import DISABLED_ACTION_TEXT from display_utils - utils.js: improve JSDoc type for getValue()
Misc QA fixes + doc updates See merge request dkinternal/testgen/dataops-testgen!446
COUNT(DISTINCT col) on timestamp columns counts unique timestamps, not unique dates, producing negative measures (e.g., -1575 instead of 240). Add CAST(col AS DATE) for 7 flavors that were missing date truncation: postgresql, snowflake, databricks, redshift, redshift_spectrum, mssql, trino. BigQuery, Oracle, and SAP HANA already truncated correctly. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…atabricks) date_bounds CTE used raw MIN/MAX without CAST, so SEQUENCE generated timestamps that never matched the date-typed existing_periods — all dates appeared missing for timestamp columns. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…erprise' fix(TG-1005): Daily_Record_Ct date truncation + CI fix + timestamp test coverage See merge request dkinternal/testgen/dataops-testgen!443
fix(ui): portals were closing when a nested portal opened See merge request dkinternal/testgen/dataops-testgen!447
QA fixes See merge request dkinternal/testgen/dataops-testgen!448
QA fixes + docs changes See merge request dkinternal/testgen/dataops-testgen!449
datakitchen-devops
approved these changes
Mar 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Features
Bug Fixes
Refactors
Miscellaneous