Intent: MCP now answers with a ui://forge/run card whose rows open the run's page, so a person in a harness can look deeper at what an agent is doing without searching for it.
Done looks like:
[ ] In src/web/studio/cards.ts, each run row whose run has an id and an owner/name app carries link: <origin>/<owner>/<name>/runs/<id>, only when the origin is http(s) and the id is the forge's id shape; otherwise no link. The Stop actions are unchanged.
[ ] A test calls cardFor("now", …) with a good row, a row with no run id, and a bad origin, and asserts the links; it fails without the change.
[ ] docs/MCP.md's Cards paragraph says the run card links each run.
Files: src/web/studio/cards.ts, a card test beside test/mcp.test.ts, docs/MCP.md.
Risks: #5320 makes runs draw this same card; the link must come from the row's fields both tools already give, not from the tool's name.
Intent: MCP
nowanswers with aui://forge/runcard whose rows open the run's page, so a person in a harness can look deeper at what an agent is doing without searching for it.Done looks like:
src/web/studio/cards.ts, each run row whose run has an id and anowner/nameapp carrieslink:<origin>/<owner>/<name>/runs/<id>, only when the origin is http(s) and the id is the forge's id shape; otherwise no link. The Stop actions are unchanged.cardFor("now", …)with a good row, a row with no run id, and a bad origin, and asserts the links; it fails without the change.Files: src/web/studio/cards.ts, a card test beside test/mcp.test.ts, docs/MCP.md. Risks: #5320 makes
runsdraw this same card; the link must come from the row's fields both tools already give, not from the tool's name.