Skip to content

merge: integrate paradigmxyz/centaur main - #35

Merged
michaelmwu merged 38 commits into
mainfrom
integration/paradigm-main
Sep 8, 2026
Merged

merge: integrate paradigmxyz/centaur main#35
michaelmwu merged 38 commits into
mainfrom
integration/paradigm-main

Conversation

@michaelmwu

@michaelmwu michaelmwu commented Sep 8, 2026

Copy link
Copy Markdown
Member

Integrates the current Paradigm upstream main into 508's current main with a common-base merge.\n\nThe resulting tree was compared against an independently rebased 508-on-Paradigm branch and is identical. No VoyTravel commits or code were merged.\n\nRetains 508's Discord actor-scoped policy, bounded review epochs, GitHub App broker, runtime terminal truth, and retention-safe proxy cleanup while taking the upstream evolution.\n\nValidated locally:\n- frozen pnpm install with lifecycle scripts disabled\n- githubbot typecheck and 223 tests\n- discordbot typecheck and focused test suite\n\nNot run locally: Rust and Rails suites; this host has no Cargo/Rails toolchain. Required CI must pass before merge.


Note

High Risk
Large merge across api-rs sandbox/MCP lifecycle, Helm ETL embedding settings tied to DB vector width, and a major Slack streaming dependency upgrade—behavior changes need full CI and staged rollout validation.

Overview
Brings in upstream Paradigm Centaur main as a merge: new Centaur agent plugin packaging (plugins/centaur, Codex/Claude marketplaces, skill, validator script, and validate-agent-plugin CI) so MCP clients can install and OAuth against a deployment-specific /mcp URL.

Control plane and Helm gain company-context embedding knobs (maxInputChars, fixed 1536 dimensions, env passthrough to sandboxes), orphaned iron-proxy cleanup (SESSION_SANDBOX_ORPHAN_SWEEP_GRACE_SECS), and configurable reasoning effort for activity summaries, linearbot turns, and related calls. Console adds chat.enabled (deprecated UI) and Slack “open in Console” links only when chat is on.

api-rs adds OpenTelemetry-style MCP tool spans, GitHub commenter principals from verified user ids, session-create unavailable_requested_persona_id when a requested persona is missing, and workflow-host OPENAI_BASE_URL passthrough. slackbotv2 moves to @chat-adapter/slack@4.40.0 with a refreshed patch (drops the old state-pg patch). Harness defaults and token pricing estimates update for newer models; docs and chart version bump follow.

Reviewed by Cursor Bugbot for commit f7974b2. Bugbot is set up for automated code reviews on this repo. Configure here.

Zygimantass and others added 30 commits August 28, 2026 18:40
Iron-proxy pods were created with restartPolicy=Never, so any container
crash left the pod permanently Failed while its sandbox kept running with
zero egress: Codex gets connection refused to api.openai.com, in-sandbox
tools fail, and the turn dies. Nothing repairs the proxy until the next
session execute calls assign_proxy_principal and recreates it, so every
in-flight turn on that sandbox is lost.

This went from latent to load-bearing on prd-centaur-na when
tempoxyz/prd-centaur-infra#669 added a 512Mi memory limit: iron-proxy
buffers bodies while proxying, large transfers burst past the limit in
seconds, and the resulting OOM kills produced 40+ mid-turn 'stream
disconnected before completion' failures since 2026-08-27.

OnFailure makes the kubelet restart the container in place: same pod IP,
the per-sandbox Service keeps routing, and the proxy re-syncs its
principal config from iron-control on startup, so an OOM becomes a
seconds-long blip instead of a dead session. pod_running() requires the
Ready condition, so ensure/assign paths still treat a crash-looping proxy
as unusable, and wait_until_proxy_running now bounds a proxy that never
comes up by ready_timeout instead of failing on first crash.

Amp-Thread-ID: https://ampcode.com/threads/T-01a048d9-a0bb-72f0-b6cd-4769da726fdc

Co-authored-by: Amp <amp@ampcode.com>
…z#1496)

* feat: bind the console user's principal on console thread turns

Console sessions register an anonymous per-thread principal, so a user's
connected OAuth credentials (e.g. GitHub) never reach console-driven turns:
reconciliation matches identity-scoped credentials to principals, and the
thread principal carries no user identity. The proxy falls back to shared
role-granted tokens and PRs open as the bot.

The console now provisions the authenticated user's console-user principal
on each execute and passes its foreign ID as requester_principal_foreign_id
in the execute metadata. api-rs resolves it fetch-only for console: thread
keys (a namespace only the console service may write) and binds it as the
turn's requester principal, so the proxy serves the RFC 0005 union: the
thread principal's grants plus the requester's always-available OAuth direct
grants. Shared threads stay safe — a reply binds the replier's principal,
never the creator's. The provisioner no longer rewrites an unchanged
principal on repeat calls.

The RFC 0005 availability gate is unchanged: a credential joins console
turns only when an admin marked its OAuth app always-available.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* feat: bind the comment author's principal on GitHub turns

GitHub-triggered turns ran with only the anonymous per-thread principal, so
a commenter's connected GitHub OAuth credential never applied: githubbot
already forwards the webhook-verified sender (`user_id`, the numeric GitHub
id, and `user_name`) in every execute's metadata, but api-rs resolved a
requester only for Slack.

api-rs now derives and upserts a per-user `github-user-<id>` principal for
`github:` thread keys, labeled `github_subject: <id>`, and binds it as the
turn's requester principal. Reconciliation gains GitHub as a subject-label
provider (`Principal::KINDS` learns `github_user`), so the credential owner
is matched by GitHub user id — the only workable anchor, since the consent
flow collects no email scope. The proxy then serves the RFC 0005 union:
thread principal's grants plus the requester's always-available OAuth direct
grants, so pushes and PRs authenticate as the commenter.

A commenter can only bind their own identity: the sender id is authentic
from the signature-verified webhook, turns only run for author associations
the deployment allowlisted, and the hoisted credential is always the
commenter's own.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* refactor: tighten console requester comments

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* refactor: plan-based requester resolution and review cleanup

Address review findings on the requester binding:

- Collapse register_requester's per-source branches into a typed
  RequesterPlan (FetchExisting for console-provisioned principals,
  UpsertDerived for api-rs-owned Slack/GitHub principals) produced by one
  dispatch function, so a new source is one arm instead of another branch
  in the registrar.
- The test stub now records request bodies, and the GitHub upsert test
  asserts the serialized kind/name/github_subject payload, not just the
  path.
- RFC 0005 §4 rewritten around the single precedence rule (provider-native
  subject first, owner-identity/email fallback) so it no longer contradicts
  the GitHub subject path; Security Considerations lists the webhook and
  console trust anchors.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix: resolve GitHub requesters on work sessions

---------

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Liam Horne <1933029+snario@users.noreply.github.com>
* feat: add experimental memory generation workflow

* fix: resolve memory workflow CI failures

* fix: align memory generation model with evals

* fix: prevent memory generation pipeline wedges

* fix: preserve cursor on transient memory failures

* fix: reject all Slack group DMs from memory scope

* feat: add self-draining memory backfill
* fix(codex): set default reasoning to medium

* test: update Slack reasoning metadata expectations

---------

Co-authored-by: Perry Dime <260989497+svc-paradigm@users.noreply.github.com>
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
* feat: add Centaur agent plugin registry

* test: lock centaur plugin identity
* fix: retry transient console sync failures

* test: fix Granola sync retry stub

---------

Co-authored-by: Perry Dime <260989497+svc-paradigm@users.noreply.github.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
* feat: trace MCP tool calls in Laminar

* fix: preserve MCP trace correlation on failures

* fix: reduce MCP tool call error size

* refactor: return MCP execution correlation directly

* test: remove tautological MCP trace tests

* fix: preserve existing MCP sandbox correlation
* fix: pin personas for thread lifetime

* refactor: require explicit persona selectors

* fix: reject flag-shaped selector values

* fix: keep persona selection consistent

* refactor: share regex escaping helper
* feat: add console chat sunset controls

* chore: bump chart to 0.1.131
Co-authored-by: Georgios Konstantopoulos <17802178+gakonst@users.noreply.github.com>
Co-authored-by: Perry Dime <260989497+svc-paradigm@users.noreply.github.com>
* fix: fall back from unavailable personas

* fix: make persona fallback feedback authoritative

* refactor: simplify persona fallback handling

* refactor: tighten persona fallback flow
* fix(k8s): own iron-proxy resources and reap orphans

A failed create, resume, or unwind can leave an iron-proxy resource behind
with no owner reference and no live Sandbox, and every cleanup path is keyed
on an observed sandbox, so the orphan stands until deleted by hand.

- adopt no longer stops at the first failed patch: every class is attempted
  and the failures are returned aggregated, and a Sandbox CR without a name
  or uid now warns instead of silently leaving the resources unowned
- delete_iron_proxy_resources aggregates per-class delete errors instead of
  discarding them, and the failure-path unwinds in create and resume log a
  failed unwind
- the reaper now sweeps the labeled proxy classes for resources whose
  sandbox has no live Sandbox and deletes them past a grace window that
  keeps an in-flight create from racing the sweep, reporting the count per
  class

* fix(k8s): make orphan sweep grace configurable

* chore(chart): bump version to 0.1.130

---------

Co-authored-by: Matthew Slipper <me@matthewslipper.com>
…paradigmxyz#1532)

* fix(session-runtime): report why a sandbox died, not just that it did

An OOMKilled sandbox surfaces as "sandbox stdout closed before terminal
output; sandbox no longer accepts io (status Created)" -- the same string as
every other death. The kubelet records the cause on the pod, but the pod is
usually collected before anyone reads it, so the turn is lost with no way to
tell a capacity problem from a harness fault.

ObservedSandbox already carried a backend reason field that the agent-k8s
backend never populated. It now reads the container's terminated reason,
preferring the current state and falling back to last_state once the kubelet
restarts the container, and falling back again to the pod-level reason, which
is where eviction records itself.

Both paths that give up on a sandbox observe instead of only reading status,
so the reason reaches the execution error. terminal_failure_class gains oom
and evicted, checked before sandbox_io because that is the message they
arrive wrapped in; raising a memory limit and relieving node pressure are
different actions and neither is a harness problem.

* fix(sandbox): preserve pod eviction reason

---------

Co-authored-by: Matthew Slipper <me@matthewslipper.com>
…aradigmxyz#1535)

* fix(api-rs): send a reasoning effort on the title and summary calls

OPENAI_BASE_URL points the session titler and the activity summariser at any
OpenAI-compatible server, including ones serving reasoning models. Neither
call set an effort, so the server's default applied, and some open-weight
reasoning models resolve an absent parameter to their highest level.

The budgets are 24 and 128 output tokens. A reasoning trace runs to
thousands, so the model exhausts the budget before the first message token
and the server returns status incomplete with an empty output array. The
titler then fails MissingOutput and the session gets no title. The existing
detects_incomplete_responses_body fixture is that exact shape.

Both calls now send an explicit effort, defaulting to low: a five-word
commit-style title needs no deliberation, and with thinking off it fits in
roughly 7 tokens. An empty value omits the parameter entirely, which is the
escape hatch for a server that rejects an unknown field rather than ignoring
it.

* chore(chart): bump version to 0.1.134

---------

Co-authored-by: Matthew Slipper <me@matthewslipper.com>
…paradigmxyz#1553)

* fix(githubbot): log output size on review, issue and management turns

Only githubbot_thread_turn_complete carries a `chars` field. The review,
issue-work and PR-management turns log `failed` alone, so nothing downstream
can tell a long successful turn from an aborted one -- every turn on those
surfaces is unverifiable, and any monitor watching for long turns without
output fires on all of them.

Long turns are normal on these surfaces: reviewing a PR or addressing a
multi-item review takes time and is not a fault. Without a size there is no
signal that separates that from a turn that produced nothing.

turnOutputChars measures the answer rather than a rendered body, because
these surfaces have no single body -- what they emit is a review comment, an
issue comment, or a push. A failed turn reports its error text, for the same
reason a failed comment turn does: zero would read as "produced nothing",
which is a different fault from "produced an error".

* chore: trim github turn comments

---------

Co-authored-by: Matthew Slipper <me@matthewslipper.com>
* feat(linearbot): per-turn-type reasoning effort

The harness already accepts a per-turn effort -- the blocks-protocol
reasoning field maps onto codex turn/start.effort, and slackbotv2 drives it
from -rsn. linearbot cloned that overrides parser without the reasoning
field, and its turns are mostly autonomous anyway: assignment kickoffs pass
an empty overrides object and comment turns forward harness, model and
provider only. Every turn therefore ran at the harness global default.

That default fits neither end. An assignment turn implementing a whole
ticket wants deep thinking; a comment reply does not. With one global setting
a deployment chooses between saturating a shared inference backend on
assignment bursts and having implementation turns underthink.

LINEARBOT_EFFORT_ASSIGNMENT and LINEARBOT_EFFORT_COMMENT set them
independently, threaded through the reasoning field that already existed on
the wire. Setting one does not imply the other, and both unset keep today's
behaviour exactly.

Unrecognised values are dropped rather than forwarded. A typo forwarded
verbatim reaches the harness as an invalid turn/start.effort and fails the
turn, which is far worse than running at the default for config set once at
deploy time. The accepted aliases are slackbotv2's, so a word that works in a
-rsn flag works here too.

* chore(chart): bump version to 0.1.135

---------

Co-authored-by: Matthew Slipper <me@matthewslipper.com>
…adigmxyz#1533)

* feat(company-context): make the embedding dimension configurable

The dimension 1536 was fixed in three places that must agree: the embeddings
workflow, the company_context tool, and the experimental migration's
vector(1536) column. The model was already configurable, so a deployment
serving its own embedding model through OPENAI_BASE_URL could choose the
model but not its native width, and the only way out was shadowing the
workflow and the whole tool in an overlay for one constant.

COMPANY_CONTEXT_EMBEDDINGS_DIMENSIONS is now read by both sides. That it is
one variable rather than two is the point: the write side and the query side
must agree, and a mismatch is a Postgres error comparing vectors of unequal
width rather than a worse ranking. The chart already passes ETL env through
to agent sandboxes, so the tool sees the same value the workflow writes with.

Values above 2000 are rejected in both readers and in the chart schema.
pgvector stores a wider vector but will not build an HNSW or IVFFlat index
on it, so accepting one would leave the search this feeds unindexed while
looking configured.

The migration cannot read an env, so its column width is documented against
the setting instead, including that changing it on a populated table means
re-embedding.

* chore(chart): bump version to 0.1.135

* chore(chart): bump version to 0.1.136

---------

Co-authored-by: Matthew Slipper <me@matthewslipper.com>
…he api-rs-dependencies group (paradigmxyz#1569)

chore(deps): bump uuid

Bumps the api-rs-dependencies group in /services/api-rs with 1 update: [uuid](https://github.com/uuid-rs/uuid).


Updates `uuid` from 1.24.1 to 1.26.0
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](uuid-rs/uuid@v1.24.1...v1.26.0)

---
updated-dependencies:
- dependency-name: uuid
  dependency-version: 1.26.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: api-rs-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…hub-actions group (paradigmxyz#1570)

chore(deps): bump re-actors/alls-green in the github-actions group

Bumps the github-actions group with 1 update: [re-actors/alls-green](https://github.com/re-actors/alls-green).


Updates `re-actors/alls-green` from 1.2.2 to 1.3.0
- [Release notes](https://github.com/re-actors/alls-green/releases)
- [Commits](re-actors/alls-green@05ac938...b5b5b37)

---
updated-dependencies:
- dependency-name: re-actors/alls-green
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…th 2 updates (paradigmxyz#1568)

chore(deps): bump the ruby-dependencies group

Bumps the ruby-dependencies group in /services/console with 2 updates: [thruster](https://github.com/basecamp/thruster) and [selenium-webdriver](https://github.com/SeleniumHQ/selenium).


Updates `thruster` from 0.1.25 to 0.1.26
- [Changelog](https://github.com/basecamp/thruster/blob/main/CHANGELOG.md)
- [Commits](basecamp/thruster@v0.1.25...v0.1.26)

Updates `selenium-webdriver` from 4.47.0 to 4.48.0
- [Release notes](https://github.com/SeleniumHQ/selenium/releases)
- [Changelog](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)
- [Commits](SeleniumHQ/selenium@selenium-4.47.0...selenium-4.48.0)

---
updated-dependencies:
- dependency-name: thruster
  dependency-version: 0.1.26
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: ruby-dependencies
- dependency-name: selenium-webdriver
  dependency-version: 4.48.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: ruby-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…r in the harness-server-dependencies group (paradigmxyz#1567)

chore(deps): bump uuid

Bumps the harness-server-dependencies group in /crates/harness-server with 1 update: [uuid](https://github.com/uuid-rs/uuid).


Updates `uuid` from 1.24.1 to 1.26.0
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](uuid-rs/uuid@v1.24.1...v1.26.0)

---
updated-dependencies:
- dependency-name: uuid
  dependency-version: 1.26.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: harness-server-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…#1485)

The opus and sonnet aliases (--opus, --sonnet, --model opus, channel
defaults, and the LLM override strategy) still expanded to Claude Opus 4.8
and Sonnet 4.6, and the baked claudecode harness default was Opus 4.8, so
--claude and --opus silently ran the older models. Point them at
claude-opus-5 and claude-sonnet-5; the full old ids remain valid for
explicit selection.

Bump the sandbox's Claude Code to 2.1.245: the previously pinned 2.1.154
predates Opus 5 and Sonnet 5 support (the CLI maps opus to Opus 5 since
2.1.219, and 2.1.221 extended fast mode to Opus 5).

Also add cost estimates for claude-opus-5 (same rates as Opus 4.5+),
claude-opus-5-fast (2x), and claude-sonnet-5, and list Sonnet 5 in the
console composer.

Co-authored-by: Matthew Slipper <me@matthewslipper.com>
…z#1613)

Bumps the github-actions group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [actions/setup-python](https://github.com/actions/setup-python).


Updates `actions/checkout` from 4 to 7
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](actions/checkout@v4...v7)

Updates `actions/setup-python` from 5 to 7
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v5...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/setup-python
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
dependabot Bot and others added 4 commits September 7, 2026 19:57
…ith 3 updates (paradigmxyz#1612)

chore(deps): bump the api-rs-dependencies group

Bumps the api-rs-dependencies group in /services/api-rs with 3 updates: [aws-smithy-types](https://github.com/smithy-lang/smithy-rs), [toml](https://github.com/toml-rs/toml) and [tower-http](https://github.com/tower-rs/tower-http).


Updates `aws-smithy-types` from 1.6.2 to 1.6.3
- [Release notes](https://github.com/smithy-lang/smithy-rs/releases)
- [Changelog](https://github.com/smithy-lang/smithy-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/smithy-lang/smithy-rs/commits)

Updates `toml` from 1.1.4+spec-1.1.0 to 1.1.5+spec-1.1.0
- [Commits](toml-rs/toml@toml-v1.1.4...toml-v1.1.5)

Updates `tower-http` from 0.7.0 to 0.7.1
- [Release notes](https://github.com/tower-rs/tower-http/releases)
- [Commits](tower-rs/tower-http@tower-http-0.7.0...tower-http-0.7.1)

---
updated-dependencies:
- dependency-name: aws-smithy-types
  dependency-version: 1.6.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: api-rs-dependencies
- dependency-name: toml
  dependency-version: 1.1.5+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: api-rs-dependencies
- dependency-name: tower-http
  dependency-version: 0.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: api-rs-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…th 4 updates (paradigmxyz#1611)

chore(deps): bump the ruby-dependencies group

Bumps the ruby-dependencies group in /services/console with 4 updates: [sentry-ruby](https://github.com/getsentry/sentry-ruby), [sentry-rails](https://github.com/getsentry/sentry-ruby), [bootsnap](https://github.com/rails/bootsnap) and [image_processing](https://github.com/janko/image_processing).


Updates `sentry-ruby` from 6.7.0 to 7.0.0
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](getsentry/sentry-ruby@6.7.0...7.0.0)

Updates `sentry-rails` from 6.7.0 to 7.0.0
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](getsentry/sentry-ruby@6.7.0...7.0.0)

Updates `sentry-rails` from 6.7.0 to 7.0.0
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](getsentry/sentry-ruby@6.7.0...7.0.0)

Updates `bootsnap` from 1.25.0 to 1.26.0
- [Release notes](https://github.com/rails/bootsnap/releases)
- [Changelog](https://github.com/rails/bootsnap/blob/main/CHANGELOG.md)
- [Commits](rails/bootsnap@v1.25.0...v1.26.0)

Updates `image_processing` from 2.0.3 to 2.1.0
- [Changelog](https://github.com/janko/image_processing/blob/master/CHANGELOG.md)
- [Commits](janko/image_processing@v2.0.3...v2.1.0)

---
updated-dependencies:
- dependency-name: sentry-ruby
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: ruby-dependencies
- dependency-name: sentry-rails
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: ruby-dependencies
- dependency-name: sentry-rails
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: ruby-dependencies
- dependency-name: bootsnap
  dependency-version: 1.26.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: ruby-dependencies
- dependency-name: image_processing
  dependency-version: 2.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: ruby-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(slackbotv2): upgrade Chat SDK to 4.40.0

* docs: remove Chat SDK upgrade notes

* fix(slackbotv2): preserve delivery state and stream batching
# Conflicts:
#	contrib/chart/Chart.yaml
#	services/api-rs/Cargo.lock
#	services/api-rs/crates/centaur-iron-control/src/principal.rs
#	services/api-rs/crates/centaur-iron-control/src/session.rs
#	services/api-rs/crates/centaur-sandbox-agent-k8s/src/iron_proxy.rs
#	services/api-rs/crates/centaur-sandbox-manager/src/manager.rs
#	services/api-rs/crates/centaur-sandbox-manager/src/reaper.rs
#	services/api-rs/crates/centaur-session-sqlx/tests/etl_context_rls.rs
#	services/console/app/models/principal.rb
#	services/githubbot/src/pr-manager.ts
#	services/slackbotv2/package.json
@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 126 files, which is 26 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: d4a3a584-f7f2-42c2-adf8-ddf8d3fbe9ed

📥 Commits

Reviewing files that changed from the base of the PR and between 0d82d0e and f7974b2.

⛔ Files ignored due to path filters (4)
  • crates/harness-server/Cargo.lock is excluded by !**/*.lock
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • services/api-rs/Cargo.lock is excluded by !**/*.lock
  • services/console/Gemfile.lock is excluded by !**/*.lock
📒 Files selected for processing (126)
  • .agents/plugins/marketplace.json
  • .claude-plugin/marketplace.json
  • .github/workflows/ci.yml
  • .github/workflows/console-ci.yml
  • .github/workflows/validate-agent-plugin.yml
  • .gitignore
  • README.md
  • contrib/chart/Chart.yaml
  • contrib/chart/templates/apirs.yaml
  • contrib/chart/templates/console.yaml
  • contrib/chart/templates/linearbot.yaml
  • contrib/chart/templates/slackbotv2.yaml
  • contrib/chart/values.schema.json
  • contrib/chart/values.yaml
  • crates/harness-server/src/codex.rs
  • crates/harness-server/src/otel.rs
  • docs/pages/reference/configuration.mdx
  • harness/claude/settings.json
  • harness/codex/config.toml
  • patches/@chat-adapter__slack@4.31.0.patch
  • patches/@chat-adapter__slack@4.40.0.patch
  • patches/@chat-adapter__state-pg@4.31.0.patch
  • plugins/centaur/.claude-plugin/plugin.json
  • plugins/centaur/.codex-plugin/plugin.json
  • plugins/centaur/README.md
  • plugins/centaur/skills/centaur/SKILL.md
  • pnpm-workspace.yaml
  • scripts/test_validate_agent_plugin.py
  • scripts/validate_agent_plugin.py
  • services/api-rs/crates/centaur-api-server/src/activity_summary.rs
  • services/api-rs/crates/centaur-api-server/src/args.rs
  • services/api-rs/crates/centaur-api-server/src/error.rs
  • services/api-rs/crates/centaur-api-server/src/mcp.rs
  • services/api-rs/crates/centaur-api-server/src/routes.rs
  • services/api-rs/crates/centaur-api-server/src/types.rs
  • services/api-rs/crates/centaur-iron-control/src/principal.rs
  • services/api-rs/crates/centaur-iron-control/src/session.rs
  • services/api-rs/crates/centaur-sandbox-agent-k8s/src/iron_proxy.rs
  • services/api-rs/crates/centaur-sandbox-agent-k8s/src/lib.rs
  • services/api-rs/crates/centaur-sandbox-core/src/backend.rs
  • services/api-rs/crates/centaur-sandbox-core/src/lifecycle.rs
  • services/api-rs/crates/centaur-sandbox-manager/src/lib.rs
  • services/api-rs/crates/centaur-sandbox-manager/src/manager.rs
  • services/api-rs/crates/centaur-sandbox-manager/src/reaper.rs
  • services/api-rs/crates/centaur-session-runtime/src/lib.rs
  • services/api-rs/crates/centaur-session-runtime/src/title_generator.rs
  • services/api-rs/crates/centaur-session-sqlx/experimental-migrations/company-context-embeddings/0001_create_company_context_document_embeddings.sql
  • services/api-rs/crates/centaur-session-sqlx/experimental-migrations/memory-generation/0001_create_memories.sql
  • services/api-rs/crates/centaur-session-sqlx/experimental-migrations/memory-generation/README.md
  • services/api-rs/crates/centaur-session-sqlx/migrations/0056_company_context_document_embeddings.sql
  • services/api-rs/crates/centaur-session-sqlx/migrations/0057_company_context_document_embeddings_hnsw.sql
  • services/api-rs/crates/centaur-session-sqlx/src/lib.rs
  • services/api-rs/crates/centaur-session-sqlx/tests/etl_context_rls.rs
  • services/api-rs/crates/centaur-workflows/src/lib.rs
  • services/api-rs/rfcs/0003-telemetry.md
  • services/api-rs/rfcs/0005-per-turn-requester-credentials.md
  • services/console/Gemfile
  • services/console/app/controllers/application_controller.rb
  • services/console/app/controllers/console/descopes_controller.rb
  • services/console/app/controllers/console/threads_controller.rb
  • services/console/app/jobs/google_docs/base_job.rb
  • services/console/app/jobs/granola/sync_credential_job.rb
  • services/console/app/models/principal.rb
  • services/console/app/services/console_features.rb
  • services/console/app/services/granola/sync_credential.rb
  • services/console/app/services/principal_credential_reconciliation.rb
  • services/console/app/views/console/threads/index.html.erb
  • services/console/app/views/layouts/console.html.erb
  • services/console/app/views/pwa/manifest.json.erb
  • services/console/test/controllers/console/integrations_controller_test.rb
  • services/console/test/controllers/console/threads_controller_test.rb
  • services/console/test/controllers/sessions_controller_test.rb
  • services/console/test/integration/pwa_test.rb
  • services/console/test/jobs/google_docs/jobs_test.rb
  • services/console/test/jobs/granola/jobs_test.rb
  • services/console/test/services/granola/sync_credential_test.rb
  • services/console/test/services/principal_credential_reconciliation_test.rb
  • services/githubbot/src/issue-manager.ts
  • services/githubbot/src/overrides.ts
  • services/githubbot/src/pr-manager.ts
  • services/githubbot/src/review.ts
  • services/githubbot/src/turn.ts
  • services/githubbot/test/overrides.test.ts
  • services/githubbot/test/turn.test.ts
  • services/linearbot/src/index.ts
  • services/linearbot/src/overrides.ts
  • services/linearbot/src/reasoning-effort.ts
  • services/linearbot/src/server.ts
  • services/linearbot/src/session-api.ts
  • services/linearbot/src/types.ts
  • services/linearbot/test/overrides.test.ts
  • services/linearbot/test/reasoning-effort.test.ts
  • services/sandbox/Dockerfile
  • services/sandbox/SYSTEM_PROMPT.md
  • services/sandbox/test_system_prompt.py
  • services/slackbotv2/package.json
  • services/slackbotv2/src/console-session-link.ts
  • services/slackbotv2/src/index.ts
  • services/slackbotv2/src/message-overrides-strategy.ts
  • services/slackbotv2/src/overrides.ts
  • services/slackbotv2/src/session-api.ts
  • services/slackbotv2/src/slack-display-text.ts
  • services/slackbotv2/src/slack-user.ts
  • services/slackbotv2/src/types.ts
  • services/slackbotv2/src/utils.ts
  • services/slackbotv2/test/adapter-stream.test.ts
  • services/slackbotv2/test/attachment-bytes.test.ts
  • services/slackbotv2/test/channel-defaults.test.ts
  • services/slackbotv2/test/chat-sdk-emulate.test.ts
  • services/slackbotv2/test/console-session-link.test.ts
  • services/slackbotv2/test/overrides.test.ts
  • services/slackbotv2/test/session-api.test.ts
  • tools/productivity/company_context/client.py
  • tools/productivity/company_context/tests/test_client.py
  • tools/productivity/granola/client.py
  • tools/productivity/granola/test_client.py
  • tools/productivity/gsuite/cli.py
  • tools/productivity/gsuite/client.py
  • tools/productivity/gsuite/test_cli.py
  • tools/productivity/gsuite/test_client.py
  • tools/productivity/slack/client.py
  • tools/productivity/slack/tests/test_client.py
  • workflows/company_context_embeddings.py
  • workflows/memory_generation.py
  • workflows/tests/test_company_context_embeddings.py
  • workflows/tests/test_memory_generation.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cursor

cursor Bot commented Sep 8, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_45ec83c8-170d-45f4-b49a-b5806e2c25f7)

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 8, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-08T07:09:25.877356Z f7974b2 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 353eb02dbd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread services/slackbotv2/package.json
Comment thread contrib/chart/values.schema.json Outdated
Comment thread workflows/memory_generation.py
Comment thread workflows/memory_generation.py
@cursor

cursor Bot commented Sep 8, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_e081a024-b67b-454d-aae8-920f5d290171)

@cursor

cursor Bot commented Sep 8, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_b720ca51-4324-4742-9f0a-dc70d472d1b6)

@cursor

cursor Bot commented Sep 8, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_e9a6ef9a-fdef-498b-b26d-4f2cf98833bf)

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 483aa6225d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread services/api-rs/crates/centaur-sandbox-agent-k8s/src/iron_proxy.rs Outdated
Comment thread workflows/memory_generation.py
Comment thread scripts/validate_agent_plugin.py Outdated
@cursor

cursor Bot commented Sep 8, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_0985c0b6-d7f0-4651-9db6-d671fe0f4e77)

@michaelmwu
michaelmwu merged commit 36f7816 into main Sep 8, 2026
41 checks passed
@michaelmwu
michaelmwu deleted the integration/paradigm-main branch September 8, 2026 07:04

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f7974b2090

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +429 to +436
try:
response = self._retry_on_ratelimit(
self._client.chat_getPermalink,
method_key="chat.getPermalink",
channel=channel_id,
message_ts=ts,
)
except (SlackApiError, SlackRateLimitError):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep permalink lookup failures best-effort

When chat_postMessage succeeds but the subsequent chat_getPermalink request times out or encounters another Slack SDK transport error, that exception is not a SlackApiError or SlackRateLimitError, so it escapes this helper and makes send_message report failure after the message was already delivered. An agent retry can then post the same message twice; search_messages can likewise lose otherwise valid results. Catch transport failures here and return the existing generic fallback permalink.

Useful? React with 👍 / 👎.

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.

10 participants