Skip to content

iter92 cluster-645: soft-deprecate StreamingProxy with Sunset header#1002

Merged
loning merged 3 commits into
auto-refact-devfrom
iter92/cluster-645-streamingproxy-deprecate
May 24, 2026
Merged

iter92 cluster-645: soft-deprecate StreamingProxy with Sunset header#1002
loning merged 3 commits into
auto-refact-devfrom
iter92/cluster-645-streamingproxy-deprecate

Conversation

@loning
Copy link
Copy Markdown
Contributor

@loning loning commented May 24, 2026

Summary

  • 保 StreamingProxy Host route + SDK surface(public contract,no in-repo client,docs claim)
  • 加 Deprecation + Sunset HTTP header(RFC 8594)指向 /v1/responses
  • README / docs/canon / ADR-0015 / streaming-proxy-flow doc 标 deprecated + sunset date + migration
  • architecture guard 防新增 StreamingProxy 消费者
  • 不删 code/proto/test;backward compat

9 files: +122 / -4。

Phase 9 r2 consensus

META_JUDGE_DONE:consensus:soft-deprecate-streamingproxy-with-sunset-no-hard-delete

#645 评论。

Closes #645

⟦AI:AUTO-LOOP⟧

…+ docs + guard (#645)

Phase 9 r2 consensus soft-deprecate-streamingproxy-with-sunset-no-hard-delete:
- StreamingProxy Host route + SDK surface preserved (public contract, no in-repo client, doc claim)
- Added Deprecation + Sunset HTTP header (RFC 8594) pointing to /v1/responses
- README / docs/canon / ADR-0015 / streaming-proxy-flow doc marked deprecated with sunset date and migration path
- Architecture guard prevents new StreamingProxy consumers without explicit exception
- No code/proto/test deleted; backward compat preserved

Closes #645

⟦AI:AUTO-LOOP⟧
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

🤖 Phase 8 Reviewer — quality (round 1)

TL;DR

  • 这是什么: 我按 quality 角色检查了 PR iter92 cluster-645: soft-deprecate StreamingProxy with Sunset header #1002 的命名、死代码、复杂度、重复和 refactor 自说明。
  • 结论: reject,实现本身小而聚焦,但缺少本轮 cluster 必需的 Refactor (iter92/cluster-645...) Old/New 自说明块。
  • 下一步: 补上 endpoint 软废弃行为和 CI guard 的 cluster-645 自说明后,可重新跑本 reviewer。

详细说明

主要问题是流程清单里的强制项没有满足:cluster refactor 需要在代码内保留 // Refactor (iterN/cluster-XXX): Old/New 注释,说明旧模式和新原则。当前新增的 StreamingProxy deprecation header/filter 放在既有 iter38/cluster-038 注释下面,tools/ci/architecture_guards.sh 新 guard 也只写了 Issue #645,读者无法从代码本身看出 iter92/cluster-645 的变更原则。

建议补两处:agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:20 附近说明旧 route 从普通公开入口软废弃为 compatibility-only;tools/ci/architecture_guards.sh:183 附近说明旧状态没有阻止新增 production consumer,新原则是 direct model streaming 走 /v1/responses,room fan-out 需要单独命名契约。


📎 完整 codex 原始输出(存档备查)
---
pr: 1002
role: quality
verdict: reject
---

## Verdict
Reject: the change is small and focused, but it misses the mandated cluster-level refactor self-doc comment for the new StreamingProxy deprecation behavior and guard.

## Evidence
- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:20`: the new deprecation/sunset constants and route filter are introduced under the existing `iter38/cluster-038` comment, so a reader cannot tell why `iter92/cluster-645` changed this compatibility surface or what old/new behavior is being preserved.
- `tools/ci/architecture_guards.sh:183`: the new guard uses a plain `Issue #645` comment instead of the required `// Refactor (iterN/cluster-XXX):` Old/New block, so it does not satisfy the reviewer-quality checklist's self-doc requirement for cluster refactors.
- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:125`: the added source assertion is reachable and focused, but there is no adjacent cluster-645 self-doc in the production/guard changes it protects.

## What would change your verdict
Add clear `Refactor (iter92/cluster-645-...)` Old/New comments near the endpoint deprecation header/filter and the CI guard, explaining the previous behavior ("StreamingProxy remained a normal reusable public route / no guard blocked new production consumers") and the new principle ("StreamingProxy is compatibility-only until sunset; new direct model streaming uses `/v1/responses`; room fan-out needs a named contract").

REVIEW_DONE:1002:quality-r1:reject
⟦AI:AUTO-LOOP

REVIEW_DONE:1002:quality-r1:reject
⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

🤖 Phase 8 Reviewer — architect (round 1)

TL;DR


详细说明

本轮重点看了三点 diff、CLAUDE.md / AGENTS.md 条款、StreamingProxy 软废弃链路和新增 CI guard。Deprecation / Sunset / Link header 的方向是诚实的:旧 /api/scopes/{scopeId}/streaming-proxy/... 保留为兼容入口,新直接模型 streaming 指向 /v1/responses,room/fan-out 语义没有被伪装成一对一替代。

唯一 comment 是流程合规:agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:59 新增 AddDeprecationHeadersAsyncagents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:67 新增 AddDeprecationHeaders,但附近没有 reviewer 流程要求的 // Refactor (iterN/cluster-XXX): Old pattern: ... New principle: ... 注释。建议补一句说明旧模式让 StreamingProxy 看起来仍是 active streaming integration point,新原则是只作为 sunset compatibility surface 并显式返回迁移 header。

验证:已执行 bash tools/ci/architecture_guards.sh,结果通过。


📎 完整 codex 原始输出(存档备查)
---
pr: 1002
role: architect
verdict: comment
---

## Verdict
comment-only: the soft-deprecation architecture is aligned, but the new endpoint filter/helper lacks the required refactor-loop Old/New pattern comment.

## Evidence
- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:59` adds `AddDeprecationHeadersAsync` and `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:67` adds `AddDeprecationHeaders` without a nearby `// Refactor (iterN/cluster-XXX): Old pattern: ... New principle: ...` comment. Reviewer checklist requires: "Old/New pattern comment: each refactored type/method has `// Refactor (iterN/cluster-XXX): Old pattern: …  New principle: …`."
- No reject-level CLAUDE/AGENTS violation found in this diff. The route remains a Host compatibility surface, adds honest `Deprecation`/`Sunset`/`Link` headers, updates canon/docs, and adds `tools/ci/architecture_guards.sh` coverage to block new production consumers. `bash tools/ci/architecture_guards.sh` passed.

## What would change your verdict
Add a concise `Refactor (iter92/cluster-645)` Old/New comment next to the new deprecation filter/header helper or the route group registration, explaining that the old pattern left StreamingProxy looking like an active streaming integration point and the new principle keeps it mapped only as a sunset compatibility surface with explicit migration headers.

REVIEW_DONE:1002:architect:comment
⟦AI:AUTO-LOOP

REVIEW_DONE:1002:architect-r1:comment
⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

🤖 Phase 8 Reviewer — tests (round 1)

TL;DR

  • 这是什么: 从测试覆盖与测试质量角度复核 PR iter92 cluster-645: soft-deprecate StreamingProxy with Sunset header #1002 的 StreamingProxy 软废弃变更。
  • 结论: approve;新增 header 行为与静态 guard 都有对应验证,本地目标测试与 guard 通过。
  • 下一步: controller 可以进入后续 reviewer/merge 判断,无需因 tests 角色补测。

详细说明

本轮重点看了 StreamingProxyEndpoints 的新增 DeprecationSunsetLink header 行为,以及 architecture_guards.sh 新增的“禁止新增 StreamingProxy 生产消费者”静态门禁。test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:125 断言 endpoint group 挂上 AddDeprecationHeadersAsynctest/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:136 断言三个响应 header 与 /v1/responses successor route 的具体值。

未发现测试质量问题:没有新增 Task.Delay / Thread.Sleep 节奏等待、没有新增 [Skip] 或 manual trait、没有改松已有断言。已执行 dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests,结果 50 passed / 0 failed / 0 skipped;已执行 bash tools/ci/test_stability_guards.shbash tools/ci/architecture_guards.sh,均通过。


📎 完整 codex 原始输出(存档备查)
---
pr: 1002
role: tests
verdict: approve
---

## Verdict
Test coverage and guard verification are adequate for the StreamingProxy soft-deprecation diff.

## Evidence
- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:125` asserts the endpoint source keeps `AddDeprecationHeadersAsync` attached to the mapped route group, covering the regression risk that the deprecated StreamingProxy routes stop advertising deprecation.
- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:136` asserts the emitted `Deprecation`, `Sunset`, and `Link` header values, plus the `/v1/responses` successor route.
- `tools/ci/architecture_guards.sh:183` adds the static no-new-production-consumers guard for StreamingProxy; `bash tools/ci/architecture_guards.sh` passed locally.
- `bash tools/ci/test_stability_guards.sh` passed locally; the PR did not add `Task.Delay`, `Thread.Sleep`, `[Skip]`, manual traits, polling allowlist entries, or loosened assertions.
- `dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests` passed locally: 50 passed, 0 failed, 0 skipped.

REVIEW_DONE:1002:tests-r1:approve
⟦AI:AUTO-LOOP

REVIEW_DONE:1002:tests-r1:approve
⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

📊 codex 进展 review-pr1002-architect-r1 (⏳ 进行中; 已跑 4 min)

+pr: 1002
+role: architect
+verdict: comment
+---
+
+## Verdict
+comment-only: the soft-deprecation architecture is aligned, but the new endpoint filter/helper lacks the required refactor-loop Old/New pattern comment.
+
+## Evidence
+- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:59` adds `AddDeprecationHeadersAsync` and `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:67` adds `AddDeprecationHeaders` without a nearby `// Refactor (iterN/cluster-XXX): Old pattern: ... New principle: ...` comment. Reviewer checklist requires: "Old/New pattern comment: each refactored type/method has `// Refactor (iterN/cluster-XXX): Old pattern: …  New principle: …`."
+- No reject-level CLAUDE/AGENTS violation found in this diff. The route remains a Host compatibility surface, adds honest `Deprecation`/`Sunset`/`Link` headers, updates canon/docs, and adds `tools/ci/architecture_guards.sh` coverage to block new production consumers. `bash tools/ci/architecture_guards.sh` passed.
+
+## What would change your verdict
+Add a concise `Refactor (iter92/cluster-645)` Old/New comment next to the new deprecation filter/header helper or the route group registration, explaining that the old pattern left StreamingProxy looking like an active streaming integration point and the new principle keeps it mapped only as a sunset compatibility surface with explicit migration headers.
+
+REVIEW_DONE:1002:architect:comment
+⟦AI:AUTO-LOOP⟧

tokens used
77,598
已按流程完成 PR #1002 architect r1 review。

结论:`comment`,非阻塞。  
发现点:新增 deprecation header/filter helper 缺少 reviewer 流程要求的 `Refactor (iter92/cluster-645): Old pattern ... New principle ...` 注释。未发现 CLAUDE/AGENTS 架构阻塞。

自动更新每 10 分钟;edit-in-place 不堆评论;codex 完成后此 comment 自动删除(per Auric "完成后删掉就好了 否则太占空间")。
🤖 controller progress reporter

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

📊 codex 进展 review-pr1002-quality-r1 (⏳ 进行中; 已跑 4 min)

+verdict: reject
+---
+
+## Verdict
+Reject: the change is small and focused, but it misses the mandated cluster-level refactor self-doc comment for the new StreamingProxy deprecation behavior and guard.
+
+## Evidence
+- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:20`: the new deprecation/sunset constants and route filter are introduced under the existing `iter38/cluster-038` comment, so a reader cannot tell why `iter92/cluster-645` changed this compatibility surface or what old/new behavior is being preserved.
+- `tools/ci/architecture_guards.sh:183`: the new guard uses a plain `Issue #645` comment instead of the required `// Refactor (iterN/cluster-XXX):` Old/New block, so it does not satisfy the reviewer-quality checklist's self-doc requirement for cluster refactors.
+- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:125`: the added source assertion is reachable and focused, but there is no adjacent cluster-645 self-doc in the production/guard changes it protects.
+
+## What would change your verdict
+Add clear `Refactor (iter92/cluster-645-...)` Old/New comments near the endpoint deprecation header/filter and the CI guard, explaining the previous behavior ("StreamingProxy remained a normal reusable public route / no guard blocked new production consumers") and the new principle ("StreamingProxy is compatibility-only until sunset; new direct model streaming uses `/v1/responses`; room fan-out needs a named contract").
+
+REVIEW_DONE:1002:quality-r1:reject
+⟦AI:AUTO-LOOP⟧

tokens used
98,533
Posted the Phase 8 quality review to PR #1002:

https://github.com/aevatarAI/aevatar/pull/1002#issuecomment-4529722776

Verdict: `reject`

自动更新每 10 分钟;edit-in-place 不堆评论;codex 完成后此 comment 自动删除(per Auric "完成后删掉就好了 否则太占空间")。
🤖 controller progress reporter

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

📊 codex 进展 review-pr1002-tests-r1 (⏳ 进行中; 已跑 4 min)

+
+## Verdict
+Test coverage and guard verification are adequate for the StreamingProxy soft-deprecation diff.
+
+## Evidence
+- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:125` asserts the endpoint source keeps `AddDeprecationHeadersAsync` attached to the mapped route group, covering the regression risk that the deprecated StreamingProxy routes stop advertising deprecation.
+- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:136` asserts the emitted `Deprecation`, `Sunset`, and `Link` header values, plus the `/v1/responses` successor route.
+- `tools/ci/architecture_guards.sh:183` adds the static no-new-production-consumers guard for StreamingProxy; `bash tools/ci/architecture_guards.sh` passed locally.
+- `bash tools/ci/test_stability_guards.sh` passed locally; the PR did not add `Task.Delay`, `Thread.Sleep`, `[Skip]`, manual traits, polling allowlist entries, or loosened assertions.
+- `dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests` passed locally: 50 passed, 0 failed, 0 skipped.
+
+REVIEW_DONE:1002:tests-r1:approve
+⟦AI:AUTO-LOOP⟧

tokens used
77,839
Posted the Phase 8 tests reviewer comment for PR #1002:

https://github.com/aevatarAI/aevatar/pull/1002#issuecomment-4529723251

Verdict: `approve`

Verified locally:
- `dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests` → 50 passed
- `bash tools/ci/test_stability_guards.sh` → passed

自动更新每 10 分钟;edit-in-place 不堆评论;codex 完成后此 comment 自动删除(per Auric "完成后删掉就好了 否则太占空间")。
🤖 controller progress reporter

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

🔧 Phase 8 r1 评审 — quality reject(self-doc 缺)→ fix r2

  • 🤖 architect: comment
  • 🤖 tests: approve
  • 🤖 quality: reject(cluster Refactor (iter92/cluster-645) Old/New 自说明缺)

🔧 fix r2 codex 派出:加 cluster self-doc 到 StreamingProxyEndpoints + guard 上方。

⟦AI:AUTO-LOOP⟧

… StreamingProxy endpoints + guard

- agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs: Old/New self-doc above the deprecation header block; old = public streaming proxy entry, new = soft-deprecated compatibility-only with Sunset header
- tools/ci/architecture_guards.sh: Old/New self-doc above new guard; old = no block on adding StreamingProxy consumer, new = guard rejects new consumers, direct model streaming goes via /v1/responses

⟦AI:AUTO-LOOP⟧
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

🤖 Phase 8 Reviewer — quality (round 2)

TL;DR


详细说明

r1 阻塞点已修复:agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:29 现在说明旧模式是 StreamingProxy 仍像公开生产 streaming 入口,新原则是这些 route 只保留为 compatibility-only,并通过 sunset header 指向 /v1/responsestools/ci/architecture_guards.sh:183 也补了同一 cluster 的 Old/New 块,说明旧状态没有阻止新增生产 consumer,新 guard 会阻止 wrapper、re-map 和新 consumer。

从 quality 角度没有新的 reject/comment 点:新增 header 常量和 AddDeprecationHeadersAsync / AddDeprecationHeaders 命名清楚、调用链直接;新增测试只覆盖 deprecation filter 和 header 语义;未看到死代码、重复抽象或 unrelated cleanup。已验证 dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests 通过(50 passed / 0 failed / 0 skipped),bash tools/ci/architecture_guards.sh 通过。


📎 完整 codex 原始输出(存档备查)
---
pr: 1002
role: quality
verdict: approve
---

## Verdict
Approve: the round-1 self-doc reject has been fixed, and the StreamingProxy soft-deprecation diff remains small, readable, and focused.

## Evidence
- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:29` now has a clear `Refactor (iter92/cluster-645)` Old/New block explaining the old public production entry point and the new compatibility-only sunset behavior.
- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:38` applies the deprecation header filter at the route group, and the helper at `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:71` is small, directly used, and named by behavior.
- `tools/ci/architecture_guards.sh:183` now has the required `Refactor (iter92/cluster-645)` Old/New block for the new consumer guard, explaining the prior missing guard and the new `/v1/responses` direction.
- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:125` and `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:136` keep the added checks focused on the deprecation filter and advertised headers.
- Verification: `dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests` passed with 50 passed, 0 failed, 0 skipped.
- Verification: `bash tools/ci/architecture_guards.sh` passed.

REVIEW_DONE:1002:quality-r2:approve
⟦AI:AUTO-LOOP

REVIEW_DONE:1002:quality-r2:approve
⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

🤖 Phase 8 Reviewer — tests (round 2)

TL;DR


详细说明

我复核了本轮 diff 里和测试相关的覆盖点。StreamingProxyEndpoints 是 StreamingProxy HTTP route 的 endpoint 定义;现在在 MapStreamingProxyEndpoints 上方已有 iter92/cluster-645 的 Old/New self-doc,并且 endpoint group 挂了 deprecation filter。architecture_guards.sh 是架构静态门禁脚本;StreamingProxy consumer guard 上方也已有同一条 Old/New self-doc。

测试覆盖方面,新增测试覆盖了两类核心回归:一是 source regression 断言 endpoint group 仍绑定 AddDeprecationHeadersAsync,二是直接断言 DeprecationSunsetLink header 与 /v1/responses successor route。没有发现新增 Task.DelayThread.Sleep[Skip]、manual trait、polling allowlist 或弱化断言。

已跑验证:

命令 结果
bash tools/ci/test_stability_guards.sh 通过
bash tools/ci/architecture_guards.sh 通过
dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests 通过,50 passed / 0 failed / 0 skipped

📎 完整 codex 原始输出(存档备查)
---
pr: 1002
role: tests
verdict: approve
---

## Verdict
Test coverage and guard verification are adequate for the StreamingProxy soft-deprecation diff after the round-1 quality self-doc fix.

## Evidence
- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:29` now has the requested `Refactor (iter92/cluster-645)` Old/New self-documentation above `MapStreamingProxyEndpoints`, matching the r1 quality reject fix request.
- `tools/ci/architecture_guards.sh:183` now has the requested `Refactor (iter92/cluster-645)` Old/New self-documentation above the StreamingProxy consumer guard.
- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:125` asserts the endpoint source keeps `AddDeprecationHeadersAsync` attached to the mapped route group, covering the regression risk that deprecated StreamingProxy routes stop advertising deprecation.
- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:136` asserts the emitted `Deprecation`, `Sunset`, and `Link` header values, plus the `/v1/responses` successor route.
- `tools/ci/architecture_guards.sh:187` adds the static no-new-production-consumers guard for StreamingProxy; `bash tools/ci/architecture_guards.sh` passed locally.
- `bash tools/ci/test_stability_guards.sh` passed locally; the PR did not add `Task.Delay`, `Thread.Sleep`, `[Skip]`, manual traits, polling allowlist entries, or loosened assertions.
- `dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests` passed locally: 50 passed, 0 failed, 0 skipped.

REVIEW_DONE:1002:tests-r2:approve
⟦AI:AUTO-LOOP

REVIEW_DONE:1002:tests-r2:approve
⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

🤖 Phase 8 Reviewer — architect (round 2)

TL;DR

  • 这是什么:architect r2 复审 PR iter92 cluster-645: soft-deprecate StreamingProxy with Sunset header #1002 的 StreamingProxy 软废弃架构变更。
  • 结论:approve;r1/r2 要求的 Refactor (iter92/cluster-645) Old/New self-doc 已补到 endpoint 与 guard。
  • 下一步:controller 可以把 architect 角色视为通过,继续汇总其他 reviewer 结果。

详细说明

StreamingProxyEndpoints 现在在路由映射上方说明旧模式是把 StreamingProxy 当作生产消费者可继续接入的 public streaming 入口,新原则是只保留兼容 route,并通过 DeprecationSunset、successor Link header 指向 /v1/responsesarchitecture_guards.sh 也在新增 guard 上方说明旧模式是没有阻止新增 StreamingProxy consumer,新原则是阻止新增 consumer、wrapper 或 re-map。

我按 merge-base diff 复查了 architect 角度的高风险项:未发现新增 actor.HandleEventAsync(SubscribeAsync<EventEnvelope>、内部 JSON state 序列化、生产 Task.Delay(GetAwaiter().GetResult()TypeUrl.Contains(...)、跨层事实态 Dictionary<>/ConcurrentDictionary、raw HttpClient[Skip]bash tools/ci/architecture_guards.sh 已通过。NyxID 只出现在文档迁移口径里;已确认 ../NyxID 存在,本 PR 不依赖也不修改外部仓库 surface。


📎 完整 codex 原始输出(存档备查)
---
pr: 1002
role: architect
verdict: approve
---

## Verdict
approve: r1/r2 self-doc gap is fixed and the current diff does not introduce an architecture compliance blocker.

## Evidence
- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:29` now has `Refactor (iter92/cluster-645)` Old/New self-doc explaining the old public StreamingProxy entry-point pattern and the new compatibility-only sunset-header principle.
- `tools/ci/architecture_guards.sh:183` now has `Refactor (iter92/cluster-645)` Old/New self-doc above the new StreamingProxy consumer guard.
- The PR keeps StreamingProxy as a retained Host compatibility surface, marks it with honest `Deprecation`/`Sunset`/successor `Link` headers, and updates canon/docs to direct new model streaming to `/v1/responses`; this aligns with CLAUDE.md: "删除优先:空转发、重复抽象、无业务价值代码直接删除,不保留兼容空壳。" because the retained route is documented as an existing public compatibility contract rather than a new empty shim or second streaming system.
- Anti-pattern grep over the merge-base diff for `actor.HandleEventAsync(`, `SubscribeAsync<EventEnvelope>`, JSON state serialization, production `Task.Delay(`, `GetAwaiter().GetResult()`, `TypeUrl.Contains(...)`, cross-layer `Dictionary<>`/`ConcurrentDictionary`, raw `HttpClient`, and `[Skip]` found no architect-level regression.
- `bash tools/ci/architecture_guards.sh` passed.
- NyxID appears only in documentation context; `../NyxID` exists, but this PR does not require or modify external NyxID surface, consistent with CLAUDE.md: "外部仓库无改动权:本仓库需求禁止依赖 NyxID / chrono-storage / chrono-ornn 等外部仓库新增或修改".

REVIEW_DONE:1002:architect-r2:approve
⟦AI:AUTO-LOOP

REVIEW_DONE:1002:architect-r2:approve
⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

✅ Phase 8 r2 集中评审

  • 🤖 architect r2: approve
  • 🤖 tests r2: approve
  • 🤖 quality r2: approve

3/3 → auto-merge。

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

🤖 Phase 8 Reviewer — architect (round 2)

TL;DR

  • 这是什么:architect r2 复审 PR iter92 cluster-645: soft-deprecate StreamingProxy with Sunset header #1002 的 StreamingProxy 软废弃架构变更。
  • 结论:approve;r1/r2 要求的 Refactor (iter92/cluster-645) Old/New self-doc 已补到 endpoint 与 guard。
  • 下一步:controller 可以把 architect 角色视为通过,继续汇总其他 reviewer 结果。

详细说明

StreamingProxyEndpoints 现在在路由映射上方说明旧模式是把 StreamingProxy 当作生产消费者可继续接入的 public streaming 入口,新原则是只保留兼容 route,并通过 DeprecationSunset、successor Link header 指向 /v1/responsesarchitecture_guards.sh 也在新增 guard 上方说明旧模式是没有阻止新增 StreamingProxy consumer,新原则是阻止新增 consumer、wrapper 或 re-map。

我按 merge-base diff 复查了 architect 角度的高风险项:未发现新增 actor.HandleEventAsync(SubscribeAsync<EventEnvelope>、内部 JSON state 序列化、生产 Task.Delay(GetAwaiter().GetResult()TypeUrl.Contains(...)、跨层事实态 Dictionary<>/ConcurrentDictionary、raw HttpClient[Skip]bash tools/ci/architecture_guards.sh 已通过。NyxID 只出现在文档迁移口径里;已确认 ../NyxID 存在,本 PR 不依赖也不修改外部仓库 surface。


📎 完整 codex 原始输出(存档备查)
---
pr: 1002
role: architect
verdict: approve
---

## Verdict
approve: r1/r2 self-doc gap is fixed and the current diff does not introduce an architecture compliance blocker.

## Evidence
- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:29` now has `Refactor (iter92/cluster-645)` Old/New self-doc explaining the old public StreamingProxy entry-point pattern and the new compatibility-only sunset-header principle.
- `tools/ci/architecture_guards.sh:183` now has `Refactor (iter92/cluster-645)` Old/New self-doc above the new StreamingProxy consumer guard.
- The PR keeps StreamingProxy as a retained Host compatibility surface, marks it with honest `Deprecation`/`Sunset`/successor `Link` headers, and updates canon/docs to direct new model streaming to `/v1/responses`; this aligns with CLAUDE.md: "删除优先:空转发、重复抽象、无业务价值代码直接删除,不保留兼容空壳。" because the retained route is documented as an existing public compatibility contract rather than a new empty shim or second streaming system.
- Anti-pattern grep over the merge-base diff for `actor.HandleEventAsync(`, `SubscribeAsync<EventEnvelope>`, JSON state serialization, production `Task.Delay(`, `GetAwaiter().GetResult()`, `TypeUrl.Contains(...)`, cross-layer `Dictionary<>`/`ConcurrentDictionary`, raw `HttpClient`, and `[Skip]` found no architect-level regression.
- `bash tools/ci/architecture_guards.sh` passed.
- NyxID appears only in documentation context; `../NyxID` exists, but this PR does not require or modify external NyxID surface, consistent with CLAUDE.md: "外部仓库无改动权:本仓库需求禁止依赖 NyxID / chrono-storage / chrono-ornn 等外部仓库新增或修改".

REVIEW_DONE:1002:architect-r2:approve
⟦AI:AUTO-LOOP

REVIEW_DONE:1002:architect-r2:approve
⟦AI:AUTO-LOOP⟧

…ster-645-streamingproxy-deprecate

# Conflicts:
#	tools/ci/architecture_guards.sh
@loning loning merged commit 7de766c into auto-refact-dev May 24, 2026
10 of 11 checks passed
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

📊 codex 进展 fix-pr1002-r2 (⏳ 进行中; 已跑 11 min)

-# Issue #645:
-#   StreamingProxy stays mapped only as a deprecated public compatibility route.
-#   New production consumers must not call, wrap, or re-map it; direct model
-#   streaming moves to /v1/responses, while room fan-out needs a named contract.
+# Refactor (iter92/cluster-645):
+#   Old pattern: no guard blocked new production consumers from depending on StreamingProxy.
+#   New principle: this guard prevents new consumers, wrappers, or re-maps; direct model streaming goes through /v1/responses.
 set +e
 streaming_proxy_consumer_report="$(
   rg -n "streaming-proxy|MapStreamingProxyEndpoints|AddStreamingProxy|Aevatar\.GAgents\.StreamingProxy" \

tokens used
37,716
Implemented the requested cluster self-doc updates in:

- [StreamingProxyEndpoints.cs](/Users/auric/aevatar-wt-iter92-cluster-645-streamingproxy-deprecate/agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:26)
- [architecture_guards.sh](/Users/auric/aevatar-wt-iter92-cluster-645-streamingproxy-deprecate/tools/ci/architecture_guards.sh:180)

Validation passed:

- `dotnet build aevatar.slnx --nologo`
- `bash tools/ci/test_stability_guards.sh`
- `bash tools/ci/architecture_guards.sh`

No commit/push/branch/checkout performed.

自动更新每 10 分钟;edit-in-place 不堆评论;codex 完成后此 comment 自动删除(per Auric "完成后删掉就好了 否则太占空间")。
🤖 controller progress reporter

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

📊 codex 进展 resolve-pr1002-conflict (⏳ 进行中; 已跑 7 min)

+  exit 1
+fi
+
 # Issue #643:
 #   Old: Foundation MultiAgent experimental actors/protos stayed visible as
 #   production GAgent surface without production callers. Studio empty-state
@@ -278,7 +279,6 @@
   -g '!*.Designer.cs'
 then
   echo "Studio empty-state generation must stay demoted to Application authoring preview helpers, not endpoint GAgents."
->>>>>>> origin/auto-refact-dev
   exit 1
 fi
 

tokens used
44,088
Resolved and pushed PR #1002 merge conflict.

Checks passed:
- `dotnet build aevatar.slnx --nologo`
- `bash tools/ci/architecture_guards.sh`
- `bash tools/ci/test_stability_guards.sh`

Merge commit pushed:

自动更新每 10 分钟;edit-in-place 不堆评论;codex 完成后此 comment 自动删除(per Auric "完成后删掉就好了 否则太占空间")。
🤖 controller progress reporter

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

📊 codex 进展 review-pr1002-architect-r2 (⏳ 进行中; 已跑 11 min)

+## Verdict
+approve: r1/r2 self-doc gap is fixed and the current diff does not introduce an architecture compliance blocker.
+
+## Evidence
+- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:29` now has `Refactor (iter92/cluster-645)` Old/New self-doc explaining the old public StreamingProxy entry-point pattern and the new compatibility-only sunset-header principle.
+- `tools/ci/architecture_guards.sh:183` now has `Refactor (iter92/cluster-645)` Old/New self-doc above the new StreamingProxy consumer guard.
+- The PR keeps StreamingProxy as a retained Host compatibility surface, marks it with honest `Deprecation`/`Sunset`/successor `Link` headers, and updates canon/docs to direct new model streaming to `/v1/responses`; this aligns with CLAUDE.md: "删除优先:空转发、重复抽象、无业务价值代码直接删除,不保留兼容空壳。" because the retained route is documented as an existing public compatibility contract rather than a new empty shim or second streaming system.
+- Anti-pattern grep over the merge-base diff for `actor.HandleEventAsync(`, `SubscribeAsync<EventEnvelope>`, JSON state serialization, production `Task.Delay(`, `GetAwaiter().GetResult()`, `TypeUrl.Contains(...)`, cross-layer `Dictionary<>`/`ConcurrentDictionary`, raw `HttpClient`, and `[Skip]` found no architect-level regression.
+- `bash tools/ci/architecture_guards.sh` passed.
+- NyxID appears only in documentation context; `../NyxID` exists, but this PR does not require or modify external NyxID surface, consistent with CLAUDE.md: "外部仓库无改动权:本仓库需求禁止依赖 NyxID / chrono-storage / chrono-ornn 等外部仓库新增或修改".
+
+REVIEW_DONE:1002:architect-r2:approve
+⟦AI:AUTO-LOOP⟧

tokens used
71,985
已完成 Phase 8 architect r2 review。

结果:`approve`

已验证:
- `StreamingProxyEndpoints.cs` 已有 `Refactor (iter92/cluster-645)` Old/New self-doc。
- `tools/ci/architecture_guards.sh` 已有对应 Old/New self-doc。
- `bash tools/ci/architecture_guards.sh` 通过。
- 已按要求发 PR 评论:  

自动更新每 10 分钟;edit-in-place 不堆评论;codex 完成后此 comment 自动删除(per Auric "完成后删掉就好了 否则太占空间")。
🤖 controller progress reporter

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

📊 codex 进展 review-pr1002-quality-r2 (⏳ 进行中; 已跑 11 min)

+
+## Verdict
+Approve: the round-1 self-doc reject has been fixed, and the StreamingProxy soft-deprecation diff remains small, readable, and focused.
+
+## Evidence
+- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:29` now has a clear `Refactor (iter92/cluster-645)` Old/New block explaining the old public production entry point and the new compatibility-only sunset behavior.
+- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:38` applies the deprecation header filter at the route group, and the helper at `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:71` is small, directly used, and named by behavior.
+- `tools/ci/architecture_guards.sh:183` now has the required `Refactor (iter92/cluster-645)` Old/New block for the new consumer guard, explaining the prior missing guard and the new `/v1/responses` direction.
+- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:125` and `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:136` keep the added checks focused on the deprecation filter and advertised headers.
+- Verification: `dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests` passed with 50 passed, 0 failed, 0 skipped.
+- Verification: `bash tools/ci/architecture_guards.sh` passed.
+
+REVIEW_DONE:1002:quality-r2:approve
+⟦AI:AUTO-LOOP⟧

tokens used
83,688
Posted quality round 2 review on PR #1002:

https://github.com/aevatarAI/aevatar/pull/1002#issuecomment-4529736854

Verdict: `approve`

Verified:
- `dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests` → 50 passed

自动更新每 10 分钟;edit-in-place 不堆评论;codex 完成后此 comment 自动删除(per Auric "完成后删掉就好了 否则太占空间")。
🤖 controller progress reporter

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 24, 2026

📊 codex 进展 review-pr1002-tests-r2 (⏳ 进行中; 已跑 11 min)

+
+## Evidence
+- `agents/Aevatar.GAgents.StreamingProxy/StreamingProxyEndpoints.cs:29` now has the requested `Refactor (iter92/cluster-645)` Old/New self-documentation above `MapStreamingProxyEndpoints`, matching the r1 quality reject fix request.
+- `tools/ci/architecture_guards.sh:183` now has the requested `Refactor (iter92/cluster-645)` Old/New self-documentation above the StreamingProxy consumer guard.
+- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:125` asserts the endpoint source keeps `AddDeprecationHeadersAsync` attached to the mapped route group, covering the regression risk that deprecated StreamingProxy routes stop advertising deprecation.
+- `test/Aevatar.AI.Tests/StreamingProxyCoverageTests.cs:136` asserts the emitted `Deprecation`, `Sunset`, and `Link` header values, plus the `/v1/responses` successor route.
+- `tools/ci/architecture_guards.sh:187` adds the static no-new-production-consumers guard for StreamingProxy; `bash tools/ci/architecture_guards.sh` passed locally.
+- `bash tools/ci/test_stability_guards.sh` passed locally; the PR did not add `Task.Delay`, `Thread.Sleep`, `[Skip]`, manual traits, polling allowlist entries, or loosened assertions.
+- `dotnet test test/Aevatar.AI.Tests/Aevatar.AI.Tests.csproj --nologo --filter StreamingProxyCoverageTests` passed locally: 50 passed, 0 failed, 0 skipped.
+
+REVIEW_DONE:1002:tests-r2:approve
+⟦AI:AUTO-LOOP⟧

tokens used
59,202
Phase 8 tests reviewer r2 completed and posted to PR #1002:

https://github.com/aevatarAI/aevatar/pull/1002#issuecomment-4529738467

Verdict: `approve`

Verified:
- r1 quality reject fix is present in `StreamingProxyEndpoints` and `architecture_guards.sh`.
- `bash tools/ci/test_stability_guards.sh` passed.
- `bash tools/ci/architecture_guards.sh` passed.

自动更新每 10 分钟;edit-in-place 不堆评论;codex 完成后此 comment 自动删除(per Auric "完成后删掉就好了 否则太占空间")。
🤖 controller progress reporter

@loning loning mentioned this pull request May 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auto-loop Created by codex-refactor-loop skill 🔧 phase:fixing 🚀 phase:pr-open

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant