Skip to content

Prepare v1.11.3 integration testing - #789

Merged
Y1fe1Zh0u merged 9 commits into
dataelement:mainfrom
Y1fe1Zh0u:v1.11.3-test
Jul 24, 2026
Merged

Prepare v1.11.3 integration testing#789
Y1fe1Zh0u merged 9 commits into
dataelement:mainfrom
Y1fe1Zh0u:v1.11.3-test

Conversation

@Y1fe1Zh0u

@Y1fe1Zh0u Y1fe1Zh0u commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

Summary

Why

The v1.11.3 test branch combines the pending integration work for 3010 regression testing. During live inspection, a waiting-to-cancel transition was permanently retrying product synchronization because delivery receipts used a checkpoint-level uniqueness rule that was broader than their idempotency identity. Historical Group Sessions were also unable to compact when inactive model references remained on otherwise active Group Agents, even though Group Compact runs with its own configured model.

Impact

  • cancellation delivery can finish without creating a synthetic Graph checkpoint
  • non-delivery Runtime events retain the existing checkpoint/type uniqueness protection
  • old Group Sessions can compact without silently assigning replacement Agent models
  • existing Runtime execution, tool calls, and model selection remain unchanged

Validation

  • 110 passed across Runtime delivery, checkpoint side effects, product reconciliation, Session Compact, schema, and unified migration tests
  • Alembic reports allow_checkpoint_deliveries as the single head
  • Python compile validation passed
  • scoped Ruff checks passed
  • Drone build 386 did not reach build or test steps: its clone step fetched only the upstream repository and could not read the cross-fork PR head tree

Deployment

  • deployed to the existing isolated clawith_a2a_phase1 environment on port 3010
  • source, PostgreSQL, and Redis backups completed before cutover
  • only the backend container was rebuilt; frontend, PostgreSQL, and Redis remained running
  • the previously stuck cancel command reconciled automatically and now has both waiting and terminal/cancelled delivery receipts
  • Alembic is at allow_checkpoint_deliveries; all four containers report zero restarts and the health endpoint is OK

Known issue found during E2E

  • Group-scoped ordinary file mutations currently bypass the normal Agent autonomy-policy boundary.
  • delete_file was confirmed to execute in Group Workspace despite delete_files = L3, without creating an approval request.
  • This permission-governance defect is recorded for a follow-up fix and is not addressed by this PR.

Y1fe1Zh0u and others added 9 commits July 24, 2026 14:28
Group workspace files now share the ordinary file-tool surface through an explicit workspace scope, while the four group business tools remain unchanged. Legacy group workspace names stay execution-compatible for in-flight checkpoints but are removed from new model contracts. Document reads reuse the existing binary parser and mutations retain durable fencing and reconciliation.

Constraint: Group storage authorization and mutation receipts remain separate from private Agent Workspace storage.

Rejected: Expose a second generation of group-specific file tools | it repeats the namespace-selection failure and still leaves write/edit parity unresolved.

Confidence: high

Scope-risk: moderate

Reversibility: clean

Directive: Do not add Group Workspace move_file until source deletion and target creation can be reconciled as one durable operation.

Tested: 2057 backend tests; focused group runtime, model step, tool step, reconciler, builtin contract tests; Ruff; py_compile; diff check.

Not-tested: Live 3010 group chat flow before deployment; real S3/Cloudflare document parsing path.
The agent chat view derived its "before" pagination cursor from
`messages[0].created_at` alone, dropping the `|id` component. The
backend's `before` contract is `<created_at>|<id>`, and it already
returns a ready-to-use `cursor` field per message.

When a single turn persists a batch of messages that share one
`created_at` (e.g. a burst of tool_call rows) and that batch is larger
than HISTORY_PAGE_SIZE, the timestamp-only cursor never advances: the
backend's legacy-cursor fallback pins the id to the max UUID, so every
page re-returns the same equal-timestamp rows. Pagination loops,
inflating the tool count on each scroll, and any message older than the
batch (including the user's first message) can never be loaded.

Round-trip the backend `cursor` field at all four cursor-set sites,
falling back to `created_at` only when absent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Slides collection treats slice objects as one slide identifier, which makes ordinary read_document fail with a list/rId exception. Iterate slides normally and stop after the existing 50-slide safety limit.

Constraint: Preserve the existing text-only PPTX extraction contract and 50-slide bound.

Rejected: Add OCR for picture-only decks | outside this parser bug fix and materially expands runtime cost.

Confidence: high

Scope-risk: narrow

Reversibility: clean

Tested: Reproduced the list/rId failure; added a generated two-slide PPTX regression; parsed the reported 1.99MB file without exception; 2071 backend tests passed.

Not-tested: OCR for image-only slides; authenticated browser retry after deployment.
The max_tool_rounds control limits model-result steps rather than tool calls, so its previous wording caused operators to compare an unrelated tool count with the Runtime ceiling. Align the Chinese, English, and fallback copy with the enforced semantics, including wait and error results.

Constraint: Preserve the existing setting key, numeric range, default, and Runtime behavior

Confidence: high

Scope-risk: narrow

Directive: Keep this copy aligned with node_executor model_step_count semantics

Tested: Frontend node tests (85 passed); npm production build; i18n JSON parsing; git diff check

Not-tested: Browser screenshot on a deployed server
Integrate PR dataelement#785 so the test branch round-trips the backend compound cursor instead of repeating equal-timestamp pages.

Constraint: Preserve the PR head unchanged for integration testing
Confidence: high
Scope-risk: narrow
Tested: Merge completed without conflicts
Not-tested: Regression suite pending combined-branch validation
Integrate the shared PR dataelement#786/dataelement#787 head once so ordinary workspace tools can be exercised against group scope without duplicating identical history.

Constraint: PR dataelement#786 and dataelement#787 resolve to the same head commit 6c6c637
Rejected: Create two merge commits for one commit | duplicate ancestry would add no product change
Confidence: high
Scope-risk: moderate
Tested: Merge completed without conflicts
Not-tested: Combined backend regression suite pending
Integrate PR dataelement#788 so testers evaluate the Runtime model-step ceiling with accurate Chinese and English copy.

Constraint: Keep this integration copy-only
Confidence: high
Scope-risk: narrow
Tested: Merge completed without conflicts
Not-tested: Combined frontend suite and visual confirmation pending
Waiting-to-cancel transitions can emit distinct delivery receipts from one preserved checkpoint, while legacy group members may no longer resolve an Agent model. Narrow checkpoint uniqueness only for delivery receipts and let shared compaction fall back to the configured Group Compact model when no active Agent model remains.

Constraint: Control-plane cancel must preserve the last authoritative Graph checkpoint

Rejected: Fabricate a cancel checkpoint | violates the existing Runtime checkpoint contract

Confidence: high

Scope-risk: narrow

Reversibility: clean before distinct same-checkpoint delivery rows are written

Directive: Keep delivery idempotency keyed by run_id and idempotency_key

Tested: 110 targeted backend tests, Alembic head validation, Python compileall, scoped Ruff

Not-tested: Live 3010 migration and reconciliation before commit

Related: dataelement#785 dataelement#786 dataelement#787 dataelement#788
The deployed alembic_version.version_num column is VARCHAR(32), so the original 36-character revision identifier allowed transactional DDL to run but failed when Alembic recorded the new head. Shorten only the revision identifier before retrying the untouched migration.

Constraint: Existing installations store Alembic revisions in VARCHAR(32)

Confidence: high

Scope-risk: narrow

Reversibility: clean

Tested: 51 migration and schema tests, Alembic head resolution, Ruff, live transactional rollback verification

Not-tested: Successful live migration before this commit
@Y1fe1Zh0u
Y1fe1Zh0u marked this pull request as ready for review July 24, 2026 11:13
@Y1fe1Zh0u
Y1fe1Zh0u merged commit 5564700 into dataelement:main Jul 24, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants