Skip to content

[Issue Tree Root] AI Gateway 手动并发门禁:Mock 上游与真实 CLI 验证 #1377

Description

@JAVA-LW

Issue 元数据

最终结果

建立一个仅由 workflow_dispatch 触发、不会进入 schedule 或默认 CI 聚合的 AI Gateway 并发门禁。门禁在 GitHub 托管 runner 上启动临时 PostgreSQL、真实 api-server/plugin-runner、精确 SHA 的官方 Provider、确定性 Mock SSE/WebSocket 上游、隔离 Codex/Claude Code 兼容哨兵与合成负载,输出可复核的 characterize/regression 证据。

isolated Codex ───── Responses HTTP/SSE ─┐
isolated Claude Code ─ Anthropic SSE ────┼─> api-server ─> plugin-runner ─> Mock upstream
synthetic load generator ────────────────┘       │                 │       ├─ SSE
                                                  PostgreSQL        │       └─ WebSocket
                                                                     └─ queue / parallel evidence

现状、证据与关键决策

  • [已就绪][Issue Tree Root] AI Gateway V1:单一 contract 收敛与上线验收 #1366 已关闭并合入 dev,当前公共兼容入口为 HTTP/SSE;本 Root 不新增公共 Responses WebSocket。
  • 相同 provider_instance + provider_code + protocol + model 当前由 Semaphore(1) 单飞;OpenAI stateful_provider_worker 还受同插件 worker mutex 约束;Anthropic process_per_call 可在不同 pool 间并行。
  • GitHub Actions 现有 quality-gate composite 已能启动临时 PostgreSQL;本 Root 不读取本机私有 .memory.env
  • Codex/Claude Code 只做真实客户端兼容哨兵;主并发由轻量合成客户端产生。
  • 全部真实 OpenAI/Anthropic 凭据在运行步骤中清空,使用假 token 和 loopback Provider base URL。
  • GitHub 托管 runner 结论只代表固定 CI 回归环境,不宣称生产最大容量。
  • 首次 characterize:正确性、终态、排队/并行契约为硬门禁;绝对性能阈值只记录,不在无基线时臆造。
  • regression 只有在 characterize 证据被用户接受并形成 checked-in budget 后才启用性能硬阈值。

总范围、权限与非目标

范围内

  • 确定性 Mock 上游:Responses HTTP/SSE、Responses WebSocket、Anthropic SSE;支持慢 chunk、取消、上游失败和流中断场景。
  • 合成并发客户端与 characterize 报告:固定并发 1/4/16/32,记录 nonce、TTFT、总时延、吞吐、上游峰值、队列时间、终态与遗留运行。
  • 通过正式 API/service fixture 启动真实发布 Application、Provider instance 和 API key;禁止直接写业务表绕过 owner。
  • 临时隔离的 Codex、Claude Code smoke;不得读取或改动用户全局配置。
  • 独立 workflow_dispatch workflow,输入精确主仓 SHA、official-plugins SHA 与 profile;artifact 与 Job Summary。
  • source integration 与 CI characterize 证据。

非目标

  • 不调用真实大语言模型 API,不需要真实模型 API key。
  • 不新增公共 WebSocket contract,不改变 Provider 单飞、持久化 owner、schema/migration、权限或用户内容。
  • 不把门禁加入 schedule、默认 ci 聚合或每次 PR。
  • 不以 GitHub 托管 runner 推导生产容量或 SLA。
  • 首轮不设置未经观测批准的绝对性能预算。

已授权动作

  • 在 dev 基线上创建隔离 assembly、实现测试基础设施和 workflow、提交、集中 QA、合入 dev、push dev,并触发一次 characterize。
  • checkout 精确 official-plugins SHA 作为 CI 构建输入;不修改或推送 official-plugins。
  • 创建/更新本 Root 与既定 Delivery,上传 Actions artifact,回写运行证据。

需要额外确认的动作

  • 新公共协议、Provider 并发语义、数据库 pool 默认值、持久化 owner、生产部署或性能 SLO 的改变。

Root 验收点账本

AC 可观察结果 证据 Delivery 状态
AC-001 仅手动触发的 workflow 在精确双 SHA 上启动真实网关栈和临时 PostgreSQL,且不进入 schedule/default ci workflow source + dispatched run metadata 待映射 未结算
AC-002 Mock 上游覆盖 Responses SSE、Responses WebSocket、Anthropic SSE,并能确定性输出唯一 nonce/chunk/terminal fixture tests + characterize trace 待映射 未结算
AC-003 并发 1/4/16/32 下正常请求完成率 100%,无串流串线,每个 run 恰有一个 durable terminal,宽限期后无遗留 running summary.json + DB/API evidence 待映射 未结算
AC-004 慢流、取消、上游 500、流中断按既定终态结算,取消不得产生 success terminal scenario trace + terminal ledger 待映射 未结算
AC-005 同 pool 峰值为 1;OpenAI stateful worker 与 Anthropic same/multi-pool 曲线符合当前并发 contract mock arrival timeline + plugin/API activity 待映射 未结算
AC-006 隔离 Codex 和 Claude Code 各完成一次真实兼容调用,全局配置未读取/改写且没有真实 Provider 凭据 temp config manifest + CLI output + env audit 待映射 未结算
AC-007 characterize 输出 Markdown/JSON/JSONL/服务日志到 tmp/test-governance/ai-gateway-concurrency/ 并上传 artifact/Job Summary;绝对性能只记录 artifact + Job Summary 待映射 未结算
AC-008 本地 source assembly 的脚本单测、workflow contract 与相关后端边界回归通过;CI 首次 characterize 有明确 PASS/FAIL/未验证分类 frozen Test Batch + QA report + Actions run 待映射 未结算

Delivery Map

Delivery 纵向结果 结算 Root AC 依赖
#1378 Mock 上游与并发证据引擎 AC-002/003/004/005/007 none
#1379 真实网关 fixture 与隔离 CLI 哨兵 AC-001/003/004/005/006/008 #1378 interface
#1380 手动 workflow 与首次 characterize AC-001/003/004/005/006/007/008 #1378/#1379 assembled

验证、回滚与资源边界

  • TDD 采用 Issue Tree Batch Acceptance Cycle:开发前冻结有限 AC matrix/fixtures,全部 Packet 装配后仅运行一个 fresh 集中 QA。
  • 本地不运行完整并发压测;只做无法安全装配时需要的机械检查。真实 characterize 由 GitHub Actions 承担。
  • 同一时刻最多一个 Cargo/build/重型验证;整机总 CPU、物理内存、存储均不得超过 90%,swap 仅观察。
  • workflow 默认 API database pool 保持 5,PostgreSQL service max 可沿用现有 CI 容量;不得通过调大 pool 掩盖默认行为。
  • 回滚为移除独立 workflow/测试入口;不涉及 schema、用户数据或产品 contract 回滚。

