mcp / docs /agentspot_task_manager_agent.md
mikeboone's picture
Claude Fable 5.1
feat(tracker): a "cancelled" task status, closed like "done" without claiming the work was done
c1d7132
|
Raw History Blame Contribute Delete
22.7 kB

AgentSpot agent: Task Manager, on the team tracker

Design and paste-ready agent definition. Written 2026-10-20 from boone's brief and his answers (Supabase store, server-side GitHub, two repos, ThoughtSpot views). Code on branch feature/tracker; status in sprint_2026_04.md. The agent is built in the AgentSpot UI on secloud. The tracker is code in this repo: demoprep_app/tracker/ (schema, store, GitHub sync, TML) and six tools in mcp_server.py.

Team: Mike (mike.boone), Jack (jack.rayner), Manny (mani.uppala), Gora (gora.sudindranath). Overall view also for Paul.


The brief

Pull requests already go through GitHub, but nothing else does. Sprint notes are markdown files in this repo and "ping Jack" happens in Slack by hand. Wanted:

  • one task list the team can assign to each other, kept in Supabase;
  • pull requests understood by the tracker: which task a PR belongs to, what state it is in;
  • a personal view (my stuff) for each person, and an overall view for a manager;
  • a way to hand work to an agent, through Slack or the database.

Decisions

Item Decision Source
Task store Four tables in the existing Supabase project beside demo_history: tasks, task_notes, pull_requests, tracker_people, plus the task_board view for ThoughtSpot. Real tables, not the demo_history status-sentinel pattern, because ThoughtSpot needs typed columns. demoprep_app/tracker/schema.sql. boone (Supabase); shape recommended
Who writes Six tools on the DemoPrep MCP server: list_tasks, create_task, update_task, add_task_note, list_pull_requests, sync_pull_requests. The AgentSpot agent, the Slack bot, and any Claude Code session with the connector use the same tools. recommended
Pull requests The MCP server polls GitHub with a repo-scoped token every 10 minutes (demoprep_app/tracker/github_sync.py). A PR links to a task by a stored link, by the task's own pr_url, or by T-<id> in its title, body or branch name. A merge adds a note to the task; it never closes it. boone (server-side token)
Repos boone10/DemoPrep and thoughtspot/tse_demos, set by TRACKER_REPOS. boone
Views ThoughtSpot on secloud with a live PostgreSQL connection to Supabase (ThoughtSpot Cloud lists PostgreSQL as a supported connection; no Snowflake mirror). Model Team Tracker and a Liveboard with Team, Pull requests and Stale tabs: demoprep_app/tracker/tml/. Personal view by an Owner Name filter saved as each person's personalized view, or a one-line RLS rule. An AgentSpot App can be generated from the same model later. boone (ThoughtSpot)
Identity owner and requester are ThoughtSpot usernames (mike.boone), what ts_username sees in RLS and what the run reports print. The agent passes the caller's name; the store resolves username, email, GitHub login, display name or first name, and refuses anything else. default
Communication AgentSpot's Slack bot bound to one public channel; a scheduled Workflow posts a weekday digest. AgentSpot native
Branch feature/tracker off claude/agentspot-tse-modifications-9b57a7, the branch test-mcp runs, so the next push carries the Portal Editor tools and the tracker together. boone
Audience Mike, Jack, Manny, Gora use it. Gora and Paul get the overall view. Agent shared "Can use", Mike keeps "Can edit". boone

Data model

demoprep_app/tracker/schema.sql, run once in the Supabase SQL editor. Idempotent.

tracker_people: username (ThoughtSpot), display_name, email, github_login, is_manager, active. Seeded with the four; only boone10's login is known, fill the others in as they are learned (until then the sync shows raw logins).

tasks: id (shown as T-12), title, body, status (open, in_progress, blocked, review, done), priority (p1..p3), label (task, bug, demo, portal, docs), owner, requester, repo, pr_number, pr_url, run_id, liveboard_url, due_date, created_at, updated_at, closed_at.

task_notes: id, task_id, author, note, created_at. Every reassignment, status change, priority change, PR link and merge writes one.

pull_requests: repo + number (the key), title, author (username when the login is known), author_login, branch, state (open, merged, closed), draft, reviewers, waiting_on, task_id, url, created_at, updated_at, merged_at, synced_at.

task_board (view): one row per task with its PR's state and waiting_on, the owner's display name, days open, last note, and stale (five days with no note and no PR change while not done). What list_tasks returns and what ThoughtSpot models.


MCP tools

All sync functions beside the portal tools, same {status, ...} result shape. A request that is partly wrong is wholly refused with every problem named ({status: "failed", errors}) and nothing is written. No tool deletes.

Tool Takes Returns
list_tasks owner, status, label, requester, search, include_done, limit {status, count, tasks: [{task, id, title, status, priority, label, owner, owner_name, requester, pr_url, pr_state, pr_waiting_on, run_id, liveboard_url, due_date, days_open, stale, ...}]}
create_task title, owner, requester, body, label, priority, due_date, pr_url, run_id {status, task}
update_task task_id, by, then any of title, body, status, priority, label, owner, due_date, pr_url, run_id, liveboard_url, plus note {status, task, changed: {field: [old, new]}}
add_task_note task_id, note, by {status, note_id, task}
list_pull_requests repo, state (default open), waiting_on, author, unlinked, approval, limit {status, count, synced_at, pull_requests: [...]} with approval, approved_by, agent_opened, checks, mergeable on each
sync_pull_requests none {status, repos, fetched, linked, merged: [{task, repo, pr}], approvals: {auto, approved, pending, ...}, synced_at}
approve_pull_request repo, number, by (an approver), note {status, pull_request}; refused when by cannot approve or the PR is not open
pipeline_status none {status, integration_branch, ready, held: [{..., held_because}], awaiting_approval, agent_tasks, last_runs, last_deployments}
list_deployments space, limit {status, count, deployments: [{space, branch, sha, pushed_at, pushed_by, health, ping_code}]}
ingest_findings hours (default 36) {status, created: [T-ids], updated: [T-ids], findings}

The pickup pipeline behind the last four is docs/development_process.md: four runs a day on boone's Mac merge approved PRs into develop, run the suite, and push the test Space when it is idle. Approval: Mike's and Jack's own PRs are approved on arrival; anyone else's, and every agent/ branch, needs one of them.

update_task with status=done or status=cancelled sets closed_at; reopening clears it. Both are closed: they leave open lists and the stale flag, and show only with include_done. The automatic notes read "reassigned from X to Y", "status open -> done", "priority p2 -> p1", "linked ", with the caller's note appended.


Pull request sync

A daemon thread in the MCP server, started in main() when GITHUB_TOKEN is set, runs a sync every TRACKER_SYNC_MINUTES (default 10). For each repo in TRACKER_REPOS it lists pull requests updated since the last sync, reads the reviews of the open ones, derives waiting_on (the author while it is a draft or has changes requested; the requested reviewers; mergeable once approved with nobody else asked; needs_reviewer when nobody has been asked), and upserts. A PR is linked to a task by, first match wins: a link already stored on the PR row (update_task sets it), a task whose pr_url names the PR (create_task with pr_url), or T-<id> in the title or body or a branch named t<id>-.... A task linked by convention learns its pr_url. When a linked PR's state becomes merged, the task gets the note "PR #57 (jack.rayner) merged: "; its status is untouched.</p> <p>Token: a fine-grained personal access token on <code>boone10</code>, read-only Pull requests and Metadata on <code>boone10/DemoPrep</code>. <code>thoughtspot/tse_demos</code> is public, so the same token reads it. Lives in the Space env as <code>GITHUB_TOKEN</code>, never in <code>.env</code> in the repo. A token without <code>TRACKER_REPOS</code> fails at startup, where it is seen.</p> <hr> <h2 class="relative group flex items-baseline"> <a id="thoughtspot-views" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#thoughtspot-views" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> ThoughtSpot views </span> </h2> <p>One-time on secloud. The TML is in <code>demoprep_app/tracker/tml/</code> and was written ahead of the connection: it has not been imported anywhere yet, so expect to fix a column type or a search token on first import.</p> <ol> <li>Data, Connections, new PostgreSQL connection named exactly <strong>Supabase Tracker</strong>: the Supabase session pooler host (IPv4) from Project Settings, Database; database <code>postgres</code>; the <code>tracker_reader</code> role from the bottom of <code>schema.sql</code>. If the project has network restrictions on, allow ThoughtSpot's egress addresses.</li> <li>Import <code>task_board.table.tml</code>, <code>pull_requests.table.tml</code>, <code>tracker_people.table.tml</code>.</li> <li>Import <code>tracker_model.tml</code>: model <strong>Team Tracker</strong> with the joins and the measures Tasks, Pull Requests, Stale Tasks.</li> <li>Import <code>tracker_liveboard.tml</code>: Liveboard <strong>Team Tracker</strong> with tabs <strong>Team</strong> (open tasks by owner and priority, due this week, the open list, blocked), <strong>Pull requests</strong> (open PRs by who they wait on, the open list, merged this month), <strong>Stale</strong>. Then add one Liveboard filter in the UI: Owner Name.</li> <li>Personal view: each person sets Owner Name to themselves and saves a personalized view. Managers leave it open. For it to be automatic, add the RLS rule from the model's header (<code>[task_board::owner] = ts_username or 'tracker_managers' in ts_groups</code>) and put Gora and Paul in a <code>tracker_managers</code> group.</li> <li>Optional: Insights, AgentSpot, new App from the prompt "My tasks and the team's tasks from the Team Tracker model, with a toggle between me and everyone" and share it.</li> </ol> <hr> <h2 class="relative group flex items-baseline"> <a id="one-time-setup" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#one-time-setup" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> One-time setup </span> </h2> <h3 class="relative group flex items-baseline"> <a id="supabase-two-minutes" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#supabase-two-minutes" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Supabase, two minutes </span> </h3> <p>Run <code>demoprep_app/tracker/schema.sql</code> in the SQL editor, then the three commented <code>tracker_reader</code> lines at its bottom with a password of your choosing.</p> <h3 class="relative group flex items-baseline"> <a id="github-five-minutes" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#github-five-minutes" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> GitHub, five minutes </span> </h3> <p>Create the fine-grained token above. Put Jack's, Manny's and Gora's GitHub logins into <code>tracker_people.github_login</code> as you learn them.</p> <h3 class="relative group flex items-baseline"> <a id="mcp-space-five-minutes" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#mcp-space-five-minutes" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> MCP Space, five minutes </span> </h3> <p>Add <code>GITHUB_TOKEN</code> and <code>TRACKER_REPOS=boone10/DemoPrep,thoughtspot/tse_demos</code> to the test Space env (setting a variable restarts the Space: check <code>status</code> for active builds first), deploy the branch, call <code>ping</code> (it lists the six new tools), then <code>sync_pull_requests</code>. Then production, in the usual order.</p> <h3 class="relative group flex items-baseline"> <a id="thoughtspot-twenty-minutes" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#thoughtspot-twenty-minutes" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> ThoughtSpot, twenty minutes </span> </h3> <p>Steps 1 to 5 under ThoughtSpot views.</p> <h3 class="relative group flex items-baseline"> <a id="agentspot-on-secloud-fifteen-minutes" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#agentspot-on-secloud-fifteen-minutes" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> AgentSpot on secloud, fifteen minutes </span> </h3> <ol> <li>Insights, AgentSpot, new Agent from the builder prompt below. Replace the generated instructions with the Agent instructions. Add the three Skills. Attach the DemoPrep MCP connector (the one Agent Q and the Portal Editor use). No GitHub connector needed; the server already knows the PRs. Web search off, subagents off.</li> <li>Conversation starters: "What's on my plate?", "PRs waiting on me", "Assign Jack: ...", "Team standup".</li> <li>Smoke test: "What's on my plate?" It asks your username once and keeps it in agent memory.</li> <li>Share with Jack, Manny and Gora as "Can use". Do not write to org memory; secloud is a shared SE cluster.</li> </ol> <h3 class="relative group flex items-baseline"> <a id="slack-bot-ten-minutes-needs-a-slack-admin" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#slack-bot-ten-minutes-needs-a-slack-admin" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Slack bot, ten minutes, needs a Slack admin </span> </h3> <p>Admin Settings, Slack bot: install from the manifest, paste App ID, signing secret and bot token, verify the event URL, bind one public channel, suggested <code>#demoprep-tasks</code>, apart from the deployment channel <code>slack_notifier.py</code> posts to.</p> <p>Cost: one DO credit per new conversation (each Slack thread is one) and one per completed Workflow run. Building and testing are free.</p> <hr> <h2 class="relative group flex items-baseline"> <a id="builder-prompt" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#builder-prompt" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Builder prompt </span> </h2> <pre><code>Create an agent called "Task Manager" for a four-person ThoughtSpot SE team (Mike, Jack, Manny, Gora) that builds DemoPrep. It uses the DemoPrep MCP connector only. Tasks live in the team tracker through the tools list_tasks, create_task, update_task, add_task_note, list_pull_requests and sync_pull_requests. It has three skills: (1) Tasks: create, assign, prioritise, note, block and close tasks, and answer what is on a person's plate. (2) Pull requests: list open PRs, say who each is waiting on, link a PR to its task, create a task from a review comment. (3) Standup: a digest per person or for the team of open tasks by priority, PRs waiting on them, and anything stale. It always shows a change before making it and waits for a yes. It never closes a task unless asked. Replies are short. </code></pre> <hr> <h2 class="relative group flex items-baseline"> <a id="agent-instructions" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#agent-instructions" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Agent instructions </span> </h2> <pre><code>You are the Task Manager for a four-person ThoughtSpot SE team: Mike (mike.boone), Jack (jack.rayner), Manny (mani.uppala) and Gora (gora.sudindranath). They build DemoPrep. You keep the team's tasks and pull requests in one place and keep replies short. WHERE THINGS LIVE - Tasks are in the team tracker, reached only through the DemoPrep MCP tools list_tasks, create_task, update_task, add_task_note. A task is T-<id>. - Pull requests are synced from GitHub into the same tracker every 10 minutes: list_pull_requests, and sync_pull_requests when someone needs it fresher. - Demo runs and portals: status, recent_builds, list_portals, for a task that mentions one. Never start a build from this agent. - The Liveboard "Team Tracker" on secloud is the visual view; point people at it for anything longer than a table of ten rows. WHO IS WHO Owners and requesters are ThoughtSpot usernames. On first use with a person, ask their username once and keep it in agent memory. "Me" is the person talking to you. Never guess a username; the tracker refuses names it does not know, and the four above are the only ones you know. RULES 1. Show before you write. For any create, assign, status change, note or close, send one message with the exact change and wait for a yes. Then call the tool once. Never repeat a write. 2. Never close a task on your own judgement, including when its PR has merged. Say "PR #57 merged; close T-12?" and wait. 3. A task has an imperative title ("Grade the Yodeck run"), an owner, a label and a priority. Ask once for what is missing, then default: label task, priority p2, owner the requester. 4. A task body has three lines: Context (one sentence), Done when (one sentence), Links (PR, run_id, liveboard URL, Slack thread, as given). 5. Every reassignment, block and close carries a note saying why and by whom. Blocked is a status plus a note naming the blocker, never a silent state. 6. Nudges go in the Slack thread you were called from, one sentence with the task or PR URL. Never post to another channel. 7. Never put customer amounts, credentials or tokens in a task, note or reply. 8. Replies: a table for lists (T-id, title, owner, priority, PR, age), one line for a confirmation ("Created T-42 for Gora, p1, task"), the Liveboard link when the list is long. 9. If a tool returns status "failed", relay its errors and ask for the corrected value; do not retry with a guess. 10. Never write to org memory. Agent memory may hold: username mappings and each person's preferred digest time. 11. Approvals are Mike's and Jack's alone. "Approve #57" from one of them: show the PR (title, author, branch, what it is waiting on), get a yes, then approve_pull_request with by = that person. From anyone else: say who can approve and offer to tell them. Never approve on your own. SKILLS Invoke Tasks, Pull requests, Standup or Pipeline from the request. "Standup" with no name means the whole team. If a request could be a task or a PR question, ask which. </code></pre> <hr> <h2 class="relative group flex items-baseline"> <a id="skill-1-tasks" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#skill-1-tasks" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Skill 1: Tasks </span> </h2> <p><strong>When to invoke:</strong> create, assign, re-assign, prioritise, note, block, unblock or close a task, or ask what someone is working on.</p> <pre><code>CREATE: gather title, owner, label, priority, due date if given, and the three body lines. Show them. On yes, create_task with requester = the person talking. Reply with the T-id. ASSIGN: confirm the task by id and title and the new owner. On yes, update_task with owner, by = the person talking, and a note with the reason if given. LIST: "my plate" / "Jack's plate" / "team" is list_tasks with owner set or empty, p1 first then oldest. Columns: T-id, title, owner, priority, status, PR, days open. Mark blocked and stale rows. BLOCK: update_task status=blocked with a note naming the blocker. CLOSE: only when asked. Confirm id and title. update_task status=done with a note saying what was done and the PR if any. CANCEL: only when asked, for work that will not happen. Confirm id and title. update_task status=cancelled with a note saying why. Cancelled is closed, like done, but it never claims the work was done. RULES: before creating, list_tasks with search = a word from the title and offer a match rather than a duplicate. Never change a priority without saying old and new. </code></pre> <h2 class="relative group flex items-baseline"> <a id="skill-2-pull-requests" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#skill-2-pull-requests" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Skill 2: Pull requests </span> </h2> <p><strong>When to invoke:</strong> open PRs, who a PR is waiting on, link a PR to a task, task from a review comment.</p> <pre><code>OPEN PRS: list_pull_requests state=open, both repos unless one is named. Columns: repo, number, title, author, waiting_on, days open, task. "Waiting on me" filters waiting_on to the current user. If synced_at is older than 15 minutes, call sync_pull_requests first. LINK: update_task with pr_url and by. Tell the user the T-<id> convention (in the PR title, body or a branch named t12-...) so the next PR links itself. UNLINKED: list_pull_requests unlinked=true and offer to create a task for each. TASK FROM A REVIEW COMMENT: the user pastes or describes the comment. Quote it in Context, PR URL in Links, owner the PR author unless told otherwise. Show, yes, create_task with pr_url. NUDGE: on request only, one sentence in the current Slack thread with the PR URL. </code></pre> <h2 class="relative group flex items-baseline"> <a id="skill-3-standup" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#skill-3-standup" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Skill 3: Standup </span> </h2> <p><strong>When to invoke:</strong> standup, digest, "where are we", or the scheduled Workflow.</p> <pre><code>Per person: list_tasks owner=<person> and list_pull_requests waiting_on=<person>. <Name>: N open (p1 a, p2 b, p3 c), M PRs waiting on them, K blocked p1 T-42 Grade the Yodeck run 3d PR #57 waiting on jack.rayner p2 T-40 Portal Editor on prod MCP 6d stale blocked T-38 Snowflake cost report on: finance access Team line: tasks opened and closed since the last digest (list_tasks include_done), PRs merged (list_pull_requests state=merged). Stale is the tracker's flag; say it, do not act on it. Never create, close or assign from a standup. Offer, in one line, if something looks wrong (no owner, PR with needs_reviewer). Under 30 lines for the team, 12 per person. </code></pre> <h2 class="relative group flex items-baseline"> <a id="skill-4-pipeline" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#skill-4-pipeline" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Skill 4: Pipeline </span> </h2> <p><strong>When to invoke:</strong> approvals, "what will the next run take", "what shipped to test", "why is my PR held", "what is the agent working on", build warnings.</p> <pre><code>STATUS: pipeline_status. Report ready (what the next run merges), held (each with its held_because), awaiting_approval (name the approver who is needed), the last run's outcome and the last push to test-mcp (sha, when, health). APPROVE: only for Mike or Jack (rule 11). Show the PR, get a yes, approve_pull_request(repo, number, by=<them>, note). Then say when the next run is (7:30, 11:30, 15:30, 19:30 Eastern). SHIPPED: list_deployments(space="test-mcp"); say sha, time, health, and which tasks got "on test-mcp" notes. Prod is boone's, by hand: never say something is on prod unless a deployments row for space "mcp" says so. HELD: explain the one reason from held_because in plain words and what would clear it (a draft to un-draft, a reviewer to ask, a conflict to rebase). WARNINGS: ingest_findings when asked for a fresher look; otherwise the 7:30 run did it. Report created and updated T-ids. </code></pre> <h2 class="relative group flex items-baseline"> <a id="skill-5-dispatch-v2-not-in-the-v1-build" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#skill-5-dispatch-v2-not-in-the-v1-build" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Skill 5: Dispatch (v2, not in the v1 build) </span> </h2> <p>A task labelled <code>demo</code> assigned to the DemoPrep agent becomes a <code>build_demo_from_brief</code> call with the task body as the brief and <code>owner_email</code> the requester; the <code>run_id</code> lands on the task through <code>update_task</code>, and the liveboard URL when it completes. Gated on durable run state on the MCP (sprint ISS-6) and on a decision about an agent spending a build on a one-line task nobody read.</p> <hr> <h2 class="relative group flex items-baseline"> <a id="scheduled-workflow-weekday-digest" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#scheduled-workflow-weekday-digest" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Scheduled Workflow: weekday digest </span> </h2> <div class="max-w-full overflow-auto"> <table> <thead><tr> <th>Field</th> <th>Value</th> </tr> </theader> <tbody><tr> <td>Name</td> <td>Task Manager daily digest</td> </tr> <tr> <td>Schedule</td> <td>Mon to Fri, 13:00 UTC (09:00 ET)</td> </tr> <tr> <td>Steps</td> <td>1. Standup skill, team scope. 2. Post to Slack <code>#demoprep-tasks</code>.</td> </tr> </tbody> </table> </div> <p>Test run once before activating. One DO credit per completed run.</p> <hr> <h2 class="relative group flex items-baseline"> <a id="example-conversations" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#example-conversations" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Example conversations </span> </h2> <p><strong>Create and assign.</strong> Mike, in Slack: "@Task Manager assign Gora: grade the Yodeck run by Friday, p1." Thread reply: title "Grade the Yodeck run", owner gora.sudindranath, task, p1, due 2026-10-24, Context "Asked by mike.boone in Slack", Done when "Grade posted in DAILY_RUN_REPORT.md", Links the thread. Create? On yes: "Created T-42 for Gora, p1".</p> <p><strong>Jack opens a PR.</strong> Jack's branch is <code>t42-yodeck-grade</code> and the PR body says "T-42". Within ten minutes the sync links it and writes the PR onto the task; "What's on my plate?" shows T-42 with "PR #57 open, waiting on mike.boone".</p> <p><strong>PR waiting on whom.</strong> Manny: "Which PRs are waiting on me?" Rows where waiting_on is mani.uppala, with days open and the task.</p> <p><strong>A close it declines.</strong> Gora: "PR 57 merged, close T-42." The agent confirms the title and closes it with a note. Gora: "and close everything else that merged." The agent lists each task whose PR merged but is still open and closes only the ones Gora says yes to.</p> <hr> <h2 class="relative group flex items-baseline"> <a id="decisions-boone-still-owes" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#decisions-boone-still-owes" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Decisions boone still owes </span> </h2> <ol> <li>Paul's ThoughtSpot username, and whether Gora is a manager for the RLS group.</li> <li>Personal view: Owner Name filter saved per person, or the RLS rule.</li> <li>Slack channel: new <code>#demoprep-tasks</code>, or the existing deployment channel.</li> <li>The GitHub token owner: your <code>boone10</code> account, or a team account.</li> <li>Jack's, Manny's and Gora's GitHub logins for <code>tracker_people</code>.</li> </ol> <hr> <h2 class="relative group flex items-baseline"> <a id="sources" class="block pr-1.5 text-lg md:absolute md:p-1.5 md:opacity-0 md:group-hover:opacity-100 md:right-full" href="#sources" > <span class="header-link"><!--[--><svg class="text-gray-500 hover:text-black dark:hover:text-gray-200 w-4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!--]--></span> </a> <span> Sources </span> </h2> <ul> <li>AgentSpot reference, 2026-09: <code>docs/agentspot_reference_2026_09.md</code></li> <li>Prior agents: <code>docs/agentspot_tse_opportunity_finder.md</code>, <code>docs/agentspot_portal_editor_agent.md</code></li> <li>ThoughtSpot connection types (PostgreSQL listed): <a href="https://docs.thoughtspot.com/cloud/latest/connections" rel="nofollow">https://docs.thoughtspot.com/cloud/latest/connections</a></li> <li>AgentSpot admin, Slack bot: <a href="https://docs.thoughtspot.com/agentspot/agentspot-admin.html" rel="nofollow">https://docs.thoughtspot.com/agentspot/agentspot-admin.html</a></li> <li>Code: <code>demoprep_app/tracker/</code>, the tracker section of <code>mcp_server.py</code>, <code>tests/test_tracker_*.py</code></li> </ul>