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
+47
View File
@@ -0,0 +1,47 @@
#!/usr/bin/env node
/**
* Phase 1 smoke: POST /agent/start on local Goose v1.49 candidate.
*/
import { execFileSync } from 'node:child_process';
const port = process.env.GOOSE_V149_PORT || '18049';
const host = process.env.GOOSE_V149_HOST || '127.0.0.1';
const secret = process.env.GOOSE_SERVER__SECRET_KEY || 'local-v149-dev-secret';
const workingDir = process.env.GOOSE_V149_WORKING_DIR || process.cwd();
const blockedHosts = ['58.38.22.103', '120.26.184.105'];
if (blockedHosts.includes(host)) {
console.error(`GOOSE_V149_AGENT_START_FAIL: refusing production host ${host}`);
process.exit(1);
}
try {
const body = execFileSync(
'curl',
[
'-sk',
'--connect-timeout',
'10',
'-X',
'POST',
'-H',
'Content-Type: application/json',
'-H',
`X-Secret-Key: ${secret}`,
'-d',
JSON.stringify({ working_dir: workingDir }),
`https://${host}:${port}/agent/start`,
],
{ encoding: 'utf8' },
).trim();
const session = JSON.parse(body);
if (!session?.id) {
console.error(`GOOSE_V149_AGENT_START_FAIL: missing session id: ${body}`);
process.exit(1);
}
console.log(`GOOSE_V149_AGENT_START_OK: session=${session.id}`);
} catch (error) {
console.error(`GOOSE_V149_AGENT_START_FAIL: ${error.message}`);
process.exit(1);
}