WIP: PWA chat: anchor the user's message to the top of the viewport so the reply fills the screen below it #605
Draft
toasterson
wants to merge 4 commits from
claude/wi-019ff173-pwa-chat-anchor-the-user-s-message-to-th into main
pull from: claude/wi-019ff173-pwa-chat-anchor-the-user-s-message-to-th
merge into: toasterson:main
toasterson:main
toasterson:claude/wi-019ff2f6-create-work-item-ignores-current-phase-d
toasterson:claude/wi-019fd84d-two-layer-operator-scope-property-mint-p
toasterson:claude/wi-019fbe99-lane-faults-are-billed-to-work-items-sic
toasterson:claude/wi-019fd84d-pwa-renders-turnoutcome-by-recovery-axis
toasterson:claude/wi-019fe0e9-finish-the-pwa-phase-axis-cutover-on-cur
toasterson:claude/wi-019fd84c-buf-breaking-change-ci-wire-json-across
toasterson:claude/wi-019ff2f4-reproduce-a-hung-acp-session-on-demand-p
toasterson:claude/wi-019fd84b-anima-mq-v1-proto-envelope-package-broke
toasterson:claude/wi-019fc44d-pre-push-test-gate-iterations-are-witnes
toasterson:claude/wi-019f9079-wi-2-acp-over-vsock-transport-in-anima-r
toasterson:claude/wi-019ff0c1-test-network-subnet-collision-something
toasterson:claude/wi-01a00b8c-ci-verdict-pipeline-is-fully-dead-orches
toasterson:migration-verification-20260818
toasterson:claude/wi-019fa954-mcp-proxy-registry-sessions-get-one-endp
toasterson:claude/wi-019fd3c0-pwa-image-tag-lives-in-a-raw-pwa-yaml-th
toasterson:claude/wi-019fa59c-double-gate-a-second-review-phase-where
toasterson:claude/wi-019fc2cc-ci-infrastructure-failures-qemu-ssh-rese
toasterson:claude/wi-019fe0f2-trace-scheduler-decisions-runner-attachm
toasterson:claude/wi-019fce0d-reviewer-verdicts-are-not-persisted-to-w
toasterson:claude/wi-019fe0f2-expose-bounded-fleet-and-work-flow-metri
toasterson:claude/wi-019fe0f7-cut-gate-reads-to-phase-state-verify-adr
toasterson:claude/wi-019fe0f2-restore-dashboardservice-against-the-mig
toasterson:claude/wi-019fa59b-publish-transient-chunk-deltas-to-a-per
toasterson:claude/wi-019fe0ee-checkpoint-typed-progress-witnesses-and
toasterson:claude/wi-01a00c91-builds-escape-the-per-slot-cargo-target
toasterson:claude/wi-019fd894-plan-canvas-wi-dependency-graph-with-fro
toasterson:claude/wi-01a00ec5-a-timed-out-turn-discards-the-worktree-a
toasterson:claude/wi-01a004d3-build-the-runner-image-in-ci-from-docker
toasterson:claude/wi-01a00afa-runner-write-safe-directory-entries-to-g
toasterson:claude/wi-01a009dc-circuit-breaker-state-fails-to-load-on-e
toasterson:claude/wi-019ff175-adr-0038-acp-has-no-structured-agent-to
toasterson:claude/wi-01a005fc-the-acp-brief-carries-the-description-bu
toasterson:claude/wi-01a00462-a-runner-blocked-session-is-unreapable-t
toasterson:claude/wi-01a00463-anima-runner-leaks-its-executor-child-on
toasterson:claude/wi-019fe61e-agent-sessions-have-no-git-push-credenti
toasterson:claude/wi-019ff2f4-stamp-liveness-witnesses-from-the-acp-ch
toasterson:claude/wi-019fd84c-witness-and-park-logic-consume-the-turno
toasterson:claude/wi-019fd84c-runner-stops-relabeling-human-cancels-ca
toasterson:claude/wi-019fd84c-turnoutcome-closed-14-variant-proto-enum
toasterson:claude/wi-019fd84c-afk-dispatch-requires-a-requested-outcom
toasterson:claude/wi-019fd84d-break-glass-reset-reason-every-operator
toasterson:claude/wi-019fd84d-divergence-report-db-vs-registry-vs-brok
toasterson:claude/wi-019ff174-pwa-chat-make-a-tool-call-say-what-it-is
toasterson:claude/wi-019fe0f0-reap-heartbeat-live-but-activity-dead-tu
toasterson:claude/wi-019fe0ee-persist-scheduling-clocks-and-leases-so
toasterson:claude/wi-019ff093-mark-implementation-complete-advances-wo
toasterson:claude/wi-019ff174-pwa-chat-summarise-a-finished-turn-s-wor
toasterson:claude/wi-019fd894-satisfied-edges-feed-context-dependency
toasterson:claude/wi-019fe1d3-no-runner-can-reach-dind-so-the-janitor
toasterson:claude/wi-01a009dc-quota-probe-kills-the-claude-code-lane-a
toasterson:claude/wi-019fe251-the-pre-push-gate-runs-tests-but-not-cli
toasterson:claude/wi-019fdd2a-lane-quota-detection-uses-a-total-turn-t
toasterson:claude/wi-019fd894-orphaned-edges-and-blocked-visibility-pa
toasterson:claude/wi-019fd894-dependency-edge-api-surface-grpc-mcp-too
toasterson:claude/wi-019fd893-edge-witness-kind-dependent-satisfaction
toasterson:claude/wi-01a0057c-sessions-finish-with-no-captured-diff-an
toasterson:claude/wi-019fa59e-retire-failed-dispatch-count-per-item-ph
toasterson:claude/wi-019fd895-anima-server-wedges-grpc-mcp-accept-conn
toasterson:claude/wi-019fce0d-in-flight-ceiling-stranded-working-queue
toasterson:claude/wi-019fd84c-sidechannel-detection-runner-flags-branc
toasterson:claude/wi-019fff95-the-runner-s-anima-owner-worktree-tag-is
toasterson:claude/wi-019fe0f0-add-immutable-graph-version-records-and
toasterson:claude/wi-019fbe42-inventory-every-psql-kubectl-recipe-oper
toasterson:claude/wi-019fe0f7-move-exit-bar-state-onto-pinned-phase-in
toasterson:claude/wi-019ff075-an-orphaned-solstice-dispatch-strands-a
toasterson:claude/wi-019ff173-pwa-chat-pin-the-pending-permission-esca
toasterson:agent/19ce972d63dc
toasterson:agent/972084064aa3
toasterson:claude/wi-019fe0e9-operator-watch-set-board-backed-by-bound
toasterson:claude/wi-019fe0e9-clean-addressed-session-exchange-after-l
toasterson:claude/wi-019fa59e-detect-session-death-by-routability-mand
toasterson:claude/wi-019fe706-solstice-rabbitmq-is-degraded-job-reques
toasterson:claude/wi-019fe18f-the-pre-push-test-gate-bills-toolchain-f
toasterson:claude/wi-019fe0e9-audited-reconcile-session-releases-zombi
toasterson:claude/wi-019fe0e9-use-one-durable-https-credential-path-fo
toasterson:claude/wi-019fe6f2-stranded-work-items-drowns-real-strandin
toasterson:claude/wi-019fe6fd-pwa-data-error-51-items-without-workflow
toasterson:claude/wi-019fec06-items-with-a-changes-requested-review-ve
toasterson:claude/wi-019fe0f0-cache-provider-quota-back-off-failures-a
toasterson:claude/wi-019fe0e9-pin-the-rust-toolchain-and-make-ci-repor
toasterson:claude/wi-019fce0d-unpark-work-item-mcp-tool-one-audited-un
toasterson:claude/wi-019fe0ee-assemble-each-agent-turn-from-durable-ho
toasterson:claude/wi-019fe0ee-codify-the-anima-owned-horizon-boundary
toasterson:claude/wi-019fe0e7-re-implement-owner-tagged-resource-reape
toasterson:claude/wi-019fd893-dependency-edges-table-dag-write-path-de
toasterson:claude/wi-019fce0d-operator-scheduling-controls-over-mcp-ho
toasterson:claude/wi-019fd84d-interleaved-refusal-witnesses-indefinite
toasterson:claude/wi-019fdd2a-a-fully-cleared-exit-bar-does-not-advanc
toasterson:claude/wi-019fd898-corrective-resume-dispatch-to-an-acp-gat
toasterson:claude/wi-019fe5fd-approve-and-merge-refuses-heads-whose-gr
toasterson:claude/wi-019fe624-testing-phase-items-with-a-moved-head-ha
toasterson:claude/wi-019fdd4c-the-24h-in-flight-ceiling-has-no-operato
toasterson:claude/wi-019fa5a0-move-the-dashboard-onto-the-activity-fan
toasterson:claude/wi-019fe0f2-add-one-shared-otlp-observability-initia
toasterson:claude/wi-019fce4e-approve-and-merge-no-already-merged-shor
toasterson:claude/wi-019fce0d-lane-occupancy-over-mcp-list-sessions-by
toasterson:claude/wi-019fbdc4-pwa-plan-detail-workflow-graph-define-im
toasterson:claude/wi-019fd86c-worktree-prep-rebase-parks-items-that-va
toasterson:claude/wi-019fa96b-session-project-binding-covers-work-item
toasterson:claude/wi-019fdd87-a-failed-turn-does-not-roll-back-mark-im
toasterson:claude/wi-019fe0f0-add-audited-cancelsession-that-terminate
toasterson:claude/wi-019fcde5-work-items-cannot-be-looked-up-by-their
toasterson:claude/wi-019fa5a0-persist-the-assembled-prompt-to-s3-along
toasterson:claude/wi-019fa59f-reviews-land-in-the-thread-and-reviewers
toasterson:claude/wi-019fbdc3-pwa-workflowgraph-node-component-workflo
toasterson:claude/wi-019fa5a0-single-active-consumer-akh-lanes-and-rel
toasterson:claude/wi-019faa5d-nothing-prunes-session-tokens-104-083-ro
toasterson:claude/wi-019fa59c-graph-versioning-pin-in-flight-work-item
toasterson:claude/wi-019fa59c-anima-work-exchange-lane-queues-and-the
toasterson:claude/wi-019fa59d-dispatch-branches-on-phasekind-instead-o
toasterson:claude/wi-019fa59d-anima-session-addressed-exchange-with-pe
toasterson:claude/wi-019fa5a0-attempt-counter-in-postgres-surviving-ev
toasterson:claude/node-workflow-overview-wi-4c95cf
toasterson:claude/wi-019fc826-the-account-quota-probe-polls-the-provid
toasterson:claude/grpc-api-surface-evaluation-cd6026
toasterson:claude/wi-019fc9a5-exit-bar-gates-survive-across-pr-generat
toasterson:claude/wi-019fa59f-boards-read-the-phase-graph-instead-of-a
toasterson:claude/wi-019fcce5-implementation-sessions-lack-workitem-wr
toasterson:claude/wi-019f9fc2-anima-has-no-ssh-credential-story-runner
toasterson:claude/wi-019f9946-a-work-item-filed-without-a-plan-has-no
toasterson:claude/wi-019fa3a4-reviewers-cannot-build-the-code-they-rev
toasterson:claude/wi-019fc638-anima-emits-no-traces-metrics-or-structu
toasterson:agent/4a6b46e02b58
toasterson:claude/wi-019fc63c-dispatch-has-no-dependency-graph-work-it
toasterson:agent/e7469dfa074b
toasterson:claude/wi-019f9fb1-quota-aware-scheduling-budget-provider-c
toasterson:agent/2cfe41dbf7f5
toasterson:claude/wi-019faa43-the-janitor-s-two-sweeps-both-exclude-th
toasterson:claude/wi-019fcc85-move-cargo-target-dir-from-per-runner-to
toasterson:claude/wi-019f8615-agents-page-show-each-agent-s-live-slot
toasterson:agent/1c04647808fc
toasterson:claude/wi-019dbb8e-auth-for-akh-medu-seshat-envoy-gateway-s
toasterson:claude/wi-019dc57c-p1-5-seshat-ingest-hook-transcripts-libr
toasterson:claude/wi-019ddfd9-mcp-tool-time-bounded-out-of-hours-sessi
toasterson:claude/wi-019e8873-native-solstice-ci-dispatch-send-explici
toasterson:claude/beautiful-leavitt-d2a8d7
toasterson:agent/8e80f1909fac
toasterson:agent/baf43b288ad9
toasterson:claude/wi-019fc9a5-a-failed-git-push-silently-discards-the
toasterson:agent/0d500af2cd88
toasterson:agent/c4a84cf02ec2
toasterson:claude/wi-019f9ea6-dispatched-sessions-hit-scope-walls-mid
toasterson:claude/wi-019fc826-the-account-quota-probe-hammers-the-prov
toasterson:claude/wi-019f98b5-opencode-lane-is-dead-weight-every-turn
toasterson:claude/wi-019fb430-list-working-document-kinds-omits-ci-ret
toasterson:agent/cb05e821a3bc
toasterson:agent/a9ae8f731a77
toasterson:agent/89755cf8eb3e
toasterson:claude/wi-019fa59d-error-queue-drainer-park-the-work-item-s
toasterson:claude/wi-019fc2cc-flaky-test-no-reviewer-dispatched-twice
toasterson:agent/0c195963cd85
toasterson:agent/21dbfeaf95c9
toasterson:agent/30dad6db7aa0
toasterson:agent/917a59a781d8
toasterson:agent/b557136f8edf
toasterson:claude/wi-019fc3bd-park-vs-live-session-race-parks-land-whi
toasterson:agent/2c4165ec8872
toasterson:claude/wi-019fa59b-phasekind-enum-and-the-fk-constrained-ph
toasterson:claude/wi-019fa9f3-dispatch-ordering-does-not-prefer-work-i
toasterson:claude/wi-019fa8f3-the-scheduler-s-unclaimed-wi-warning-re
toasterson:claude/wi-019fa59a-dispatch-payload-type-and-the-idempotenc
toasterson:claude/wi-019fa979-the-reviewer-slot-reservation-is-applied
toasterson:claude/wi-019fa59b-error-envelope-and-per-lane-error-queues
toasterson:claude/wi-019fa7d9-an-executor-must-be-able-to-rebase-its-o
toasterson:claude/wi-019fa59b-seed-the-default-phase-graph-with-ci-to
toasterson:claude/wi-019fbe41-zombie-session-repair-is-a-raw-sql-sweep
toasterson:claude/wi-019fbe97-grpc-services-and-mcp-handlers-each-reim
toasterson:claude/wi-019fbe41-a-stale-recorded-pr-head-breaks-ci-dispa
toasterson:claude/wi-019fbe41-operator-forensics-needs-psql-no-queryab
toasterson:claude/wi-019fa59e-retire-anima-sched-max-active-for-runner
toasterson:claude/wi-019fb424-derive-every-git-remote-config-from-the
toasterson:claude/wi-019fa3d2-the-ai-gate-ships-no-review-instructions
toasterson:claude/wi-019f9e06-implement-emit-contextwindowstats-from-p
toasterson:claude/wi-019fb464-a-review-analysis-wi-that-delivers-its-f
toasterson:claude/wi-019fa3a4-approve-and-merge-fails-permanently-on-f
toasterson:claude/wi-019f9e06-implement-a-b-stats-comparison-harness-4
toasterson:claude/wi-019fb477-per-executor-lane-state-leaks-on-session
toasterson:claude/wi-019fa59a-anima-mq-crate-topology-declaration-for
toasterson:claude/wi-019fba1f-witness-output-first-classification-coun
toasterson:claude/wi-019f9e06-implement-strategy-specific-stats-for-co
toasterson:claude/wi-019f841f-quick-reply-dedup-options-render-as-bull
toasterson:archive/wi-410-20260807
toasterson:claude/wi-019fa5a0-owner-tagged-reaper-for-containers-workt
toasterson:archive/wi-394-20260807
toasterson:claude/wi-019fa59e-per-item-phase-revisit-cap-as-workflow-c
toasterson:claude/wi-019fa59f-surface-the-operator-watch-set-on-the-bo
toasterson:claude/wi-019fb477-deliverable-reconcile-fails-every-tick-p
toasterson:claude/wi-019fa59e-migrate-exit-bar-columns-to-phases-and-v
toasterson:claude/wi-019f8b49-wi-5b-drop-work-items-status-after-the-p
toasterson:claude/wi-019f841f-live-roster-presence-real-availability-o
toasterson:claude/wi-019faf95-implementer-runs-the-touched-crates-test
toasterson:claude/wi-019faf96-migration-086-cannot-run-under-sqlx-inde
toasterson:claude/wi-019faf95-corrective-dispatch-resumes-the-prior-se
toasterson:claude/wi-019faf95-refusal-is-not-an-empty-turn-distinct-wi
toasterson:claude/wi-019fa59f-24-hour-in-flight-ceiling-that-parks-wit
toasterson:claude/wi-019fb477-rejected-work-item-is-neither-dispatchab
toasterson:claude/wi-019faf95-session-accounting-capture-per-session-t
toasterson:claude/wi-019fb40f-a-terminal-worktree-prep-rejection-leaks
toasterson:claude/wi-019f90ad-scheduler-over-assigns-in-bursts-8-assig
toasterson:claude/wi-019f860b-pwa-chat-config-pickers-replay-a-dead-se
toasterson:claude/wi-019f85b9-wi-3-pwa-collapsible-subthread-ui
toasterson:claude/wi-019f841f-thread-scoped-activity-streaming-retire
toasterson:claude/wi-019f841e-forward-agent-message-content-blocks-end
toasterson:claude/wi-019f85b9-wi-2-runner-delegation-reporting-subthre
toasterson:claude/wi-019f52d2-review-loop-starvation-reviewer-re-dispa
toasterson:claude/wi-019eab9e-feature-mcp-read-tools-for-session-artif
toasterson:claude/wi-019e846d-catch-unwired-dead-code-pub-in-pub-mod-h
toasterson:claude/wi-019faa49-the-per-executor-cap-does-not-hold-acros
toasterson:claude/wi-019f615e-sia-populate-external-ref-external-state
toasterson:claude/wi-019dd0b7-wipsnapshot-retention-per-wi-cap-age-pru
toasterson:claude/wi-019dc0e8-git-remote-url-normalization-ssh-vs-git
toasterson:claude/wi-019fa9c4-ci-green-is-a-sticky-boolean-with-no-com
toasterson:claude/wi-019f85b9-wi-1-subthread-domain-model-parent-threa
toasterson:claude/wi-019f9087-pwa-workitemdetail-request-changes-appro
toasterson:claude/wi-019f9079-wi-1-spike-gates-the-rest-hypervisor-pic
toasterson:claude/wi-019f862a-project-overview-in-flight-section-split
toasterson:claude/wi-019f903c-ci-builds-pushes-multi-arch-deploy-image
toasterson:claude/wi-019f841e-resource-mentions-in-the-composer-files
toasterson:claude/wi-019f57aa-message-part-streaming-forward-acp-delta
toasterson:claude/wi-019e93df-mcp-ambient-get-work-item-detail-full-wi
toasterson:claude/wi-019e846d-in-server-merge-engine-hardening-anima-g
toasterson:claude/wi-019dbb9c-agent-annotation-pathway-broken-pat-lack
toasterson:claude/wi-019faa38-a-ci-green-work-item-awaiting-review-is
toasterson:claude/wi-019fa5a0-register-session-gate-reject-a-redeliver
toasterson:claude/wi-019fa902-the-ci-red-corrective-loop-hands-the-imp
toasterson:claude/wi-019fa945-per-executor-reservation-leaks-a-capped
toasterson:claude/wi-019f90f9-pwa-delivery-board-is-blind-to-the-phase
toasterson:claude/wi-019fa7c9-anima-runner-exec-slots-name-is-also-par
toasterson:claude/wi-019fa59c-distinguish-an-empty-turn-from-a-failed
toasterson:claude/wi-019f9aa3-ci-lints-against-an-unpinned-toolchain-d
toasterson:claude/wi-019f9fb8-dispatches-that-fail-before-the-session
toasterson:claude/wi-019fa59b-progress-witness-pr-aware-per-attempt-re
toasterson:claude/wi-019f9a17-every-native-ci-dispatch-fires-twice-rec
toasterson:claude/wi-019f9698-ci-red-corrective-loop-must-distinguish
toasterson:claude/wi-019f9ec2-a-dropped-amqp-connection-silently-ends
toasterson:claude/wi-019f84ec-enforce-session-project-binding-on-write
toasterson:claude/wi-019f903c-fleet-observability-metrics-alerts-for-r
toasterson:claude/wi-019fa7c6-a-turn-that-only-repairs-the-base-repo-s
toasterson:claude/wi-019fa7c6-a-rejected-assignment-re-dispatches-ever
toasterson:claude/wi-019f9b4b-reject-never-reaches-the-implementer-lin
toasterson:claude/wi-019f9b6e-reviewer-only-is-not-expressible-keeping
toasterson:claude/wi-019f9ac1-quota-aware-lanes-meter-usage-over-acp-s
toasterson:claude/wi-019f99ca-native-ci-falls-back-to-a-job-script-tha
toasterson:claude/wi-019f8610-remove-the-global-anima-sched-max-active
toasterson:claude/wi-019f990a-analysis-work-parks-itself-17-of-20-park
toasterson:claude/wi-019f9aa3-a-model-provider-429-is-indistinguishabl
toasterson:claude/wi-019f99a4-dispatch-queue-ignores-priority-strict-f
toasterson:claude/wi-019f83ce-wi-a-backend-escalation-core-schema-type
toasterson:claude/wi-019f98d9-you-cannot-follow-a-wi-along-its-route-1
toasterson:claude/wi-019f98b5-a-failed-turn-is-indistinguishable-from
toasterson:claude/account-quota-meter
toasterson:claude/wi-019fa2fc-the-akh-gateway-advertises-6-slots-for-a
toasterson:claude/wi-019fa243-every-re-dispatch-throws-away-the-previo
toasterson:claude/wi-019fa2de-a-review-session-is-dispatched-alongside
toasterson:claude/wi-019f9e35-worktree-base-branch-is-one-global-env-v
toasterson:claude/thread-window-redesign-2360d9
toasterson:claude/wip-lift-rehook
toasterson:claude/wi-019f9b1d-review-slot-reservation-leaks-when-a-rev
toasterson:claude/wi-019f99ac-create-project-leaves-new-projects-undis
toasterson:claude/wi-019f9980-pin-ci-verdicts-to-the-commit-under-test
toasterson:claude/wi-019f8438-wi-d-frontend-permission-card-render-hum
toasterson:claude/wi-019f8438-wi-c-runner-interceptor-checkpoint-detec
toasterson:claude/wi-019f8438-wi-b-executor-token-scope-stripping-q7c
toasterson:claude/wi-019f8602-reopen-work-items-when-their-orphaned-se
toasterson:claude/wi-019f90cf-review-analysis-wis-never-close-no-phase
toasterson:claude/wi-019f90fe-mcp-update-work-item-advertises-status-v
toasterson:claude/claude-lane-opus-5
toasterson:claude/wi-019f17e4-user-settings-foundation-store-registry
toasterson:claude/wi-019f1779-per-user-configurable-inbox-auto-clear-w
No reviewers
Labels
Clear labels
Compat/Breaking
Breaking change that won't be backward compatible
Kind/Bug
Something is not working
Kind/Documentation
Documentation changes
Kind/Enhancement
Improve existing functionality
Kind/Feature
New functionality
Kind/Security
This is security issue
Kind/Testing
Issue or pull request related to testing
Priority
Critical
The priority is critical
Priority
High
The priority is high
Priority
Low
The priority is low
Priority
Medium
The priority is medium
Reviewed
Confirmed
Issue has been confirmed
Reviewed
Duplicate
This issue or pull request already exists
Reviewed
Invalid
Invalid issue
Reviewed
Won't Fix
This issue won't be fixed
Status
Abandoned
Somebody has started to work on this but abandoned work
Status
Blocked
Something is blocking this issue or pull request
Status
Need More Info
Feedback is required to reproduce issue or to continue work
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
toasterson/Anima!605
Loading…
Reference in a new issue
No description provided.
Delete branch "claude/wi-019ff173-pwa-chat-anchor-the-user-s-message-to-th"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Anima work item
019ff173-ddf7-74f3-9097-39e51ac67917.anima-pwa/src/components/chat/ChatScroller.tsxonly pins to the BOTTOM. When you send a message the view stays glued to the last pixel, so a long agent turn streams past you from the bottom edge and you are always reading the tail. The familiar behaviour — and the one the design implies — is that your own message jumps to the TOP of the viewport and the response then fills the empty screen beneath it, so you read the answer from its beginning.REFERENCE PATTERN (do not copy the dep, copy the idea):
shadcn-ui/chatbot-templatemarks each scroller item withscrollAnchor={message.role === "user"}and gives the content wrappermin-h-full, so a short turn still stretches to a full viewport and the anchored message can actually reach the top.WHAT TO BUILD
ChatScrollergets a minimum height of the viewport so a one-line reply still leaves the anchored message at the top instead of springing back.CONSTRAINTS
ChatScroller's existinghandleScrolldistinguishes our own programmatic pin's echo from a real user scroll (pinnedAt,animating,stickrefs). An anchor scroll is ALSO programmatic and MUST NOT be read as the user detaching, or follow will silently disengage mid-turn. Extend that same discrimination; do not bolt on a second uncoordinated scroll path.useStick()context shape.ScrollToBottomButtonconsumes it and must keep working, including its unread-count re-arming behaviour.use-stick-to-bottom.VERIFY
ChatScroller.test.tsx: an anchored item scrolls to top; the anchor scroll does not clear the stick flag; bottom-stick resumes once content exceeds the viewport. jsdom has noscrollToon elements — the existing tests already work around this, follow that approach./prototype/chat(the specimen board atsrc/pages/ChatPrototype/) with a simulated turn, and on a real thread.content-visibilityitem — both touchChatScroller.tsx.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.