Control Ledger

  • 最终结果、硬约束与未结算 Root AC:AC-001..008 全部未结算;公共协议、Provider 并发与持久化 owner 冻结不变。
  • protected baseline / frozen assembly:dev@60df36a;assembly branch=codex/root-1377-assembly,worktree=/home/taichuy/git/1flowbase_git_workspace/root-1377-assembly,frozen HEAD=0fef888cea9787de90a01df2ef9b1a578ca9ff2c。
  • Scout evidence:SCOUT_DONE。现有 scripts/node 测试会自动发现 _tests;provider-conformance 可复用真实 package/SSE/双 SHA/WireAudit,但缺 WebSocket、慢流、取消、并发与报告;acp-claude-smoke 继承全局 env,不能直接满足隔离 AC。正式进程外 bootstrap 必须走 sign-in → package upload/enable/assign → instance → application/key → draft → publication,现有 Rust Router::oneshot/test_support 不能直接复用。dev-up 不作为 CI lifecycle owner。official baseline=5e463cf47d9a01a54cc11ddc22bfab05ab34cdfe。完整路径证据已回写 [Delivery] AI Gateway 确定性 Mock 上游与并发证据引擎 #1378/[Delivery] 真实网关 Fixture 与隔离 Codex/Claude 兼容哨兵 #1379/[Delivery] 手动 AI Gateway 并发 Workflow 与首次 Characterize #1380
  • WP5 repeated-needs-split reframe:Root 审计 WP3 ready manifest 与 WP2/WP5 runner,冻结完整 target tuple 为 endpoint + distinct Application key + published model。endpoint 已存在、WP2F 结算 key、WP2G 结算 model;禁止 workflow proxy/merge reports。该局部 reframe 不改变 Root AC、产品 contract 或授权。
  • Work Packet Ledger:
    • WP1 / Deterministic mock upstream / committed+assembled ce6d195:input=60df36a7b;owned=scripts/node/ai-gateway-concurrency/contracts.js + mock-upstream/;forbidden=api/、现有 workflow、official repo;result=Responses SSE/WebSocket + Anthropic SSE,slow/cancel/500/interruption,arrival/peak;tests=同目录 _tests(Root Test Batch 执行);owner=D1 developer;worktree=root-1377-d1;stop if 需要产品公共 WebSocket。
    • WP2 / Characterize engine and reports / committed+assembled fb120ad:owned=characterize/** + scripts/node/cli/ai-gateway-concurrency.js;result=1/4/16/32、nonce/cross-stream/terminal、TTFT/latency/throughput/queue/peak、Markdown/JSON/JSONL;owner=复用 D1;stop if 需要未批准绝对性能预算。
    • WP2F / Transport-specific gateway authorization / committed+assembled 72f8814:owned=characterize/** + ai-gateway-concurrency CLI;result=single global nonce plan with per-SSE transport Application keys and credential-free mock WS;owner=D1;stop if 需要改变 WP3 manifest或产品 auth contract。
    • WP2G / Transport-specific published model / committed+assembled 95a5689:owned=characterize/** + CLI;result=single global plan uses ready-manifest OpenAI/Anthropic models, direct mock/WS remain mock-model;owner=D1;stop if any fourth target tuple field appears。
    • WP3 / Real gateway lifecycle fixture / committed 68a6d3d26 + assembled 8d7ee95:owned=gateway-fixture/** + scripts/node/cli/ai-gateway-fixture.js;result=临时端口/env/PostgreSQL、真实 api-server/plugin-runner、正式 HTTP bootstrap/cleanup;owner=D2 developer;worktree=root-1377-d2;forbidden=direct SQL 业务写、api 产品代码;stop if 需要 schema/权限/owner 改动。
    • WP4 / Isolated Codex and Claude sentinels / committed ecb127af1 + assembled a1ed4c7:owned=cli-smoke/** + scripts/node/cli/ai-gateway-cli-smoke.js;result=temp CODEX_HOME/Claude bare settings、清空真实凭据、loopback-only、config/stdout/stderr evidence;owner=复用 D2;stop if pinned CLI isolation 无法 controlled-negative 证明。
    • WP5 / Manual workflow and source contract / committed+assembled f5897be:input=95a56890d;owned=.github/workflows/ai-gateway-concurrency.yml + workflow-contract/**;result=only workflow_dispatch、双 SHA/profile fail closed、always artifact/summary/cleanup;owner=D1;首次 dispatch 不在 Packet 内。
  • 当前 Packet:none;全部 build packets 已装配,assembly frozen。
  • assembled commits 与冲突:WP1 ce6d195;WP2 fb120ad;WP3 assembled 8d7ee95;WP4 assembled a1ed4c7;WP2F 72f8814;WP2G 95a5689;WP5 f5897be;project memory 0fef888;无冲突。
  • Test Batch:冻结 assembly 后由一个 fresh QA 串行执行:
    1. git diff --check
    2. node scripts/node/test-scripts.js ai-gateway-concurrency acp-claude-smoke provider-conformance
    3. cd api && CARGO_BUILD_JOBS="$(node ../scripts/node/testing/verify-runtime.js cargo-jobs)" cargo test -p plugin-runner active_invocation_lease
    4. cd api && CARGO_BUILD_JOBS="$(node ../scripts/node/testing/verify-runtime.js cargo-jobs)" cargo test -p plugin-runner stateful_worker_registry_does_not_serialize_different_plugins
    5. cd api && CARGO_BUILD_JOBS="$(node ../scripts/node/testing/verify-runtime.js cargo-jobs)" cargo test -p api-server application_public_api
      controlled negatives:global env/config isolation、workflow trigger/inputs fail closed、nonce cross-stream、cancel/500/interruption。无本地 Cross/musl/package release 验收;source QA PASS 合入/push 后仅 dispatch 一次 characterize。
  • Observation counters:packets=8 / needs-split=2 / assembly-conflicts=0 / agent-contexts=6 / validation-runs=2 / duplicate-evidence-runs=0 / qa-cycles=2;fix_packets=1;first_batch_pass=false。
  • 活动 agent、worktree、进程与端口:Root;developer agents none;唯一 fresh QA active;worktrees=main/dev、latest/beta、root-1377-assembly、root-1377-d1、root-1377-d2(总数 5);本机既有 api-server/plugin-runner 端口 7800/7801 与 7900/7901 不触碰。
  • 资源、进程与外部等待:启动时 CPU≈10%、物理内存≈50%、存储=62%;无 Cargo/Cross/build。
  • 下一状态事件:等待用户确认 QA cycle 2 暴露的 evidence-topology reframe;确认前不新增 Packet、不合入、不 push、不 dispatch。
  • 停止或重构条件:需要公共 WebSocket、新 Provider 并发语义、数据库默认 pool 改动、持久化 owner/schema/权限/用户内容变化;Scout 不能形成有限 inventory;同根因在集中 QA 第二次失败。

生命周期

  • 当前阶段:phase:discussion
  • Root 关闭条件:全部 AC 有证据、集中 QA 与首次 characterize 结论闭合、结果合入 protected baseline,并由用户验收。

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:backendBackend API, service, repository, or runtime workarea:runtimeRuntime and execution behaviorarea:testAutomated tests, QA evidence, or validation harnessgrade:g3Cross-domain decision or implementation workmanual-runneeds-qaNeeds QA or acceptance validationparent-issueParent tracking issueperformancePerformance-sensitive behavior or verificationphase:discussionRequirement discussion and decision shapingplan:treeLong plan with one Root and vertical Delivery issuesquality-gate

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions