mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-16 13:03:31 +08:00
Desktop users can carry provider indexes, managed settings, localStorage state, and native update state from builds that no longer match current readers. This adds startup migrations and recovery paths before server and React state are consumed, plus a persistence upgrade gate so future storage protocol changes ship with old-format fixtures. Constraint: Existing installs may contain malformed or legacy JSON/localStorage that must not block startup. Constraint: Local verify should evaluate the current worktree diff rather than unrelated detached-worktree history. Rejected: Treat invalid persisted state as fatal | reproduces white-screen and startup failure behavior for existing users. Rejected: Bypass PR policy locally | hides real gate behavior and does not fix detached-worktree false positives. Confidence: high Scope-risk: moderate Directive: Any local JSON, localStorage, or app config shape change must add a migration fixture and keep `bun run check:persistence-upgrade` green. Tested: bun run check:persistence-upgrade; bun run check:policy; bun run check:desktop; bun run check:server; bun run check:native; bun run verify (9 passed, 1 coverage baseline failure) Not-tested: Live provider baseline; existing user configs beyond covered fixtures
173 lines
6.2 KiB
TypeScript
173 lines
6.2 KiB
TypeScript
import { baselineCases } from './baseline/cases'
|
|
import type { BaselineTarget, LaneDefinition, QualityGateMode } from './types'
|
|
|
|
export function lanesForMode(mode: QualityGateMode, baselineTargets: BaselineTarget[] = []): LaneDefinition[] {
|
|
const lanes: LaneDefinition[] = [
|
|
{
|
|
id: 'impact-report',
|
|
title: 'Impact report',
|
|
description: 'Summarize changed areas, required local checks, and risk notes.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:impact'],
|
|
requiredForModes: ['pr', 'baseline', 'release'],
|
|
category: 'scope',
|
|
},
|
|
{
|
|
id: 'pr-checks',
|
|
title: 'Path-aware PR checks',
|
|
description: 'Run the existing local PR gate with stable path-aware checks.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:pr'],
|
|
requiredForModes: ['pr', 'release'],
|
|
category: 'governance',
|
|
},
|
|
{
|
|
id: 'policy-checks',
|
|
title: 'Policy checks',
|
|
description: 'Run policy, workflow, hook, quarantine, and gate unit tests when any PR quality policy applies.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:policy'],
|
|
impactRequiredCheck: 'bun run check:policy',
|
|
requiredForModes: ['pr', 'release'],
|
|
category: 'governance',
|
|
},
|
|
{
|
|
id: 'desktop-checks',
|
|
title: 'Desktop checks',
|
|
description: 'Run desktop lint, Vitest, and production build when desktop paths changed.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:desktop'],
|
|
impactRequiredCheck: 'bun run check:desktop',
|
|
requiredForModes: ['pr'],
|
|
category: 'unit',
|
|
},
|
|
{
|
|
id: 'server-checks',
|
|
title: 'Server checks',
|
|
description: 'Run server, provider, runtime, MCP, OAuth, WebSocket, and API tests when server paths changed.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:server'],
|
|
impactRequiredCheck: 'bun run check:server',
|
|
requiredForModes: ['pr'],
|
|
category: 'unit',
|
|
},
|
|
{
|
|
id: 'adapter-checks',
|
|
title: 'Adapter checks',
|
|
description: 'Run adapter tests when IM adapter paths changed.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:adapters'],
|
|
impactRequiredCheck: 'bun run check:adapters',
|
|
requiredForModes: ['pr'],
|
|
category: 'unit',
|
|
},
|
|
{
|
|
id: 'native-checks',
|
|
title: 'Native desktop checks',
|
|
description: 'Build sidecars and run the Tauri native compile check when native or packaging paths changed.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:native'],
|
|
impactRequiredCheck: 'bun run check:native',
|
|
requiredForModes: ['pr', 'release'],
|
|
category: 'native',
|
|
},
|
|
{
|
|
id: 'docs-checks',
|
|
title: 'Docs checks',
|
|
description: 'Run docs install and VitePress build when docs paths changed.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:docs'],
|
|
impactRequiredCheck: 'bun run check:docs',
|
|
requiredForModes: ['pr'],
|
|
category: 'docs',
|
|
},
|
|
{
|
|
id: 'persistence-upgrade',
|
|
title: 'Persistence upgrade checks',
|
|
description: 'Validate local JSON and desktop localStorage migrations against old-version fixtures.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:persistence-upgrade'],
|
|
requiredForModes: ['pr', 'release'],
|
|
category: 'governance',
|
|
},
|
|
{
|
|
id: 'quarantine',
|
|
title: 'Quarantine governance',
|
|
description: 'Validate quarantined tests still have owners, exit criteria, and active review windows.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:quarantine'],
|
|
requiredForModes: ['pr', 'baseline', 'release'],
|
|
category: 'governance',
|
|
},
|
|
{
|
|
id: 'coverage',
|
|
title: 'Coverage gate',
|
|
description: 'Run unit/component coverage suites and enforce the ratcheted coverage baseline.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:coverage'],
|
|
requiredForModes: ['pr', 'baseline', 'release'],
|
|
category: 'coverage',
|
|
},
|
|
{
|
|
id: 'baseline-catalog',
|
|
title: 'Baseline case catalog validation',
|
|
description: 'Validate real Coding Agent baseline case definitions and fixture metadata.',
|
|
kind: 'command',
|
|
command: ['bun', 'test', 'scripts/quality-gate/baseline/cases.test.ts'],
|
|
requiredForModes: ['baseline', 'release'],
|
|
category: 'unit',
|
|
},
|
|
]
|
|
|
|
const targets = baselineTargets.length > 0
|
|
? baselineTargets
|
|
: [{ providerId: null, modelId: 'current', label: 'current-runtime' }]
|
|
|
|
for (const testCase of baselineCases) {
|
|
for (const target of targets) {
|
|
const targetSlug = target.label.replace(/[^a-zA-Z0-9._-]+/g, '-')
|
|
lanes.push({
|
|
id: `baseline:${testCase.id}:${targetSlug}`,
|
|
title: `${testCase.title} (${target.label})`,
|
|
description: testCase.description,
|
|
kind: 'baseline-case',
|
|
baselineCaseId: testCase.id,
|
|
baselineTarget: target,
|
|
requiredForModes: ['baseline', 'release'],
|
|
category: 'integration',
|
|
live: true,
|
|
})
|
|
}
|
|
}
|
|
|
|
for (const target of targets) {
|
|
const targetSlug = target.label.replace(/[^a-zA-Z0-9._-]+/g, '-')
|
|
lanes.push({
|
|
id: `provider-smoke:${targetSlug}`,
|
|
title: `Provider live/proxy smoke (${target.label})`,
|
|
description: 'Validate live provider connectivity. Saved or active OpenAI-compatible providers also exercise the local non-stream and streaming proxy endpoints; env-only targets validate upstream connectivity and transform pipeline.',
|
|
kind: 'provider-smoke',
|
|
baselineTarget: target,
|
|
requiredForModes: ['baseline', 'release'],
|
|
category: 'smoke',
|
|
live: true,
|
|
})
|
|
}
|
|
|
|
for (const target of targets) {
|
|
const targetSlug = target.label.replace(/[^a-zA-Z0-9._-]+/g, '-')
|
|
lanes.push({
|
|
id: `desktop-smoke:agent-browser-chat:${targetSlug}`,
|
|
title: `Desktop agent-browser chat smoke (${target.label})`,
|
|
description: 'Open the desktop web app with agent-browser, send a real chat task, and verify the model edits a fixture project through the UI.',
|
|
kind: 'desktop-smoke',
|
|
baselineTarget: target,
|
|
requiredForModes: ['baseline', 'release'],
|
|
category: 'smoke',
|
|
live: true,
|
|
})
|
|
}
|
|
|
|
return lanes.filter((lane) => lane.requiredForModes.includes(mode))
|
|
}
|