33cfd9aaa9
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 13s
E2E API Smoke Test / detect-changes (pull_request) Failing after 3s
E2E Chat / detect-changes (pull_request) Failing after 3s
CI / Python Lint & Test (pull_request) Successful in 12s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Has been skipped
E2E Chat / E2E Chat (pull_request) Has been skipped
CI / Detect changes (pull_request) Successful in 14s
CI / Platform (Go) (pull_request) Failing after 1s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 4s
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Creates Workspace (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge user_tasks (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Platform Agent (pull_request) Has been skipped
Harness Replays / detect-changes (pull_request) Failing after 2s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 20s
Harness Replays / Harness Replays (pull_request) Has been skipped
lint-required-no-paths / lint-required-no-paths (pull_request) Failing after 3s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 8s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 9s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 5s
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge (compile+skip) (pull_request) Successful in 21s
Check migration collisions / Migration version collision check (pull_request) Successful in 52s
gate-check-v3 / gate-check (pull_request_target) Failing after 2s
sop-checklist / review-refire (pull_request_target) Has been skipped
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 9s
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 13s
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 39s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request_target) Successful in 12s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (stub) (pull_request) Successful in 40s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (real image + MiniMax LLM, advisory) (pull_request) Successful in 51s
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Successful in 5m45s
E2E Staging SaaS (full lifecycle) / E2E Staging Platform Boot (pull_request) Failing after 6m19s
CI / Canvas (Next.js) (pull_request) Failing after 6m44s
CI / Canvas Deploy Status (pull_request) Has been skipped
CI / all-required (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Failing after 8m37s
qa-review / approved (pull_request_target) Review check failed via pull_request_review trigger
security-review / approved (pull_request_target) Review check failed via pull_request_review trigger
qa-review / approved (pull_request_review) Failing after 3s
security-review / approved (pull_request_review) Failing after 3s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 5s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 38s
Two CTO asks (2026-06-10/11), one PR: 1. Chat persistence across leave/refresh (data-loss fix). Server: persistUserMessageAtIngest runs SYNCHRONOUSLY in proxyA2ARequest, immediately after normalizeA2APayload and BEFORE the poll/mock/push short-circuits, with context.WithoutCancel so a chat-exit cancel cannot abort the write. The completion path (logA2ASuccess / logA2AReceiveQueued) uses ON CONFLICT (workspace_id, message_id) DO UPDATE to attach the agent's response_body onto the same row, so a single activity_logs row carries both the user message and the agent reply — the chat-history reader (messagestore.PostgresMessageStore) emits one (user, agent) pair per row, no duplicate bubble. Schema: new activity_logs.message_id TEXT column + partial unique index (workspace_id, message_id) WHERE message_id IS NOT NULL. Idempotent on messageId per #2560 spec — a duplicated ingest (retry, poll-mode re-persist) collapses via ON CONFLICT. 2. Bottom-sticky autoscroll for accumulating tool calls. ChatTab adds an atBottom ref (scroll listener with a 12px threshold) that gates BOTH the existing message-append smooth- scroll AND a new activityLog-growth useLayoutEffect. The loadOlder anchor-restore contract is preserved unchanged (anchor restore is unconditional — the user's pre-loadOlder position is the thing being preserved). Tests: - workspace-server/internal/handlers/a2a_push_ingest_persist_test.go proves push-mode ingest INSERT completes BEFORE handler return (mirrors the pre-existing poll-mode a2a_poll_ingest_persist_test that covers the poll-mode arm). - canvas/src/components/tabs/__tests__/ChatTab.autoscroll.test.tsx pins the at-bottom gating contract for both append and activityLog growth. Coordination: - The chat-persistence/send-pump area overlaps Kimi's feat/canvas-chat-queue-and-child-lock (#2503 auto-layout). The upload-failure-retry discriminator (taken|failed|noop) and the send-pump unmount-cancellation in useChatSend.ts are NOT touched by this PR — we add the ingest-persist + autoscroll changes only. Content-security: no creds / host-coords / topology literals in code or comments. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>