Repository navigation
feat: deliver compatible serialized activity detail - #840
AlexanderZ-Band merged 40 commits into
Conversation
f3dbba8 to
ca0a239
Compare
AlexanderZ-Band
left a comment
There was a problem hiding this comment.
Cycle 1: no verified findings in the independently reviewed compatible detail-delivery delta. Combined producer-triggered findings are recorded on the producer PR.
6e4277a to
8bfeac0
Compare
3bbf453 to
1f251c5
Compare
1f251c5 to
1842638
Compare
bandzalkin
left a comment
There was a problem hiding this comment.
Scope
Approval is limited to #840's reviewed delta at 06d8124481475460782840b8854285cf7c0a2d92 against #839 at a397d8cb905d5316a87f62da23c8c5af1895e78e, as requested. This supersedes the earlier stack-level hold only for this individual PR's code review.
Constraints
Preserve boolean reporting, names-only detail, the shared request deadline, and the explicit process-wide compatibility policy.
Decisions
Platform-owned negotiation and one serialized reporter fit the existing boundaries. No parallel reporting owner or transport is needed.
Findings and proof
No new findings. Head/base and all review discussions were rechecked and are unchanged since the detailed review. The completed combined-tip verification was 1,466 passed / 69 skipped in the core contract suites and 1,372 passed / 10 skipped in coding-adapter, ACP and turn-admission suites. No additional tests were rerun for this unchanged-head approval; live platform/model acceptance and the full repository gate were not run.
Architectural / review verdict
APPROVED for the reviewed #840 delta. This does not approve #841 or clear the stack's five outstanding findings. Re-review material changes introduced by rebasing or resolving the root PR's merge conflict.
…t-activity-detail-to-the-platform-INT-1744 Keep main's BackendTurns ownership of OpenCode cancellation and register the watcher as a turn worker so activity reporting outlives the handler. Reporter unit tests move to tests/runtime/workingreporter; main's workingstate package keeps the execution-level tests. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
…detail-to-the-platform-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-delivery-INT-1744 Port the startup-backlog claim-failure test edit to the split tests/runtime/execution package. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
…t-activity-detail-to-the-platform-INT-1744
…detail-to-the-platform-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-delivery-INT-1744
Run exact-body activity tests on a controlled clock, pin the shared report deadline against a slow rejection, and cover a fresh process learning detail mid-turn, a mid-turn 422 latch, interrupt-then-new-message, a STOP echoed on a detail refresh, the working-state cap through ExecutionContext, and the producer helpers on tools without an observer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DFmR3J53UqbsYDMmTUd3Rb Signed-off-by: Alexander Zaikman <alexander.zaikman@band.ai>
AlexanderZ-Band
left a comment
There was a problem hiding this comment.
Blocking — would be REQUEST_CHANGES on a PR by someone else.
Cycle 2: two test issues (the flow tests don't prove a change is reported immediately, and a transient-turn observation is masked by the owner's wait), eight nits. Both issues sit in code no fix touched. The aborted-previous-owner branch in _start_activity (from #839) was examined: it isn't reachable with an aborted owner and this PR doesn't rely on it, so it is out of scope.
The producers map tool events to activity detail, which is not keep-alive reporting, so they live with ActivityObserver and tool_call_activity. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DFmR3J53UqbsYDMmTUd3Rb Signed-off-by: Alexander Zaikman <alexander.zaikman@band.ai>
The platform and turn-ownership suites retyped the same request bodies; tests/activitysupport.py now owns them, built from the runtime's activity kinds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DFmR3J53UqbsYDMmTUd3Rb Signed-off-by: Alexander Zaikman <alexander.zaikman@band.ai>
…p-alive shown() records any body that needed virtual time, which only a keep-alive could supply, and the platform fixture fails the test on it. The settled-owner test splits so a busy delivery reports while the owner shows a tool, waits on reported bodies instead of fixed sleeps, and post-turn observations are checked after a keep-alive could have fired. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DFmR3J53UqbsYDMmTUd3Rb Signed-off-by: Alexander Zaikman <alexander.zaikman@band.ai>
The platform reads a report without activity as reasoning, so the room shows reasoning, not nothing, while an aborted owner unwinds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DFmR3J53UqbsYDMmTUd3Rb Signed-off-by: Alexander Zaikman <alexander.zaikman@band.ai>
AlexanderZ-Band
left a comment
There was a problem hiding this comment.
Cycle 3: converged, no issues. The flow mapping found no new hypothesis, and the producer move changed no behaviour. Five test nits, fixed in this round.
…ative checks Each activity concern (owned detail, non-owner observations, controlled turns, exclusion, non-blocking delivery) gets its own class, every "nothing posted" check flushes past a keep-alive under looptime, and a late visible change now names the body that waited. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DFmR3J53UqbsYDMmTUd3Rb Signed-off-by: Alexander Zaikman <alexander.zaikman@band.ai>
…t-activity-detail-to-the-platform-delivery-INT-1744
…t-activity-detail-to-the-platform-delivery-INT-1744 # Conflicts: # tests/runtime/activityownership/conftest.py # tests/runtime/activityownership/kit.py
…e-platform-delivery-INT-1744
…t-activity-detail-to-the-platform-delivery-INT-1744 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DFmR3J53UqbsYDMmTUd3Rb Signed-off-by: Alexander Zaikman <alexander.zaikman@band.ai>
Select upstream band-ai#841 (activity producers, carrying band-ai#839/band-ai#840 via forward merges), band-ai#874 after 841 (tool-name emit gate with the I-08 name clamp), the host stack ahead of band-ai#763, band-ai#763 after 874 (native OMP with the tool/permission activity hooks and omp_acp retirement), and band-ai#854/band-ai#795/band-ai#848 after 763. Replayed from the branches' live heads.
Select upstream band-ai#841 (activity producers, carrying band-ai#839/band-ai#840 via forward merges), band-ai#874 after 841 (tool-name emit gate with the I-08 name clamp), the host stack ahead of band-ai#763, band-ai#763 after 874 (native OMP with the tool/permission activity hooks and omp_acp retirement), and band-ai#854/band-ai#795/band-ai#848 after 763. Replayed from the branches' live heads.
Select upstream band-ai#841 (activity producers, carrying band-ai#839/band-ai#840 via forward merges), band-ai#874 after 841 (tool-name emit gate with the I-08 name clamp), the host stack ahead of band-ai#763, band-ai#763 after 874 (native OMP with the tool/permission activity hooks and omp_acp retirement), and band-ai#854/band-ai#795/band-ai#848 after 763. Replayed from the branches' live heads.
Select upstream band-ai#841 (activity producers, carrying band-ai#839/band-ai#840 via forward merges), band-ai#874 after 841 (tool-name emit gate with the I-08 name clamp), the host stack ahead of band-ai#763, band-ai#763 after 874 (native OMP with the tool/permission activity hooks and omp_acp retirement), and band-ai#854/band-ai#795/band-ai#848 after 763. Replayed from the branches' live heads.
Select upstream band-ai#841 (activity producers, carrying band-ai#839/band-ai#840 via forward merges), band-ai#874 after 841 (tool-name emit gate with the I-08 name clamp), the host stack ahead of band-ai#763, band-ai#763 after 874 (native OMP with the tool/permission activity hooks and omp_acp retirement), and band-ai#854/band-ai#795/band-ai#848 after 763. Replayed from the branches' live heads.
Select upstream band-ai#841 (activity producers, carrying band-ai#839/band-ai#840 via forward merges), band-ai#874 after 841 (tool-name emit gate with the I-08 name clamp), the host stack ahead of band-ai#763, band-ai#763 after 874 (native OMP with the tool/permission activity hooks and omp_acp retirement), and band-ai#854/band-ai#795/band-ai#848 after 763. Replayed from the branches' live heads.
Select upstream band-ai#841 (activity producers, carrying band-ai#839/band-ai#840 via forward merges), band-ai#874 after 841 (tool-name emit gate with the I-08 name clamp), the host stack ahead of band-ai#763, band-ai#763 after 874 (native OMP with the tool/permission activity hooks and omp_acp retirement), and band-ai#854/band-ai#795/band-ai#848 after 763. Replayed from the branches' live heads.
Select upstream band-ai#841 (activity producers, carrying band-ai#839/band-ai#840 via forward merges), band-ai#874 after 841 (tool-name emit gate with the I-08 name clamp), the host stack ahead of band-ai#763, band-ai#763 after 874 (native OMP with the tool/permission activity hooks and omp_acp retirement), and band-ai#854/band-ai#795/band-ai#848 after 763. Replayed from the branches' live heads.
Why
A room can show what an agent is doing (reasoning, a tool by name, waiting on a person, memory), but older platforms and boolean-only callers must keep working. The earlier version kept detail in a per-room reporter slot, which needed ownership guards that proved unreachable or wrong, and it learned platform support from
GET /api/version, which serves HTML on prod.What
TurnScope.activity, in the new leafband.runtime.activity). The room shows the live owner's detail and none while an aborted owner unwinds; reporting a change never starts reporting, takes ownership, or waits on the network.working: true, so changes made while a report is in flight coalesce to the latest. Stop and the duration cap are unchanged.X-API-Versionadvertises 1.25.0 or later. A detail-bearing 422 resends once without detail within the same deadline and disables detail for the process.Scope
First feature layer of INT-1744.
ReportFn(bool)andenable_working_state(still the only switch) are unchanged. The unused_on_activity_clearseam is replaced by per-turn detail rather than filled.band-client-rest0.0.46 already shipsAgentActivityDetail, so there is no bump. A tool shorter than one report round trip may never appear, which INT-1741 accepts. The producer helpers have no callers yet; Band tools and adapters report through them in the PRs stacked above.🤖 Generated with Claude Code
https://claude.ai/code/session_01DFmR3J53UqbsYDMmTUd3Rb