Spaces:
Running
Running
Commit History
2 days ago
-
Merge branch 'claude/dashboard-migration-tse-5669ab' into deploy/mcp Running
0f64d64 -
fix(migrator): declare defusedxml for the Space image; agent doc names the test-Space connector
inspect_dashboard on the test Space returned "No module named 'defusedxml'": the parser's XML library was only present locally as a transitive dependency of notebook tooling and was never in requirements.txt, which is what the Dockerfile installs. Pinned to the version the tests run on. docs: DP Migrator is a dedicated AgentSpot agent wired to the TEST MCP Space (prod does not have the tools yet); sprint ISS-31 records the 2026-11-09 diagnosis and the release options. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>fd1dba7
8 days ago
-
merge: test Space tip 2093856e2b into develop (pushed to the Space directly)
58f67a3 -
feat(tracker): a "cancelled" task status, closed like "done" without claiming the work was done
- schema.sql: the status check constraint is replaced (drop if exists, add) so the file stays re-runnable; the open-tasks partial index and the task_board stale flag exclude both closed statuses. - store.py: CLOSED = ("done", "cancelled"); update_task sets closed_at for either and clears it on reopen; list_tasks and open_task_by_source hide both unless include_done or the status is asked for by name. - Liveboard TML: every query that excluded done now excludes cancelled too; the model's Status description lists it. - Tool docstrings and the agent write-up (a CANCEL step beside CLOSE). - Tests: cancelled closes, hides, never goes stale, reopens; a cancelled automatic task no longer blocks a new one; the schema says what the code says. The fake client gains supabase-py's `not_` negation. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>c1d7132
13 days ago
-
feat(migrator): DP Migrator beta — rebuild a prospect's Tableau dashboard (or a picture of it) as the demo
Ketan's "built-in legacy migrator" and Nick's ask (2026-10-28): the SE sends the prospect's website plus a .twb/.twbx or a dashboard screenshot; the demo's data speaks the dashboard's measure and dimension names and the liveboard copies its sheets (chart types, titles, arrangement; a dual axis as a combo chart) instead of the golden layout. DP Web unchanged. - demoprep_app/migration/: MirrorSpec contract, source-grammar -> ThoughtSpot chart-type mapping, deterministic Tableau .twb parser (defusedxml; paths, hosts and users stripped; blends, relationships, parameters, table calcs and LOD noted), one-vision-call picture reader, the blueprint statement that binds the vocabulary, one liveboard question per sheet in the model's column names, and the argument loader (.twbx -> its .twb only; the payload log keeps kind, size and hash, never content). - liveboards/mirror_layout.py + enhance_mcp_liveboard(layout_strategy="mirror"): retype/retitle from the source before classificat…2093856
14 days ago
-
Merge feature/brand-from-homepage into the test line (ISS-30: browser-default link colours are not brand colours)
8528a7c -
merge: hotfix/dp-web-visible-text into the test line
DP Web visible-text hotfix 2039eea (on prod since 2026-10-27) carried back so the next test -> prod release keeps it: assistant without the template FAQ, company name as given, landing copy normalised, Regular Case keeps acronyms, bundle scan. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>aeed677 -
docs(hotfix): Larry's C2FO site rebuilt in place (revision 2) and verified live
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>d3c8e02
15 days ago
-
docs(hotfix): record the 2026-10-27 prod push, ping confirmation and merge-back previews
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>404bdd2 -
fix(portal): DP Web sites read as the prospect's — name as given, neutral assistant, home copy that renders, acronyms kept
Four generator defects from the 2026-10-27 audit (276 sites, 183 boards), prod line. 1. Assistant (template-tse/src/lib/chatbot.ts): the template's Northwind sales- engagement FAQ shipped on every site renamed to the prospect ("Rhythm is C2Fo's AI engine", links to developers.c2fo.com, /pricing). Rewritten: with no LLM key, data questions go to Spotter and everything else gets one neutral line from company + use case + the real website. No *_DOCS table, no invented video or pricing paths. 2. Name (portal/builder.py, apply-spec.mjs): camel_token() ("C2FO" -> "C2Fo", "BNY Pershing" -> "BnyPershing") was written into the title, assistant name, logo label and nav on 175 sites. The spec now carries `client` = display_name(company) for everything visible and `clientIdent` = camel_token(company) for component and file names only. 3. Home page (mcp_server._landing_content): tagline/cta/string stats were passed through verbatim and rendered as nothing. Now normali…2039eea -
merge: test Space tip 877abd816c into develop (pushed to the Space directly)
3fe8cb3
20 days ago
-
fix(brand): the browser's default link colour is not a brand colour (ISS-30)
boone 2026-10-22, after a Walmart demo. walmart.com leaves its nav links unstyled, so the capture read them as #0000EE and the brand read took that as a series colour. Measured on Chromium 149: an unstyled link computes to #0000EE on a light page and #9E9EFF on a page that opts into a dark colour scheme; a visited link reports the unvisited colour to getComputedStyle, so visited purple never reaches a capture. Those two colours are now skipped in TEXT readings only (button text, h1, h2, nav link). A background or a brand custom property in that exact blue was set by the site and still counts. Verified on live captures: walmart.com now reads #0053E2 / #004F9A / #001E60 with the nav link dropped; industry.traveloregon.com is unchanged (its styled nav colour is still read). Tests: 4 new in tests/test_brand_capture.py, the Walmart fixture taken from the real capture; brand suites 136 pass; full suite 1911 pass, the same 3 pre-existing failures as the test tip. Not pushed. Co-Authored-B…a060847 -
docs(settings): dpSettingsDB agent spec; sprint entry wording after the rebase
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>0bcf580 -
feat(mcp): dpSettingsDB tools — an SE's settings read and changed in Supabase through the MCP server
boone (2026-10-22): a new AgentSpot agent, dpSettingsDB, shows and changes a Sales Engineer's DemoPrep settings in the database, with dropdown-constrained choices. AgentSpot has no database connector (60 application connectors, Snowflake the only database) and its Apps write back only to Jira, Slack and Salesforce, so the DemoPrep MCP server, already connected to Supabase and already registered in AgentSpot, is the agent's path to the settings. - demoprep_app/settings/catalog.py: the editable fields with kind, default and (for dropdowns) the exact options; keys are SETTINGS_SCHEMA storage keys, so a write is live in the App tab and in builds with nothing else in between; the dead fields (temperature, batch size, per-user snowflake, ...) are absent - demoprep_app/settings/store.py: validated, all-or-nothing read/write on user_settings (category 'defaults'); unknown keys and off-list values are refused naming the options; stale stored values are reported as problems - mcp_serv…cc072ec -
docs(settings): AgentSpot DP Settings agent document; the sender is that agent, not Agent Q
Paste-ready agent instructions, the settings document, the one tool it calls today (config_check), the phase-2 get_settings / save_settings scope, examples and connector setup. Wording in the inventory, flag registry, example document and sprint entry corrected: any caller of build_demo_from_brief passes the document; Agent Q is not the owner of it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>57c47f4 -
fix(pipeline): read pytest's quiet summary; a token without Checks reads as no checks
Both seen on the first deploy through the pipeline (2026-10-22, test-mcp = 3108c38): - `pytest -q` ends with a bare "3 failed, 2049 passed in 40s" line; the run recorded "pytest exit 1" because the parser wanted the ===== border. - The sync's first pass answered 403 on the pull request list (the token was created without the Pull requests permission: boone's to fix). A token with Pull requests but not Checks would still have failed the whole sync on the check-runs call; that now reads as "none" for that PR. Docs: the exact token permissions in docs/development_process.md; the sprint doc records the first deploy and what is left. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>4637f97 -
docs: the TSE site is DP Web — agent is the DP Web Editor; tool names stay, docstrings teach the term
boone (2026-10-22): everything is branded DP; the site formerly called the portal / TSE site is DP Web. The MCP tool identifiers (build_portal, describe_portal, update_portal, list_portals) are live on production and in use, so they stay as code; the agent instructions and tool docstrings say that a portal is a DP Web site. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>9b0fd1e -
feat(liveboard): describe_liveboard / update_liveboard / undo_liveboard_change — remove or rename tiles by TML
The Portal Editor agent correctly refused to remove a KPI because the KPI lives in the liveboard, not the site. boone: "we can just edit the TML" — which every build already does. These tools do exactly that, as the board's owner, with the rules boone set on 2026-10-22: a title that matches two tiles is a conflict the agent asks about, never a guess; a row that lost a tile is re-packed; v1 is remove and rename, move comes later. - demoprep_app/liveboards/edit.py: pure functions over the TML dict. describe (tiles by tab, kind, group), find by id or exact title, remove via the existing remove_visualizations_from_liveboard_tml plus re-pack (survivors shift left and widen when the row divides the 12-wide grid; emptied rows close up; a group that lost its last tile loses its frame, which the helper left dangling), rename. Every reference is resolved before anything is applied, so a partly wrong request leaves the board as it was. - mcp_server.py: the three tools. Target from a …23c6a10
21 days ago
-
docs(research): ThoughtSpot MCP landscape Oct 2026 — SpotterCode, SpotterViz dashboard tools (verified live), model builder, Spotter Analyst APIs
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>b98196e -
docs: portal update tools are on prod via the 20 Oct release; the existing connector exposes them
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>3c321f0
20 days ago
-
merge: test Space tip 0d02061 (settings document, Data Adjuster LLM fix) into the pipeline fix branch
Both were pushed straight to the test Space by other sessions after develop was reset to b918bd8, so develop lacked them and the pickup run's Space push would have been refused. The run refused to merge them itself because both sides had appended to sprint_2026_04.md; resolved here by keeping both sections and one trailer. Once this branch is in develop, the Space push is a fast-forward. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>545c9c5 -
feat(mcp): settings document on build_demo_from_brief replaces per-run Supabase settings reads
A separate TSE app owns an SE's DemoPrep settings and Agent Q hands them to the build as one JSON document (schema 1.0, the `settings` keyword argument). When present, the build takes model, data size, column naming style, object prefix, liveboard name, tag, share-with and geo scope from it and reads nothing from the SE's Supabase settings: the controller skips its startup read and the three mid-run re-reads are guarded. Explicit owner_email / ts_url still win; a blank ts_url falls back to the document's URL, then its environment label through the TS_ENV table. A bad document is refused before a slot is taken, naming the key. - demoprep_app/settings/payload.py: the one parser and apply step (the data-size presets live here now) - chat_interface: ChatDemoInterface(settings_from_supabase=...), _settings_source - run record carries settings_source and settings_schema_version - docs: settings inventory with decisions and the phase-2 Supabase scope, the example document, the brief for …0d02061 -
Merge remote-tracking branch 'hf-mcp-test/main' into feature/tracker
122171d -
feat(pipeline): the pickup run, the agent worker, and the process they implement
Every change on a branch off develop, a PR in, approved on arrival for Mike and Jack and by one of them for everyone else, picked up four times a day and pushed to the test Space. Everything that writes to GitHub or Hugging Face runs on boone's Mac under his own credentials; the server only reads. - scripts/pipeline_run.py: queue -> merges in its own pipeline/ worktree (detached, --no-ff, a conflict skips with a note) -> unit suite with the known-failures allowlist -> push origin -> three-minute idle gate on the Space -> push hf-mcp-test -> ping confirms the sha -> deployments row and "on test-mcp" notes. Never prod, never a red suite, never a non-fast- forward. --dry-run reports against the real tracker. - scripts/launchd/com.demoprep.pipeline.plist: 7:30 / 11:30 / 15:30 / 19:30 local time. scripts/pipeline_known_failures.txt: the pre-existing failures. - scripts/agent_worker.sh + agent_worker_prompt.md + tracker_cli.py: the agent's turn — top task, agent/t<id>-<slug> o…62f3e9a
21 days ago
-
docs(sprint): ISS-30 branding on prod as d6ebaa0 (2026-10-21)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>59e1421 -
Merge release/test-homepage-2026-10-21 into test line
5073d4e -
feat(mcp): check_homepage tool — can DemoPrep get the prospect's home page by itself?
Agent Q calls it before build_demo_from_brief. It runs the build's own home-page step (sources.capture_home_page, no screenshot): the live page with capture.py's rules, then only when blocked the Internet Archive copy with the same lookup and blank-page check. No generation step. Returns ok / source (live | wayback (YYYY-MM-DD) | none) / needs_screenshot / reason / message_for_se; needs_screenshot only when neither works, and a bad URL is ok:false with a reason. Never raises. - async tool, work in a thread: does not block the event loop, takes no build slot nor the clone runner's Chromium slots (own limit of 2) - bounded at 45 s; an overrun says so and asks for a screenshot - a usable capture is kept 30 min and a build of the same URL reuses a copy of it (recall_capture) instead of loading the site again - no fake UA, stealth, proxies or anti-bot services: a block is reported - docs/agent_q_flags.md: tools table + change log Real checks (local Chromium): firework.com live 13.7 s,…0cf1463 -
docs: Agent Q home page — current (live → Wayback → template) and v2 (check_homepage first, ask for a screenshot)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>f01cb89 -
feat(portal): home page from the SE's screenshot, Internet Archive fallback
On 2026-10-21 all three real builds on test (shoppersdrugmart.ca, nationsbenefits.com, stanleyblackanddecker.com) hit an HTTP 403 bot wall and every portal opened on the template login. New input `homepage_screenshot` (https image URL or base64 data URI; png/jpeg/webp, <=10 MB) on build_demo_from_brief, build_portal and update_portal, declared as a real tool parameter and documented for Agent Q. login_clone/sources.py::capture_home_page picks the picture of the page: 1. the screenshot: sliced into 1440x900 screens, colours read from pixels (feed the generator's brand block and ISS-30), no logo 2. the live site, as before 3. only when that is blocked: the Internet Archive (public availability API, else the public CDX index), `if_` form so no toolbar; the newest copy, then one older copy of real size 4. the template login, with every reason: "site blocked (HTTP 403), no screenshot sent, no archived copy" home_page.source = screenshot | live | wayback (YYYY-M…17c9782 -
docs(sprint): ISS-30 brand-from-homepage goes to test on boone's word
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>d6ebaa0
22 days ago
-
feat(mcp): read the brand off the prospect's home page and colour the demo with it (ISS-30)
boone 2026-10-20: "take a brand palette and build that off the home page, then change the colors on our charts to match that branding." Defaults he approved: derive only when apply_brand_theme is true; what Jack's agent sends wins; a failed or neutral capture means today's palette plus a warning; category-coloured Muze tiles and the LBC/GBC/TBC slots stay as they are. brand_capture.py (new) reads a brand off the login clone's home-page capture: painted buttons first, then brand-named CSS custom properties (vendor/framework ones skipped), then header, h1, nav links, h2, footer. Neutrals never count; primary is the top rank, secondary the next colour that is distinct in RGB, hue or lightness, up to two more are extras. brand_theme.py: parse_brand_request / brand_request (off is byte for byte today's build) / complete_brand_theme (primary and secondary from the page; the page's further colours join the palette only when nothing was sent). resolve_brand_request is unchanged. A native hea…7462df9 -
Merge remote-tracking branch 'hf-mcp-test/main' into feature/tracker
683e05b -
Merge feature/header-tiles into release/test-2026-10-20
# Conflicts: # mcp_server.py # tests/test_payload_capture_is_complete.py # tests/test_payload_reaches_the_database.py016989a -
Merge claude/agentspot-tse-modifications-9b57a7 into release/test-2026-10-20
72c3837 -
Merge fix/r4-constant-formula-guard into release/test-2026-10-20
4c5d3f6 -
Merge docs/agent-q-flags-2026-10-20 into release/test-2026-10-20
# Conflicts: # sprint_2026_04.md76a3e23 -
Merge feature/schema-style-simple-default into release/test-2026-10-20
# Conflicts: # mcp_server.py0e7ee79 -
fix(mcp): schema_style simple warns and ships, never aborts (ISS-16 follow-up)
boone, 2026-10-20: - A second fact that survives the repair rounds under 'simple' is now a WARNING (schema_style_fact_count) and the blueprint ships as it is — no BlueprintAborted. Still sent back to the LLM for repair; never trimmed. - Dimension count is prompt guidance, not a rule: the simple prompt now asks for "ONE fact table plus whatever dimension tables the story needs (typically 5-7)" (the old App path's 5-7). The 4-8 dimension-count finding and SIMPLE_MIN/MAX_DIMENSIONS are removed. Unjoined dimensions are still joined to the fact automatically. - 'complex' unchanged; omitted/empty/null still means simple. Tests and docstrings updated. Unit suite: 2 failed / 1166 passed (the same two pre-existing failures as baseline 6a8d963). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>117f8f3 -
Merge release/rc-2026-10-14 into release/test-2026-10-20
# Conflicts: # liveboard_creator.py # mcp_server.py # sprint_2026_04.md # supabase_client.py # tests/test_iss22_login_precheck.py # tests/test_payload_capture_is_complete.py # tests/test_payload_reaches_the_database.py # thoughtspot_deployer.py # thoughtspot_errors.pyb868f6b -
docs: ISS-24/25 header tiles built (619d0b1) — insight tile creatable via TML (ai_tile)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>715dc26 -
feat(mcp): opt-in header tiles — logo_tile and insight_tile
build_demo_from_brief gains two flags, both OFF unless Agent Q sends them (bool | str = False, read with the portal's _as_bool). Omitted, false or blank: no header-tile work at all and the liveboard TML is byte-for-byte today's (pinned against the real enhance_mcp_liveboard run offline). Insight tile: verified on secloud 2026-10-20 that it IS TML. An exported board carries it as a visualization with an ai_tile block (target_agent insight_code_runner, template_id text_long_form, analysis_code = gzip+base64 pandas reading each source viz as <viz_guid>.csv). The narrative is written by ThoughtSpot at view time, not stored. A TML import creates it (ZZ throwaway board). DemoPrep generates the analysis from the first tab's KPIs and driver charts; the code was run against the board's real CSVs. Logo tile: a note tile in ThoughtSpot's own editor markup — the portal's logo (its brand-logo.svg, else the builder's wordmark via the new wordmark_svg) as a data: URI linked to the TSE portal, the t…619d0b1 -
docs: Agent Q flag registry, note to Jack, ISS-24..26 (insight tile, logo tile, Slack without warnings)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>be957f6 -
docs: R4 fixed — constant-by-algebra formula guard (bdd2c81); sprint entry + replay report
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>68d5936 -
docs: R6 fixed (534bff7); test-mcp state as of 14:21 ET
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>e429fd8 -
docs: replay results for the findings triage — 39 warnings to 8 on test-mcp
Four Oct 12-16 briefs replayed through the test Space (Turtle, Humpty Dump, Fortegra, Frontline; Verizon's intake has no ts_url). bound_not_inferable 25 -> 0, pile-ups/clamps 6 -> 0. Residuals R1-R3 fixed (d03253b, 1c5f261, 825f5aa), R4 (constant-by-algebra formula) open, R6 (insight_promise_capped severity) a recommendation for boone. Sprint entry updated. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>1d6672d -
feat(tracker): team tasks beside their pull requests — Supabase store, six MCP tools, GitHub sync, ThoughtSpot TML
The team (Mike, Jack, Manny, Gora) had pull requests in GitHub and nothing else: sprint notes in markdown, "ping Jack" by hand in Slack. This adds a task list in Supabase that the AgentSpot "Task Manager" agent, the Slack bot and any Claude Code session reach through the same MCP tools, with the PRs synced in beside the tasks and a ThoughtSpot Liveboard over the same rows. - demoprep_app/tracker/schema.sql: tasks, task_notes, pull_requests, tracker_people (seeded), the task_board view (PR state, days open, last note, stale), an updated_at trigger, the tracker_reader role for ThoughtSpot. Run once in the Supabase SQL editor; not run yet. - demoprep_app/tracker/store.py: list / get / create / update / add_note. An unknown person is refused, never guessed. A partly wrong request is wholly refused with every problem named and nothing written. Every reassignment, status, priority and PR link writes a note saying who. - demoprep_app/tracker/github_sync.py: daemon poller over TRA…50cb4f4 -
docs(sprint): findings triage Waves 1-3 entry; plan doc with status section
The plan (dev_notes/PLAN_findings_triage_2026_10_15.md on the parent session's plan/findings-triage-2026-10 branch) is copied under docs/ — this line keeps its documents there — with section 7 "Status" appended to both copies. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>4f0378f
28 days ago
-
fix(mcp): ISS-22 login precheck before a build takes a slot
A user with no ThoughtSpot account on the target cluster (Patrick Case, Kris Lefebvre, James Ward) or a cluster in standby (sebe, 2026-10-06) cost 2-4 minutes of data generation and a Snowflake load (orphan schema), then failed at login as "ThoughtSpot authentication failed" - for standby, behind a JSON parse error. build_demo_from_brief now makes ONE trusted-auth token request for the owner (same body/headers/username as the deployer's own login, (3, 7) s timeout) after resolving target and owner and before taking a build slot: - no account / other ThoughtSpot 400-401-403 / standby page -> failed at once with the real reason; intake + result rows still written (run_id) - timeout, connection error, 429, 5xx, unrecognised answer -> build goes ahead, outcome logged The outcome (login_precheck) rides on the intake and result rows. The deployer's authenticate_trusted() names a non-JSON 200 (standby page, or "non-JSON response, content-type X") instead of the parse error and no longer…30d7d85
22 days ago
-
docs(release): 2026-10-20 — everything that could go to prod (test c0c09a2 vs prod d139d21, the 10-14 RC, other branches) + test plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>97b9873 -
docs(agentspot): Portal Editor agent name and description beside its instructions
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>8a241e0