Skip to content

iter56 cluster-917: ChatRequestEvent.Telegram typed + 删 hot-path Headers/Metadata bag#922

Merged
loning merged 6 commits into
auto-refact-devfrom
refactor/iter56-cluster-917-workflow-llm-control-metadata
May 23, 2026
Merged

iter56 cluster-917: ChatRequestEvent.Telegram typed + 删 hot-path Headers/Metadata bag#922
loning merged 6 commits into
auto-refact-devfrom
refactor/iter56-cluster-917-workflow-llm-control-metadata

Conversation

@loning
Copy link
Copy Markdown
Contributor

@loning loning commented May 23, 2026

摘要

iter56 cluster-917 — Phase 9 r3 unanimous(3/3 after reflector r1 narrow):

核心:ChatRequestEvent.Telegram typed submessage + 删 hot-path Headers/Metadata bag

  • ChatRequestEvent.Telegram typed submessage:chatId / operation / wait / poll / login 等 control fields
  • TelegramBridgeGAgent 不再用 `Headers` 当 primary source for control reads
  • RoleGAgent / ChatRuntime / StreamingProxy 用 typed LLM/tool contexts(不 merge Headers/Metadata)
  • 删除 hot-path Headers/Metadata bag reader
  • Workflow producers 填 typed Telegram/tool context fields

边界(per reflector r1 narrowing constraint)

  • 不动 `docs/canon/*`
  • 不加 新 bridge inbox event / envelope kind / actor type / Projection phase
  • 不加 generic `ControlMetadata` / `Any` / 第二个 bag
  • 复用现有 typed contexts(per consensus)

影响范围

21 files changed,LOC +808 / -354

Coverage

  • TelegramBridgeGAgent line-rate 89.7%(超 80% threshold)
  • Root report line-rate 2.91% 是 coverlet 包了 full dependency closure,不代表本 PR coverage

验证

  • bash tools/ci/test_stability_guards.sh PASS
  • bash tools/ci/architecture_guards.sh PASS
  • dotnet test aevatar.slnx --nologo PASS

Closes #917

🤖 Auto-loop / codex-refactor-loop iter56

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — reviewer 派出

维度
阶段 派出 codex(role=reviewer)
codex log review-pr922-omnibus-r1.log
工作目录 /Users/auric/aevatar
timeout 5400s(~90 min 上限)
上下文 omnibus r1 派出(typed Telegram + delete Headers bag,21 files +808/-354)
下一步自动会做 1. 三 reviewer 完成 verdict marker 2. controller 计算 consensus 3. unanimous → auto-merge / reject → fix r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — fix 派出

维度
阶段 派出 codex(role=fix)
codex log fix-pr922-r2.log
工作目录 /Users/auric/aevatar-wt-iter56-cluster-917-workflow-llm-control-metadata
timeout 5400s(~90 min 上限)
上下文 r1 reject(proto3 默认值变更:poll_timeout/settle_polls absent→0 而非 old 8/1 regression)→ fix r2 改 optional + has 判 absent
下一步自动会做 1. fix r 完成 marker FIX_DONE:... 2. controller commit + push 3. 派 reviewer r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — reviewer 派出

维度
阶段 派出 codex(role=reviewer)
codex log review-pr922-omnibus-r3.log
工作目录 /Users/auric/aevatar
timeout 5400s(~90 min 上限)
上下文 omnibus r3 派出 verify r2 fix(proto optional + Has presence)
下一步自动会做 1. 三 reviewer 完成 verdict marker 2. controller 计算 consensus 3. unanimous → auto-merge / reject → fix r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 codex 进展 review-pr922-omnibus-r1 (⏳ 进行中; 已跑 9 min)

`TelegramBridgeRequest` is typed, and the hot-path `TelegramBridgeGAgent` no longer reads Telegram control values from `Headers`/`Metadata`. Tests also cover typed Telegram flow and legacy header non-routing, and local guards passed:

- `test_stability_guards.sh`: PASS
- `architecture_guards.sh`: PASS
- `TelegramBridgeGAgent` coverage: `line-rate="0.897"` in coverage XML

Reject reason: `poll_timeout_seconds` and `settle_polls_after_match` are non-optional proto3 scalar fields, so absent values arrive as `0`. In `TelegramBridgeGAgent`, that changes default wait-reply behavior: absent `poll_timeout_seconds` now clamps to `1` instead of defaulting to `8`, and absent `settle_polls_after_match` becomes `0` instead of defaulting to `1`. This is a behavior regression caused by the typed migration.

Reject verbatim demand: Make default-sensitive Telegram numeric control fields presence-aware, at minimum `poll_timeout_seconds` and `settle_polls_after_match`, and add regression coverage proving absent typed fields keep the old defaults while explicit `0` still has the intended explicit behavior.

REVIEW_DONE:922:omnibus:reject
⟦AI:AUTO-LOOP⟧
tokens used
88,316
Found one blocking issue.

`TelegramBridgeRequest` is typed, and the hot-path `TelegramBridgeGAgent` no longer reads Telegram control values from `Headers`/`Metadata`. Tests also cover typed Telegram flow and legacy header non-routing, and local guards passed:

- `test_stability_guards.sh`: PASS
- `architecture_guards.sh`: PASS
- `TelegramBridgeGAgent` coverage: `line-rate="0.897"` in coverage XML

Reject reason: `poll_timeout_seconds` and `settle_polls_after_match` are non-optional proto3 scalar fields, so absent values arrive as `0`. In `TelegramBridgeGAgent`, that changes default wait-reply behavior: absent `poll_timeout_seconds` now clamps to `1` instead of defaulting to `8`, and absent `settle_polls_after_match` becomes `0` instead of defaulting to `1`. This is a behavior regression caused by the typed migration.

Reject verbatim demand: Make default-sensitive Telegram numeric control fields presence-aware, at minimum `poll_timeout_seconds` and `settle_polls_after_match`, and add regression coverage proving absent typed fields keep the old defaults while explicit `0` still has the intended explicit behavior.

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

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — fix 派出

维度
阶段 派出 codex(role=fix)
codex log fix-pr922-r4.log
工作目录 /Users/auric/aevatar-wt-iter56-cluster-917-workflow-llm-control-metadata
timeout 5400s(~90 min 上限)
上下文 r3 reject 2/4 fields 仍 fallback → fix r4 完整 4/4
下一步自动会做 1. fix r 完成 marker FIX_DONE:... 2. controller commit + push 3. 派 reviewer r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — reviewer 派出

维度
阶段 派出 codex(role=reviewer)
codex log review-pr922-omnibus-r5.log
工作目录 /Users/auric/aevatar
timeout 5400s(~90 min 上限)
上下文 omnibus r5 派出 verify 4/4 fields explicit 0 preservation
下一步自动会做 1. 三 reviewer 完成 verdict marker 2. controller 计算 consensus 3. unanimous → auto-merge / reject → fix r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 codex 进展 fix-pr922-r4 (⏳ 进行中; 已跑 7 min)

 
         await agent.HandleEventAsync(Envelope(request), CancellationToken.None);
 
         var command = publisher.Sent.Should().ContainSingle().Subject.evt
             .Should().BeOfType<TelegramWaitForReplyCommand>().Subject;
+        command.WaitTimeoutMs.Should().Be(0);
         command.PollTimeoutSeconds.Should().Be(0);
         command.SettlePollsAfterMatch.Should().Be(0);
+        command.ConnectorParameters["timeout_ms"].Should().Be("0");
     }
 
     [Fact]

tokens used
84,173
Implemented explicit zero preservation for all 4 Telegram controls.

Changed:
- `wait_timeout_ms`: presence-based, explicit `0` preserved.
- `timeout_ms`: presence-based, explicit `0` forwarded to connector parameters.
- Regression test expanded to cover `wait_timeout_ms`, `poll_timeout_seconds`, `settle_polls_after_match`, and `timeout_ms`.

Verified:
- `dotnet test test/Aevatar.Workflow.Host.Api.Tests/Aevatar.Workflow.Host.Api.Tests.csproj --nologo --filter TelegramBridgeGAgentTests` passed: 25 passed, 0 skipped.
- `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 23, 2026

📊 状态卡片 — fix 派出

维度
阶段 派出 codex(role=fix)
codex log fix-pr922-r5.log
工作目录 /Users/auric/aevatar-wt-iter56-cluster-917-workflow-llm-control-metadata
timeout 5400s(~90 min 上限)
上下文 r5 reject 3 blockers(build break + LLMCallModule producer + regression coverage)→ fix r5
下一步自动会做 1. fix r 完成 marker FIX_DONE:... 2. controller commit + push 3. 派 reviewer r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 codex 进展 review-pr922-omnibus-r3 (⏳ 进行中; 已跑 13 min)

- Presence checks exist for all 4.
- Absent `poll_timeout_seconds` / `settle_polls_after_match` regressions cover legacy `8/1`.
- Explicit `0` is preserved only for `poll_timeout_seconds` and `settle_polls_after_match`.
- `test_stability_guards.sh`: PASS.
- `architecture_guards.sh`: PASS.
- `dotnet test ... --filter Telegram --nologo`: PASS, 31/31.
- `dotnet test ... --filter ChatBridge --nologo`: no matching tests found in this project.

REVIEW_DONE:922:omnibus:reject
⟦AI:AUTO-LOOP⟧
tokens used
68,004
Reject.

Finding: r2 does not preserve explicit `0` for all 4 optional numeric fields. [TelegramBridgeGAgent.cs](/Users/auric/aevatar-wt-iter56-cluster-917-workflow-llm-control-metadata/src/workflow/extensions/Aevatar.Workflow.Extensions.Bridge/TelegramBridgeGAgent.cs:224) still maps explicit `wait_timeout_ms = 0` to `DefaultWaitReplyTimeoutMs`, and [TelegramBridgeGAgent.cs](/Users/auric/aevatar-wt-iter56-cluster-917-workflow-llm-control-metadata/src/workflow/extensions/Aevatar.Workflow.Extensions.Bridge/TelegramBridgeGAgent.cs:290) still maps explicit `timeout_ms = 0` to null / LLM fallback. The new regression test only covers explicit zero for `poll_timeout_seconds` and `settle_polls_after_match`, not all 4 fields.

Verified:
- Proto fields 12, 13, 14, 20 are `optional`.
- Presence checks exist for all 4.
- Absent `poll_timeout_seconds` / `settle_polls_after_match` regressions cover legacy `8/1`.
- Explicit `0` is preserved only for `poll_timeout_seconds` and `settle_polls_after_match`.
- `test_stability_guards.sh`: PASS.
- `architecture_guards.sh`: PASS.
- `dotnet test ... --filter Telegram --nologo`: PASS, 31/31.
- `dotnet test ... --filter ChatBridge --nologo`: no matching tests found in this project.

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

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 codex 进展 review-pr922-omnibus-r5 (⏳ 进行中; 已跑 7 min)

2. **BLOCKER**: 4/4 explicit-zero preservation is not complete across the producer path. Consumer-side `TelegramBridgeGAgent` is now presence-based for all 4 fields, but [LLMCallModule.cs](</tmp/aevatar-pr922/src/workflow/Aevatar.Workflow.Core/Modules/LLMCallModule.cs:465>) still parses `wait_timeout_ms` with `TryParsePositiveInt32`, and [LLMCallModule.cs](</tmp/aevatar-pr922/src/workflow/Aevatar.Workflow.Core/Modules/LLMCallModule.cs:506>) does the same for `telegram.timeout_ms` / `timeout_ms`. So workflow parameters containing `"0"` do not set proto presence for 2/4 fields.

3. **BLOCKER**: Regression coverage is incomplete. [TelegramBridgeGAgentTests.cs](</tmp/aevatar-pr922/test/Aevatar.Workflow.Host.Api.Tests/TelegramBridgeGAgentTests.cs:286>) covers manually constructed typed `TelegramBridgeRequest` with explicit zero, but it does not cover workflow parameter promotion from string `"0"` into typed proto presence, which is the path still broken above.

Verification:
- `bash /tmp/aevatar-pr922/tools/ci/test_stability_guards.sh`: PASS
- `bash /tmp/aevatar-pr922/tools/ci/architecture_guards.sh`: PASS
- `dotnet test --filter Telegram --nologo`: FAIL, compile errors CS0117 in `StreamingProxyGAgent.cs`

REVIEW_DONE:922:omnibus:reject
⟦AI:AUTO-LOOP⟧
tokens used
172,920
Findings:

1. **BLOCKER**: PR head does not compile under requested verification. `dotnet test --filter Telegram --nologo` exits `1` with CS0117 because [StreamingProxyGAgent.cs](</tmp/aevatar-pr922/agents/Aevatar.GAgents.StreamingProxy/StreamingProxyGAgent.cs:45>) still references `StreamingProxyRoomChatCommandEnvelopeFactory.AccessTokenHeader/PreferredRouteHeader/DefaultModelHeader`, but those constants were removed from the factory.

2. **BLOCKER**: 4/4 explicit-zero preservation is not complete across the producer path. Consumer-side `TelegramBridgeGAgent` is now presence-based for all 4 fields, but [LLMCallModule.cs](</tmp/aevatar-pr922/src/workflow/Aevatar.Workflow.Core/Modules/LLMCallModule.cs:465>) still parses `wait_timeout_ms` with `TryParsePositiveInt32`, and [LLMCallModule.cs](</tmp/aevatar-pr922/src/workflow/Aevatar.Workflow.Core/Modules/LLMCallModule.cs:506>) does the same for `telegram.timeout_ms` / `timeout_ms`. So workflow parameters containing `"0"` do not set proto presence for 2/4 fields.

3. **BLOCKER**: Regression coverage is incomplete. [TelegramBridgeGAgentTests.cs](</tmp/aevatar-pr922/test/Aevatar.Workflow.Host.Api.Tests/TelegramBridgeGAgentTests.cs:286>) covers manually constructed typed `TelegramBridgeRequest` with explicit zero, but it does not cover workflow parameter promotion from string `"0"` into typed proto presence, which is the path still broken above.

Verification:
- `bash /tmp/aevatar-pr922/tools/ci/test_stability_guards.sh`: PASS
- `bash /tmp/aevatar-pr922/tools/ci/architecture_guards.sh`: PASS
- `dotnet test --filter Telegram --nologo`: FAIL, compile errors CS0117 in `StreamingProxyGAgent.cs`

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

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — reviewer 派出

维度
阶段 派出 codex(role=reviewer)
codex log review-pr922-omnibus-r7.log
工作目录 /Users/auric/aevatar
timeout 5400s(~90 min 上限)
上下文 omnibus r7 派出 verify 3 blockers fixed(build + LLMCallModule + regression)
下一步自动会做 1. 三 reviewer 完成 verdict marker 2. controller 计算 consensus 3. unanimous → auto-merge / reject → fix r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — fix 派出

维度
阶段 派出 codex(role=fix)
codex log fix-pr922-r6-codecov.log
工作目录 /Users/auric/aevatar-wt-iter56-cluster-917-workflow-llm-control-metadata
timeout 5400s(~90 min 上限)
上下文 codecov/patch fail → fix r6 补 coverage
下一步自动会做 1. fix r 完成 marker FIX_DONE:... 2. controller commit + push 3. 派 reviewer r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

loning added 5 commits May 24, 2026 03:44
…ers/Metadata bag

#917 Phase 9 r3 consensus(3/3 after reflector narrow):

- 加 ChatRequestEvent.Telegram typed submessage(chatId/operation/wait/poll/login 等)
- TelegramBridgeGAgent 不再用 Headers 当 control field source
- RoleGAgent / ChatRuntime / StreamingProxy 用 typed LLM/tool contexts(不 merge Headers/Metadata)
- 删除 hot-path Headers/Metadata bag reader
- Workflow producers 填 typed Telegram/tool context fields

边界(per reflector r1):
- 不动 docs/canon/*
- 不加新 bridge inbox event / envelope kind / actor type / Projection phase
- 不加 generic ControlMetadata/Any/第二个 bag

LOC 21 files +808/-354
TelegramBridgeGAgent line-rate 89.7%
test_stability_guards.sh + architecture_guards.sh PASS
dotnet test aevatar.slnx PASS

⟦AI:AUTO-LOOP⟧
…+ Has presence check

omnibus r1 reject:
- proto3 non-optional scalar default 0 → absent typed value 变成 0 不是 old default(8/1)
- TelegramBridgeGAgent regression:absent poll_timeout_seconds → 1(clamp),应为 8;absent settle_polls_after_match → 0,应为 1

修复:
- TelegramBridgeRequest 4 个 default-sensitive numeric field 改 optional:
  wait_timeout_ms, poll_timeout_seconds, settle_polls_after_match, timeout_ms
- TelegramBridgeGAgent 用 Has* presence check 判 absent vs explicit 0
- absent → 走 old default(8/1)
- explicit 0 → 走 0(用户明示)
- 加 regression tests:absent → 默认,explicit 0 → 0

local PASS:test_stability + architecture + Telegram 25/25 + Telegram filter 31/31

⟦AI:AUTO-LOOP⟧
omnibus r3 reject:r2 只覆盖 2/4 fields,wait_timeout_ms + timeout_ms 仍 fallback

修复:
- wait_timeout_ms / timeout_ms 同样 presence-based,explicit 0 preserve
- regression test 扩 4/4 fields(wait/poll/settle/timeout)

local PASS:Telegram 25/25 + test_stability_guards.sh

⟦AI:AUTO-LOOP⟧
…ression

omnibus r5 reject 3 blockers:
1. StreamingProxyGAgent build break(引用被删 constants)
2. LLMCallModule producer 用 TryParsePositiveInt32 不 accept "0"
3. regression test 没覆盖 workflow string "0" → typed proto presence

修复:
- StreamingProxyGAgent 读 typed ChatRequestEvent.ToolContext(per consensus,删 stale constants)
- LLMCallModule 接受 "0":wait_timeout_ms / telegram.timeout_ms / shared timeout promotion
- "0" preserve typed proto presence(explicit 0)
- 加 regression:workflow param "0" → typed presence,absent → no presence(走 default)

local PASS:
- dotnet build aevatar.slnx PASS
- dotnet test --filter Telegram|StreamingProxy PASS
- test_stability_guards.sh PASS

⟦AI:AUTO-LOOP⟧
补 test 覆盖:
- LLMCallModule.TryApplyTelegramParameter typed promotion + aliases + optional zero/invalid parse
- TelegramBridgeGAgent typed send payload + connector params + EmitChatResponse + wait-reply controls + clamps + run/step command id

local:line 88.7%/branch 72.7% PASS
normalized patch:806/915 = 88.09%(>80% threshold)

⟦AI:AUTO-LOOP⟧
@loning loning force-pushed the refactor/iter56-cluster-917-workflow-llm-control-metadata branch from 9a3d43a to f8045a7 Compare May 23, 2026 19:44
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — fix 派出

维度
阶段 派出 codex(role=fix)
codex log fix-pr922-r6-codecov.log
工作目录 /Users/auric/aevatar
timeout 5400s(~90 min 上限)
上下文 r6 fix done(+216 coverage,patch 88%)+ rebased → CI re-run
下一步自动会做 1. fix r 完成 marker FIX_DONE:... 2. controller commit + push 3. 派 reviewer r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — fix 派出

维度
阶段 派出 codex(role=fix)
codex log fix-pr922-r7-deep-codecov.log
工作目录 /Users/auric/aevatar-wt-iter56-cluster-917-workflow-llm-control-metadata
timeout 5400s(~90 min 上限)
上下文 r6 仍 codecov 56% (vs local 88%) → r7 deep investigation Codecov per-file detail
下一步自动会做 1. fix r 完成 marker FIX_DONE:... 2. controller commit + push 3. 派 reviewer r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

Add focused coverage for typed tool-context payload serialization, ChatRuntime routing merge, StreamingProxy typed lifecycle fields, and LLM Telegram parameter variants.

⟦AI:AUTO-LOOP⟧
@loning loning force-pushed the refactor/iter56-cluster-917-workflow-llm-control-metadata branch from eb3b808 to 5553b3c Compare May 23, 2026 20:24
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 23, 2026

📊 状态卡片 — fix 派出

维度
阶段 派出 codex(role=fix)
codex log fix-pr922-r7-deep-codecov.log
工作目录 /Users/auric/aevatar
timeout 5400s(~90 min 上限)
上下文 r7 fix done(applied-12 coverage:typed tool context + ChatRuntime + StreamingProxy + LLMCallModule;local 83.25%)→ CI re-run
下一步自动会做 1. fix r 完成 marker FIX_DONE:... 2. controller commit + push 3. 派 reviewer r<N+1>
是否需要人介入 ❌ 否(自动推进)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant