Spaces:
Running
Running
Commit History
23 days ago
-
Merge remote-tracking branch 'hf-test/main' into claude/custom-mcp-spotter-demo-125da8
8aebc9f -
feat(demo-pack): custom MCP demo section (GitHub issues → Spotter)
After every successful run the Demo Pack now carries a "Custom MCP Demo" section: suggested repo name, 4 LLM-generated GitHub issues grounded in the deployed model's real column names, the fine-grained token recipe, the Spotter connector settings, the two Spotter prompts, and the cleanup reminder. The SE creates the repo and pastes the issues; DemoPrep holds no GitHub token. - prompts.py: new `custom_mcp_issues` stage (JSON array of issues) - chat_interface.py: custom_mcp_repo_name(), parse_custom_mcp_issues(), render_custom_mcp_demo_section(); controller methods _extract_ddl_columns(), _generate_custom_mcp_issues(), _build_custom_mcp_section(); wired into the Demo Pack block - Side fix: the Spotter Viz story's inline DDL column dedupe always returned [] (`not (seen.add(c) or c in seen)`), so stories never saw real column names. Both generators now share _extract_ddl_columns(). - tests/test_custom_mcp_demo_pack.py: 32 unit tests; one live LLM round trip verified separately…fc2b1f9
-
admin settings: SHARE_WITH is now a real key (save/load silently dropped it — App-tab builds shared with nobody)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> (cherry picked from commit 493663f4098c0822ba70d4ad3d770be66b1783e7)3b90e27 -
share: SHARE_WITH / MCP_SHARE_WITH accept a comma-separated list of users and groups
One principal per build left 13 of 43 boards un-exportable by the reviewing account (grader report 2026-09-21). Both paths pass the setting through as a string, so a comma list in the admin setting or the Space secret is now enough. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> (cherry picked from commit 196a7b73f83d78e076ad262b42faf277137dbd01)4117ee0
-
Deploy feature/golden-demo-v3 (2b65dd2826ea97ea4be1a6eb8984b9396d95af83) to the test app Space as one commit
Squashed onto hf-test/main because HF's pre-receive hook rejects binary blobs anywhere in pushed history, and the feature branch's history carries two PNGs (stripped from its tree in 2b65dd2826ea97ea4be1a6eb8984b9396d95af83). This commit's tree == the feature branch tree. Contents: golden demo v3 — 4-KPI standard w/ sparklines, state GEO_AREA, three tabs (Showcase = Muze + GRID_TABLE + heatmap + Demo Guide), blank-tile repair, humanized titles fix, grain enforcement, lab live-verification. See sprint_2026_04.md and dev_notes/DECISIONS_for_boone_2026_09_02.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>f7377ae
-
fix(logging): harden PromptLogger against unwritable log dir
Backport of the prompt_logger.py half of 4b87c36 (cherry-picked from deploy/mcp) onto the branch that feeds hf-test. 4b87c36 fixed a prod MCP outage: PromptLogger.__init__ did an unguarded mkdir on <script_dir>/logs/prompts. HF Spaces run the container as a non-root user inside a root-owned WORKDIR and logs/ is gitignored, so it raised PermissionError: '/app/logs' and failed every MCP build. prompt_logger.py is SHARED code, so the app Spaces carried the same latent bug — it just never fired there because only the MCP path constructed a PromptLogger. This closes that gap: the log dir is resolved (module dir -> temp -> memory-only) and every read/write degrades instead of raising. The mcp_server.py half of 4b87c36 is deliberately NOT taken. It guards the run-logger block added by 47edf58, which does not exist on this branch; pulling it in would import an unrelated feature through a conflict resolution. That guard stays on deploy/mcp where the code it protects lives. Regression covera…767a6ca -
test(qa): overnight quality results, MCP brief replay harness, data-quality sprint tasks
- tests/mcp_brief_replay.py: replays captured mcp_intake briefs through the real MCP server (stdio or http), re-owned to the operator, incremental reports — used for the 8/25-26 Yodeck/Triumph/Tixr runs - quality_results: 8/25 test-space runs (smoke 83.5/B, full 8-board 80.9/B) + MCP replay report (3/3 PASS on unfixed code) + backfilled 8/07-8/10 runs - sprint doc: Data Quality Push section — P0 row-count parity (fixed 8d28a8c on deploy/mcp, verified 62->78 Tixr), P0 derived-measure computation, P1 gate extensions/dense panels, P2 grader trust + 4-KPI cap + harness fixes Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>f65b079
-
Merge remote-tracking branch 'hf-test/main' into spike/portal-template
4d97c9f -
feat(logging): capture full run payload in session_logs on every run
Every run (App tab + Chat tab) now logs its complete payload to Supabase session_logs in meta.payload of the 'run started' events: - raw GO form inputs (controller._run_payload set in defined_go) - resolved company/use case/vertical/line/function/context - secret-redacted settings snapshot Attached in _create_run_loggers() (guaranteed even when a run dies before research) and again in run_research_streaming() once fully resolved. New sanitize_payload() in session_logger.py redacts key/secret/password/ token/credential/auth values and truncates >2000-char strings; 5 tests in tests/test_run_payload_logging.py. Chat-tab runs reset stale App-tab _run_source/_run_payload at initialization. Query guide in dev_notes/logging_channels.md (local docs, not tracked). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>63e8227 -
Merge remote-tracking branch 'hf-test/main' into develop
# Conflicts: # sprint_2026_04.md6bb7908 -
Merge branch 'claude/youthful-lederberg-e31760' into develop
# Conflicts: # chat_interface.pydc44f67 -
feat: post-load data-quality gate for zero/null measure columns
Profile every MEASURE column after each Snowflake load (both dataset-first and legacy paths) via INFORMATION_SCHEMA + per-table aggregates. Fail the run loudly, naming the columns, when any measure is entirely zero/null (recurring Yodeck/Triumph zero-measure defect). Mostly-zero and empty-table cases surface as warnings in the completion panel and session_logs meta. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>fa79ccd
-
feat(mcp): KEY_VAR ENV: indirection + scheme-less/port-tolerant host matching
Folds in what the Space-side hotfix (0b84b8a) had that the TS_ENV table didn't: techpartners support and robust URL parsing. KEY_VAR may now be ENV:<NAME> to dereference a secret that already exists under its own name (the techpartners key lives only as a Space secret), and ts_url may omit the scheme or carry a port. Unknown clusters still fail loud with the known-environment list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>e27ea87
-
refactor(mcp): resolve trusted-auth keys from the shared TS_ENV_<n> table
The MCP server had its own two-key mapping ('sebe' in url -> SEBE_SE_TA_KEY, else SE_PRIMARY_TA_KEY) — any third instance (e.g. the new pmm env) silently got the secloud key and failed auth. _resolve_ts_target now looks the build's ts_url host up in the same numbered TS_ENV_<n>_LABEL/URL/KEY_VAR table the app dropdown reads: one environment scheme for both entry points; unknown instances fail loud listing the known environments. TS_ENV_URL_DEFAULT keeps its no-URL fallback role. 4 unit tests. DEPLOY NOTE: before this reaches the MCP Space, add the TS_ENV_<n>_* secrets there (it currently has only the legacy key pair); legacy SEBE_SE_TA_KEY / SE_PRIMARY_TA_KEY become unused after that. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>5ce76f0
-
test(mcp): retry brief fetch on network errors + --brief-file escape hatch
Venue WiFi/proxy flaps were killing the burn-in with SSL errors before the first build even fired. Fetch now retries 5x with backoff and fails with a clear message; --brief-file runs the same brief from a local snapshot when Supabase is unreachable. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a423344
-
test(mcp): repeatability burn-in — fire the latest brief N times, report pass rate
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>9a955a5 -
fix(ddl): CHECK sanitizer no longer deletes columns named CHECKOUT_*
The chunk-level CHECK-constraint detector used prefix matching (upper.startswith("CHECK")), so any column whose name begins with CHECK — CHECKOUT_INITIATED, CHECKOUT_ATTEMPTS, CHECKOUT_CONVERSION_RATE, CHECKOUT_ABANDONMENT_RATE — was silently dropped from CREATE TABLE while the generated dataset still carried its values. The INSERT then failed on columns the table didn't have. Root cause of the "random" schema/data-mismatch build failures (Cloudscape, Atlas Freight partial, Tixr run 02ec3e7baba6) — it fired whenever the LLM blueprint author named a column CHECKOUT_*, which checkout-funnel briefs (Tixr) invite. Detector now requires the CHECK keyword followed by a parenthesized expression, and the CONSTRAINT branch uses a word-boundary match so an FK named CHECKOUT_FK survives. Inline CHECK removal already used \bCHECK\b and was safe. 4 regression tests added. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>e32850b -
fix(e2e): remove remaining hardcoded DEMOBUILD refs in test harnesses
Follow-up to the rotating-demo-database change: the data-grading fallback, geo-scope check, and settings_test row check still pointed at DEMOBUILD. All now derive the database from the model TML (via check_snowflake_schema's new database field) or get_demo_database(). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a22a600 -
fix(e2e): resolve Snowflake database from model TML in schema check
check_snowflake_schema hardcoded DEMOBUILD; demos now live in the rotating <base>_<YYYY_MM> database, so the check reported "Object does not exist" on runs that succeeded. The database now comes from the same model-TML resolution that supplies the schema (with get_demo_database() as the session-log path's source), and the check refuses to guess when neither is available. Verified against live run ed0dfa99: DEMOBUILD_2026_08.TST_TRE_08102144_P6D_sch, 10,037 rows / 7 tables found. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>80facca -
perf(deploy): scope TS connection to demo DB + monthly-rotating database (250s -> <1s table imports)
Root cause of the ~250s-per-call table TML imports (found 2026-08-10, corrects the July "server-side, not reducible" conclusion): ThoughtSpot table import scans all external metadata VISIBLE TO THE CONNECTION. Our connections had no database property, so every import scanned ~507 Snowflake DBs. Measured on the same instance with the same trivial table: unscoped 246s, scoped to DEMOBUILD (1,003 schemas of demo debris) 33s, scoped to a fresh tiny DB 0.7s. Prod secloud showed identical ~250s unscoped — never instance-specific. - thoughtspot_deployer: create_connection_tml/create_connection_with_reconcile now REQUIRE a database and emit a `database` property in the connection TML. - snowflake_auth: get_demo_database() -> <SNOWFLAKE_DATABASE>_<YYYY_MM> (memoized per process); ensure_demo_database() creates it on connect. Session params + cdw_connector + env injection (supabase_client) all use the rotated DB so write and deploy paths agree. Admin setting stays the base name. - chat_…21ee86d
-
guard: catch CREATE/INSERT column mismatches before and during Snowflake load
The Gap e2e failure: FACT_CAMPAIGN_PERFORMANCE's row loader referenced CHECKOUT_INITIATED, a column CREATE TABLE never declared -> Snowflake "invalid identifier", ~10 minutes into the run, no indication of which table/column. Root mechanism wasn't pinned with certainty (DDL and the loader both derive columns from the same DatasetBundle object, so they can't diverge in the code as read) — these guards catch the failure class immediately and name the exact column, regardless of cause. - validator.py: _check_schema_consistency() — in-memory, at validate_bundle() time. Flags (a) two column names that collide after SQL-identifier normalization (duplicate column in CREATE TABLE), and (b) a generated row carrying a key no declared column covers (INSERT would reference an identifier CREATE TABLE never defined). Runs before any DDL is derived or Snowflake is touched. - dataset_writer.py: _verify_table_columns() — right before each table's INSERT, DESCRIBE TABLE and diff against th…2cc63cd -
chore: check in async-TML-import investigation (repro/perf harness + handoff docs)
- tests/ts_import_sync_vs_async.py, ts_slow_import_repro.py, ts_table_perf.py: repro/perf harness behind the async TML import fix - tests/perf_results/: captured sync-vs-async timings - docs/async_tml_import_handoff.md, sre_slow_tml_import.md: investigation + SRE handoff notes Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>72b93af -
merge: unify MCP (async TML import + concurrency + mcp_server) into integration
- keep app README frontmatter (gradio) on trunk; MCP docker frontmatter stays on hf-mcp-deploy - build_demo.py: blueprint LLM cap/timeout reconciled to 16384 / 300s (superset of both sides) - adds mcp_server.py, tests/e2e_mcp.py, MCP deps; async-only TML import pathc3e3f8b -
merge: liveboard-quality into integration/mcp-lb
ee1ce2a -
liveboard quality: fix flat-72 defects + Tixr-style layout
Reshape the MCP + enhance golden layout to fix the 5 structural grader defects and adopt the SE's Tixr Executive Analytics template. golden_layout.py: - note tile: full company name (was single-letter "N"/"L"), deduped; dropped by default (keep_overview_note flag) so the KPI row leads - colors: color ADVANCED_* charts by dimension via custom_chart_config "slice-with-color" (real per-category colors + legends; was all-blue, since seriesColors/chartLevelColorConfig don't drive the new engine) - per-tile tile_brand_color cycling + tile_kpi_color on KPIs - force CHART_MODE where a chart renders as a data grid - clean raw display names (Dim / Usd / Pct / doubled words) - trend detection: time-only series -> dedicated Performance Trends - geo: GEO_* -> its own full-width row right under the KPI row - asymmetric group sizing (5/4/3, 7/5) + Tixr styling (kpi L font, hidden group descriptions) liveboard_creator.py / thoughtspot_deployer.py: thread logo_url/url into build_dashboard_pla…f7f2b52 -
chore: README, e2e grader, share-permission fix, sprint + quality results
- README: chat_interface.py is the full app (App tab primary), app.py entry point; updated structure/config - tests/e2e_quality.py: date-aware grader, COMPLETENESS rubric rewrite, --ts-environment override, hard-fail on missing dropdown label - thoughtspot_deployer.py: share-permission 400 fix — notify_on_share=false + empty message to satisfy the GraphQL $message contract - sprint_2026_04.md: progress updates - tests/quality_results: run artifacts incl. 2026-07-28 82.9/B run Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>fcde472
-
fix(test): make e2e_mcp resilient to transient network blips
A single httpx.ConnectTimeout on one status() poll (hf.space dropped a TLS connect ~3 min into a run) crashed the whole harness. Over a ~1h run doing hundreds of network polls, transient blips are expected. call() now retries (4x, 3s backoff) around any transient exception, and the fire/poll sites in run() tolerate an exhausted call — a failed poll skips the cycle (builds keep running server-side; results persist in recent_builds) instead of ending the run. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>095d53e -
test(mcp): e2e_mcp harness — drive N live MCP builds end-to-end and grade each
Replaces the local-pipeline e2e for the MCP path. Fires build_demo_from_brief for each of 8 rich briefs against the live server, respects the server's bounded concurrency (fires until 'busy', backs off, refills as slots free), polls status(), collects each result by run_id from recent_builds, and grades PASS/FAIL (success + liveboard produced + no 13122). Two briefs deliberately exercise the connectivity guard: "Summit Mutual" (two subject areas -> keep primary star, set aside the other) and "GridLink" (time-series heavy -> orphan date dim dropped). Writes a JSON report to tests/quality_results/ and exits non-zero if any build fails. Run: python tests/e2e_mcp.py [--limit N]. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>8abca30
-
Wire single blueprint pipeline; fix engine formula fidelity + insight direction
Replace the keyword-router generation path with one build_demo() pipeline: research -> LLM-authored DemoBlueprint -> deterministic BlueprintEngine -> validation -> derived DDL. No mode flag, no fallback. Engine fixes: - Compute derived measures from formatted (stored) base values so rows satisfy their formulas under the validator's re-check (no formula errors). - Never clamp derived values; a negative margin/inventory stays faithful. - Sign-aware sensitivity analysis maps an insight on a derived measure to the base that moves the metric the promised direction (ratios no longer invert; products scale by magnitude, not magnitude squared). Adds preflight + blueprint + McKesson regression tests and migration docs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>3993fe3
-
Improve backup liveboard path logging
mike boone5f0f576
-
Honor explicit custom dataset contracts
mike boonea6d4bca -
fix: retry transient ThoughtSpot auth failures
mike boone4489319 -
fix: accept undefined liveboard answers with tokens
mike boone30e135b
-
fix: reconcile ThoughtSpot connection creation
mike boone34f7221
-
fix: accept valid undefined ThoughtSpot answer tokens
mike boone70a4175 -
fix: detect invalid answer readiness before MCP liveboards
mike booned3049d4 -
fix: recover tables from connection details
mike boone25fbe18 -
fix: validate recovered ThoughtSpot tables by connection
mike boonede46562 -
fix: recover table creates via connection-scoped search
mike boone0acfbde -
fix: normalize ThoughtSpot TML import object responses
mike boonee343cfd -
fix: harden ThoughtSpot table polling and model readiness
mike boone7aff9ba
-
fix: verify ThoughtSpot TML imports after 504
mike boonec04c93f -
fix: classify ad monetization before contract gate
mike boone3a16eea -
feat: add ad monetization dataset scenario
mike boonecfcdfcd -
Merge remote-tracking branch 'origin/develop' into develop
mike boone8997cc3 -
test: harden e2e quality diagnostics
mike boone8e5d114 -
Merge remote-tracking branch 'hf-test/main' into develop
mike boone# Conflicts: # thoughtspot_deployer.pydb6ab4f -
fix: harden dataset and ThoughtSpot deployment recovery
mike booneb210533 -
merge: reconcile test branch before Baker Chart deploy
mike boone20bd973 -
feat: add post-merger integration dataset generator
mike boone5ddc387