merge: integrate paradigmxyz/centaur main - #35
Conversation
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>
…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
|
Important Review skippedToo 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 configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: ⛔ Files ignored due to path filters (4)
📒 Files selected for processing (126)
You can disable this status message by setting the 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. Comment |
Bugbot couldn't run - usage limit reachedBugbot 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) |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 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".
Bugbot couldn't run - usage limit reachedBugbot 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) |
Bugbot couldn't run - usage limit reachedBugbot 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) |
Bugbot couldn't run - usage limit reachedBugbot 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) |
There was a problem hiding this comment.
💡 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".
Bugbot couldn't run - usage limit reachedBugbot 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) |
There was a problem hiding this comment.
💡 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".
| try: | ||
| response = self._retry_on_ratelimit( | ||
| self._client.chat_getPermalink, | ||
| method_key="chat.getPermalink", | ||
| channel=channel_id, | ||
| message_ts=ts, | ||
| ) | ||
| except (SlackApiError, SlackRateLimitError): |
There was a problem hiding this comment.
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 👍 / 👎.
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, andvalidate-agent-pluginCI) so MCP clients can install and OAuth against a deployment-specific/mcpURL.Control plane and Helm gain company-context embedding knobs (
maxInputChars, fixed1536dimensions, 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 addschat.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_idwhen a requested persona is missing, and workflow-hostOPENAI_BASE_URLpassthrough. slackbotv2 moves to@chat-adapter/slack@4.40.0with a refreshed patch (drops the oldstate-pgpatch). 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.