feat(goose): add local v1.49 canary routing, smoke gates, and migration docs

Wire Portal and TKMind proxy to loopback Goose v1.49 via canary env blocks,
with verification scripts, Phase 2/3 evidence baselines, and rollback runbooks
so local upgrade stays isolated from stable 1.41 and production.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-09-08 21:10:20 +08:00
parent d2d463b1db
commit 716ef407fe
68 changed files with 48162 additions and 2 deletions
File diff suppressed because it is too large Load Diff
+14
View File
@@ -0,0 +1,14 @@
# Goose v1.49 Phase 0 本地基线
本目录存放 loopback 升级对照用的 JSON 基线,**不含生产密钥**。
| 文件 | 生成命令 |
|---|---|
| `goose-v149-memory-latest.json` | `node scripts/export-goose-v149-memory-manifest.mjs --output docs/baselines/goose-v149-memory-latest.json` |
| `goose-v149-runtime-baseline-*.json` | `node scripts/capture-goose-v149-baseline.mjs` |
| `goose-v149-cost-evidence-*.json` | `node scripts/check-goosed-v149-cost-smoke.mjs` |
| `goose-v149-deepseek-tools-evidence-*.json` | `node scripts/check-goosed-v149-deepseek-tools.mjs` |
| `goose-v149-thinking-preservation-latest.json` | `node scripts/check-goosed-v149-thinking-preservation.mjs` |
| `goose-v149-message-sanitize-latest.json` | `node scripts/compare-goose-v149-message-sanitize.mjs` |
Phase 3 收口:[goose-v149-phase3-closeout.md](../goose-v149-phase3-closeout.md) · 聚合:`node scripts/run-goosed-v149-phase3.mjs`
@@ -0,0 +1,22 @@
{
"schemaVersion": "goose-v149-cost-evidence-v1",
"capturedAt": "2026-09-08T10:06:59.003Z",
"sessionId": "20260908_30",
"requestId": "b0ee6f3f-cedc-470c-84cd-925b83c3c131",
"finishReason": "stop",
"tokenState": {
"inputTokens": 8339,
"outputTokens": 2,
"totalTokens": 8341,
"accumulatedInputTokens": 8339,
"accumulatedOutputTokens": 2,
"accumulatedTotalTokens": 8341,
"accumulatedCost": null
},
"billingState": {
"accumulatedInputTokens": 8339,
"accumulatedOutputTokens": 2,
"accumulatedCost": 0.0022537300000000002
},
"enrichedCost": 0.0022537300000000002
}
@@ -0,0 +1,22 @@
{
"schemaVersion": "goose-v149-cost-evidence-v1",
"capturedAt": "2026-09-08T10:07:14.546Z",
"sessionId": "20260908_37",
"requestId": "4c558b69-64e3-4909-9e33-1cb598a00cc2",
"finishReason": "stop",
"tokenState": {
"inputTokens": 8339,
"outputTokens": 2,
"totalTokens": 8341,
"accumulatedInputTokens": 8339,
"accumulatedOutputTokens": 2,
"accumulatedTotalTokens": 8341,
"accumulatedCost": null
},
"billingState": {
"accumulatedInputTokens": 8339,
"accumulatedOutputTokens": 2,
"accumulatedCost": 0.0022537300000000002
},
"enrichedCost": 0.0022537300000000002
}
@@ -0,0 +1,22 @@
{
"schemaVersion": "goose-v149-cost-evidence-v1",
"capturedAt": "2026-09-08T10:30:13.352Z",
"sessionId": "20260908_50",
"requestId": "752da410-df43-44c6-9958-2c23f3d948ae",
"finishReason": "stop",
"tokenState": {
"inputTokens": 8339,
"outputTokens": 2,
"totalTokens": 8341,
"accumulatedInputTokens": 8339,
"accumulatedOutputTokens": 2,
"accumulatedTotalTokens": 8341,
"accumulatedCost": null
},
"billingState": {
"accumulatedInputTokens": 8339,
"accumulatedOutputTokens": 2,
"accumulatedCost": 0.0022537300000000002
},
"enrichedCost": 0.0022537300000000002
}
@@ -0,0 +1,22 @@
{
"schemaVersion": "goose-v149-cost-evidence-v1",
"capturedAt": "2026-09-08T11:12:36.359Z",
"sessionId": "20260908_66",
"requestId": "ba50d32c-5024-4b77-8372-cf6ea1c5eaf0",
"finishReason": "stop",
"tokenState": {
"inputTokens": 8339,
"outputTokens": 2,
"totalTokens": 8341,
"accumulatedInputTokens": 8339,
"accumulatedOutputTokens": 2,
"accumulatedTotalTokens": 8341,
"accumulatedCost": null
},
"billingState": {
"accumulatedInputTokens": 8339,
"accumulatedOutputTokens": 2,
"accumulatedCost": 0.0022537300000000002
},
"enrichedCost": 0.0022537300000000002
}
@@ -0,0 +1,22 @@
{
"schemaVersion": "goose-v149-cost-evidence-v1",
"capturedAt": "2026-09-08T11:19:29.723Z",
"sessionId": "20260908_79",
"requestId": "388a1d9e-6edb-413a-bd49-9d602e3132d0",
"finishReason": "stop",
"tokenState": {
"inputTokens": 8586,
"outputTokens": 2,
"totalTokens": 8588,
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedTotalTokens": 8588,
"accumulatedCost": null
},
"billingState": {
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedCost": 0.00232042
},
"enrichedCost": 0.00232042
}
@@ -0,0 +1,22 @@
{
"schemaVersion": "goose-v149-cost-evidence-v1",
"capturedAt": "2026-09-08T12:07:15.664Z",
"sessionId": "20260908_94",
"requestId": "f72ff3fd-413f-4c80-b671-1d4f15d1ecf1",
"finishReason": "stop",
"tokenState": {
"inputTokens": 8586,
"outputTokens": 2,
"totalTokens": 8588,
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedTotalTokens": 8588,
"accumulatedCost": null
},
"billingState": {
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedCost": 0.00232042
},
"enrichedCost": 0.00232042
}
@@ -0,0 +1,22 @@
{
"schemaVersion": "goose-v149-cost-evidence-v1",
"capturedAt": "2026-09-08T12:23:16.640Z",
"sessionId": "20260908_109",
"requestId": "a9365f33-add9-45f3-8512-6a5554e85194",
"finishReason": "stop",
"tokenState": {
"inputTokens": 8586,
"outputTokens": 2,
"totalTokens": 8588,
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedTotalTokens": 8588,
"accumulatedCost": null
},
"billingState": {
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedCost": 0.00232042
},
"enrichedCost": 0.00232042
}
@@ -0,0 +1,22 @@
{
"schemaVersion": "goose-v149-cost-evidence-v1",
"capturedAt": "2026-09-08T12:32:49.137Z",
"sessionId": "20260908_124",
"requestId": "b31d65ea-e68a-4a7b-a47b-89b3d365afa2",
"finishReason": "stop",
"tokenState": {
"inputTokens": 8586,
"outputTokens": 2,
"totalTokens": 8588,
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedTotalTokens": 8588,
"accumulatedCost": null
},
"billingState": {
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedCost": 0.00232042
},
"enrichedCost": 0.00232042
}
@@ -0,0 +1,22 @@
{
"schemaVersion": "goose-v149-cost-evidence-v1",
"capturedAt": "2026-09-08T13:06:15.865Z",
"sessionId": "20260908_141",
"requestId": "d85df70e-9d1d-45d1-9408-96dbff9d5c96",
"finishReason": "stop",
"tokenState": {
"inputTokens": 8586,
"outputTokens": 2,
"totalTokens": 8588,
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedTotalTokens": 8588,
"accumulatedCost": null
},
"billingState": {
"accumulatedInputTokens": 8586,
"accumulatedOutputTokens": 2,
"accumulatedCost": 0.00232042
},
"enrichedCost": 0.00232042
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "goose-v149-deepseek-tools-v1",
"capturedAt": "2026-09-08T12:07:03.092Z",
"sessionId": "20260908_84",
"requestId": "24118cbb-ebe9-4f0f-9b8c-59a71cbbad28",
"providerId": "custom_tkmind_relay_deepseek",
"model": "deepseek-chat",
"toolNames": [
"todo__todo_write"
],
"finishReason": "stop",
"eventTypes": [
"Message",
"Message",
"Message",
"Finish"
]
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "goose-v149-deepseek-tools-v1",
"capturedAt": "2026-09-08T12:07:06.888Z",
"sessionId": "20260908_89",
"requestId": "cbdfc7d5-48ee-4fe9-acf1-dd08bbba27b2",
"providerId": "custom_tkmind_relay_deepseek",
"model": "deepseek-chat",
"toolNames": [
"todo__todo_write"
],
"finishReason": "stop",
"eventTypes": [
"Message",
"Message",
"Message",
"Finish"
]
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "goose-v149-deepseek-tools-v1",
"capturedAt": "2026-09-08T12:07:18.952Z",
"sessionId": "20260908_96",
"requestId": "23c5fcf6-e15a-4880-b0d1-c9fd0073c419",
"providerId": "custom_tkmind_relay_deepseek",
"model": "deepseek-chat",
"toolNames": [
"todo__todo_write"
],
"finishReason": "stop",
"eventTypes": [
"Message",
"Message",
"Message",
"Finish"
]
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "goose-v149-deepseek-tools-v1",
"capturedAt": "2026-09-08T12:23:05.066Z",
"sessionId": "20260908_104",
"requestId": "c5f423b5-9dc0-474e-898c-a472a935386e",
"providerId": "custom_tkmind_relay_deepseek",
"model": "deepseek-chat",
"toolNames": [
"todo__todo_write"
],
"finishReason": "stop",
"eventTypes": [
"Message",
"Message",
"Message",
"Finish"
]
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "goose-v149-deepseek-tools-v1",
"capturedAt": "2026-09-08T12:23:19.758Z",
"sessionId": "20260908_112",
"requestId": "0f40ec62-b124-4288-9518-040c4550e329",
"providerId": "custom_tkmind_relay_deepseek",
"model": "deepseek-chat",
"toolNames": [
"todo__todo_write"
],
"finishReason": "stop",
"eventTypes": [
"Message",
"Message",
"Message",
"Finish"
]
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "goose-v149-deepseek-tools-v1",
"capturedAt": "2026-09-08T12:32:37.309Z",
"sessionId": "20260908_119",
"requestId": "3e3c39f4-6165-4e40-9b0a-d4785c969851",
"providerId": "custom_tkmind_relay_deepseek",
"model": "deepseek-chat",
"toolNames": [
"todo__todo_write"
],
"finishReason": "stop",
"eventTypes": [
"Message",
"Message",
"Message",
"Finish"
]
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "goose-v149-deepseek-tools-v1",
"capturedAt": "2026-09-08T12:32:51.717Z",
"sessionId": "20260908_127",
"requestId": "8c1f27ac-e8c1-47c8-8835-9ae27d217adb",
"providerId": "custom_tkmind_relay_deepseek",
"model": "deepseek-chat",
"toolNames": [
"todo__todo_write"
],
"finishReason": "stop",
"eventTypes": [
"Message",
"Message",
"Message",
"Finish"
]
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "goose-v149-deepseek-tools-v1",
"capturedAt": "2026-09-08T13:04:37.865Z",
"sessionId": "20260908_135",
"requestId": "c1360188-7f59-41e3-ba43-689fa8f7be1d",
"providerId": "custom_tkmind_relay_deepseek",
"model": "deepseek-chat",
"toolNames": [
"todo__todo_write"
],
"finishReason": "stop",
"eventTypes": [
"Message",
"Message",
"Message",
"Finish"
]
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "goose-v149-deepseek-tools-v1",
"capturedAt": "2026-09-08T13:06:18.709Z",
"sessionId": "20260908_144",
"requestId": "328356c3-25b6-4d15-bd18-206dd7c803aa",
"providerId": "custom_tkmind_relay_deepseek",
"model": "deepseek-chat",
"toolNames": [
"todo__todo_write"
],
"finishReason": "stop",
"eventTypes": [
"Message",
"Message",
"Message",
"Finish"
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,14 @@
{
"schemaVersion": "goose-v149-message-sanitize-v1",
"capturedAt": "2026-09-08T13:06:26.641Z",
"v149": {
"passed": 11,
"root": "/Users/john/Project/tkmind_go-v149"
},
"v141": {
"passed": 11,
"ok": true,
"root": "/Users/john/Project/tkmind_go-v141-prod-prep"
},
"equivalent": true
}
@@ -0,0 +1,283 @@
{
"schemaVersion": "goose-v149-baseline-v1",
"capturedAt": "2026-09-08T10:02:06.825Z",
"target": "https://127.0.0.1:18049",
"status": {
"status": "ok"
},
"sessionsSummary": {
"count": 20,
"sample": [
{
"id": "20260908_20",
"working_dir": "/Users/john/Project/Memind",
"name": "pong",
"user_set_name": false,
"session_type": "user",
"created_at": "2026-09-08T10:02:00.279689Z",
"updated_at": "2026-09-08T10:02:02.146310Z",
"extension_data": {
"enabled_extensions.v0": {
"extensions": [
{
"type": "platform",
"name": "tom",
"description": "Inject custom context into every turn via GOOSE_MOIM_MESSAGE_TEXT and GOOSE_MOIM_MESSAGE_FILE environment variables",
"display_name": "Top Of Mind",
"bundled": true
},
{
"type": "platform",
"name": "skills",
"description": "Discover and provide skill instructions from filesystem and builtins",
"display_name": "Skills",
"bundled": true
},
{
"type": "platform",
"name": "aider",
"description": "Delegate multi-file coding tasks to Aider instead of developer write/edit",
"display_name": "Aider",
"bundled": true
},
{
"type": "platform",
"name": "Extension Manager",
"description": "Enable extension management tools for discovering, enabling, and disabling extensions",
"display_name": "Extension Manager",
"bundled": true
},
{
"type": "platform",
"name": "developer",
"description": "Write and edit files, and execute shell commands",
"display_name": "Developer",
"bundled": true
},
{
"type": "platform",
"name": "summon",
"description": "Load knowledge and delegate tasks to subagents",
"display_name": "Summon",
"bundled": true
},
{
"type": "platform",
"name": "openhands",
"description": "Delegate multi-file coding tasks to OpenHands instead of developer write/edit",
"display_name": "OpenHands",
"bundled": true
},
{
"type": "platform",
"name": "apps",
"description": "Create and manage custom Goose apps through chat. Apps are HTML/CSS/JavaScript and run in sandboxed windows.",
"display_name": "Apps",
"bundled": true
},
{
"type": "platform",
"name": "analyze",
"description": "Analyze code structure with tree-sitter: directory overviews, file details, symbol call graphs",
"display_name": "Analyze",
"bundled": true
},
{
"type": "platform",
"name": "todo",
"description": "Enable a todo list for goose so it can keep track of what it is doing",
"display_name": "Todo",
"bundled": true
}
]
}
},
"usage": {
"input_tokens": 8339,
"output_tokens": 2,
"total_tokens": 8341,
"cache_read_input_tokens": 0,
"cache_write_input_tokens": null
},
"accumulated_usage": {
"input_tokens": 8339,
"output_tokens": 2,
"total_tokens": 8341,
"cache_read_input_tokens": 0,
"cache_write_input_tokens": 0
},
"accumulated_cost": null,
"schedule_id": null,
"recipe": null,
"user_recipe_values": null,
"conversation": null,
"message_count": 3,
"last_message_at": "2026-09-08T10:02:01Z",
"provider_name": "custom_tkmind_relay_deepseek",
"model_config": {
"model_name": "deepseek-chat",
"temperature": null,
"max_tokens": null,
"toolshim": false,
"toolshim_model": null
},
"goose_mode": "auto",
"archived_at": null,
"project_id": null,
"parent_session_id": null,
"last_message_snippet": null
},
{
"id": "20260908_19",
"working_dir": "/Users/john/Project/Memind",
"name": "New Chat",
"user_set_name": false,
"session_type": "user",
"created_at": "2026-09-08T10:02:00.057531Z",
"updated_at": "2026-09-08T10:02:00.064842Z",
"extension_data": {
"enabled_extensions.v0": {
"extensions": [
{
"type": "platform",
"name": "openhands",
"description": "OpenHands coding delegate",
"display_name": null,
"bundled": null,
"available_tools": [
"code"
]
},
{
"type": "platform",
"name": "aider",
"description": "Aider coding delegate",
"display_name": null,
"bundled": null,
"available_tools": [
"code"
]
}
]
}
},
"usage": {
"input_tokens": null,
"output_tokens": null,
"total_tokens": null,
"cache_read_input_tokens": null,
"cache_write_input_tokens": null
},
"accumulated_usage": {
"input_tokens": null,
"output_tokens": null,
"total_tokens": null,
"cache_read_input_tokens": null,
"cache_write_input_tokens": null
},
"accumulated_cost": null,
"schedule_id": null,
"recipe": null,
"user_recipe_values": null,
"conversation": null,
"message_count": 0,
"last_message_at": null,
"provider_name": null,
"model_config": null,
"goose_mode": "auto",
"archived_at": null,
"project_id": null,
"parent_session_id": null,
"last_message_snippet": null
},
{
"id": "20260908_18",
"working_dir": "/Users/john/Project/Memind",
"name": "New Chat",
"user_set_name": false,
"session_type": "user",
"created_at": "2026-09-08T10:01:59.691171Z",
"updated_at": "2026-09-08T10:01:59.885622Z",
"extension_data": {
"enabled_extensions.v0": {
"extensions": [
{
"type": "stdio",
"name": "sandbox-fs",
"description": "MindSpace sandbox filesystem MCP (local v1.49 smoke)",
"cmd": "/opt/homebrew/Cellar/node/26.0.0/bin/node",
"args": [
"/Users/john/Project/Memind/mindspace-sandbox-mcp.mjs",
"/var/folders/wv/y43yzlmn7gd1bcsq1fcwx3b00000gn/T/goose-v149-sandbox-3ADPMS"
],
"envs": {
"ALLOWED_TOOLS": "write_file,read_file,edit_file,create_dir,list_dir",
"SANDBOX_ROOT": "/var/folders/wv/y43yzlmn7gd1bcsq1fcwx3b00000gn/T/goose-v149-sandbox-3ADPMS"
},
"env_keys": [],
"timeout": null,
"cwd": null,
"bundled": null,
"available_tools": [
"write_file",
"read_file",
"edit_file",
"create_dir",
"list_dir"
]
},
{
"type": "platform",
"name": "skills",
"description": "skills",
"display_name": null,
"bundled": null
}
]
}
},
"usage": {
"input_tokens": null,
"output_tokens": null,
"total_tokens": null,
"cache_read_input_tokens": null,
"cache_write_input_tokens": null
},
"accumulated_usage": {
"input_tokens": null,
"output_tokens": null,
"total_tokens": null,
"cache_read_input_tokens": null,
"cache_write_input_tokens": null
},
"accumulated_cost": null,
"schedule_id": null,
"recipe": null,
"user_recipe_values": null,
"conversation": null,
"message_count": 0,
"last_message_at": null,
"provider_name": null,
"model_config": null,
"goose_mode": "auto",
"archived_at": null,
"project_id": null,
"parent_session_id": null,
"last_message_snippet": null
}
]
},
"reply": {
"requestId": "a53113c2-8462-4b6d-94f6-0303f6eebea5",
"outcome": "error",
"events": [
{
"type": "Error",
"error": "Provider not set",
"chat_request_id": "a53113c2-8462-4b6d-94f6-0303f6eebea5",
"request_id": "a53113c2-8462-4b6d-94f6-0303f6eebea5"
}
],
"sessionId": "20260908_21"
}
}
@@ -0,0 +1,12 @@
{
"schemaVersion": "goose-v149-thinking-preservation-v1",
"capturedAt": "2026-09-08T13:06:25.818Z",
"worktree": "/Users/john/Project/tkmind_go-v149",
"tests": [
"test_deepseek_thinking_preserved_in_tool_call_message",
"test_kimi_thinking_preserved_in_tool_call_message",
"test_reasoning_preserved_when_combined_with_tool_call",
"test_multi_tool_response_preserves_reasoning_and_message_id_correlation"
],
"passed": 4
}