Skip to content

Promote v0.16.0 to production#686

Merged
mrubens merged 32 commits into
mainfrom
release/v0.16.0
Jul 21, 2026
Merged

Promote v0.16.0 to production#686
mrubens merged 32 commits into
mainfrom
release/v0.16.0

Conversation

@mrubens

@mrubens mrubens commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Promote v0.16.0

Frozen at 63d49472fb8d25b66b4d1a947aacb6b2f275be5a — the commit where 0.16.0 was versioned. Commits merged to develop after that point ship in the next release.

  • Merge this PR with a merge commit (do not squash or rebase).
  • If multiple promote PRs are open, merge them in version order (oldest first).
  • Merging publishes a GitHub Release for v0.16.0 and triggers the existing GHCR v* image publish (latest channel).
  • The release/v0.16.0 branch can be deleted after this PR merges.

Changelog

0.16.0 (2026-07-21)

Custom automations and wider CI triage coverage help teams automate more recurring work, with reliability improvements across task startup and integrations.

Highlights

  • Create custom automations with their own prompts, schedules, and destination channels for recurring work.
  • Investigate failed Azure DevOps and Bitbucket Pipelines automatically with CI Failure Triage.
  • Send Suggest Ideas results to Telegram and Microsoft Teams, and benefit from more reliable task startup and integrations.

Minor changes

  • Add CI Failure Triage for Azure DevOps and Bitbucket Pipelines, extending automated failed-build investigation to more source-control providers.
  • Add custom automations with their own prompts, schedules, and destination channels so recurring work can run and report where teams need it.
  • Let Suggest Ideas send its results to Telegram and Microsoft Teams destinations as well as existing supported channels.

Patch changes

  • Allow manual custom-automation runs to start while an earlier run is active, and keep report threads and footers tied to the correct automation.
  • Fix Discord task reactions and pull-request notification rendering so task status and bracketed titles display correctly.
  • Recover task runs whose workers stop responding during preparation so tasks no longer remain stuck indefinitely.
  • Reject pull requests on plain-issue list_issue_comments and create_issue_comment for GitHub and Gitea so agents cannot read or post PR discussion through the issue-only tool paths.
  • Improve self-hosted task startup and integrations by handling Docker bootstrap failures, public-edge OAuth callbacks, and non-GitHub webhook URLs correctly.

roomote-roomote Bot and others added 30 commits July 20, 2026 23:24
#648)

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…655)

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…URL is set (#649)

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…lic edge (#647)

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Co-authored-by: Roomote <roomote@roomote.dev>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…inishes (#658)

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Prevent recent/pinned tasks from painting under the user menu by
clipping the middle flex region, using padding instead of margin for
height math, and giving the footer a solid card background.

Co-authored-by: Roomote <roomote@roomote.dev>
)

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Co-authored-by: Daniel Riccio <57051444+daniel-lxs@users.noreply.github.com>
… summary (#663)

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…ng repos (#631)

* fix: restore Docker worker public egress during workspace prep

Stop blackholing the Docker bridge gateway as a host route. Drop only
packets destined to the gateway so host hairpin stays blocked while git
clone and other public HTTPS work again under control-network isolation.

* fix: make egress helper script valid shell and grant NET_RAW for iptables-legacy

The gateway-drop block was joined with spaces instead of newlines, which
produced a shell syntax error and would have failed every control-network
spawn inside the egress helper. Join the block with newlines and add a unit
test that parses the generated script with `sh -n`.

The helper also needs CAP_NET_RAW on top of CAP_NET_ADMIN: the worker image
forces iptables-legacy, which opens a raw socket that NET_ADMIN alone does
not permit. Both capabilities are in Docker's default set.

The integration test checked the iptables rule via `docker exec` in the
worker container, but the worker drops NET_ADMIN/NET_RAW and the test image
has no iptables binary; check the rule through a helper container sharing
the worker's network namespace instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: heal stale gateway blackhole on upgrade and harden gateway drop

Remove any gateway blackhole route left in a retained worker netns by a
pre-upgrade controller, so standby workers heal on policy re-apply instead
of requiring container recreation. Mirror the gateway drop in FORWARD to
keep the forwarded-traffic coverage the route blackhole used to provide.

Integration test now asserts real public egress (ip route get never sends
a packet) and exercises the upgrade-healing path by injecting the legacy
route and re-applying the policy. Document the iptables requirement for
custom worker images in SELF_HOSTING.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Daniel Riccio <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…hannels (#662)

* feat: add user-defined custom automations

Allow admins to create scheduled agent runs with a prompt, cadence,
required environment, and report destination channel.

* fix: show custom automation name in task attribution

Use the user-entered custom automation name from actorDisplayName
instead of the generic "Custom Automation" label.

* fix: custom automation schedule, claim race, Teams URL, tests

- Apply the 3am local-hour gate only to daily/weekly cadences
- Atomically claim launches via launchClaimedAt fencing
- Resolve Teams service URLs before enqueue
- Fix AutomationsSettings render mocks for custom automations

* fix: fence custom automation finalize and label cost rows

- Only clear launchClaimedAt / write lastLaunchedTaskId when the actor still owns the claim fencing token
- Pass actorDisplayName on cost analytics rows so custom automations group by name

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
* fix(bullmq): recover stale preparing task runs

* test(bullmq): pin stale worker query status scope
Co-authored-by: Daniel Riccio <57051444+daniel-lxs@users.noreply.github.com>
…667)

* feat: add Azure DevOps CI Failure Triage for default-branch builds

Wire build.complete webhooks and Manual Run now into the shared launch core,
ensure the project-scoped service hook, and document ADO support.

* fix: inspect latest completed ADO build without failed-only filter

Manual Run now can observe a newer green default-branch tip before deciding
whether to launch triage; failed-result handling stays in the job.

* fix(ci-triage): update badge test for ADO and prefer innermost failed timeline records

The capability-badge test now expects two 'GitHub · GitLab · Azure DevOps
only' badges since ci_failure_triage joins conflict_resolver. Failure
evidence keeps failed Task records over cascaded Job/Stage/Phase wrappers
so duplicate parent logs do not crowd the record cap.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(ado): surface credential rejections from build inspection

getLatestAdoBuild now throws on 203/401/403 so manual Run now reports a
credential problem in result.errors instead of logging the misleading
'latest build is not failed' skip; only 404 (unknown project/repository)
maps to null. Rename the shared timeout to ADO_BUILD_INSPECTION_TIMEOUT_MS
since it also bounds the latest-build lookup, and fold
normalizeAdoDefaultBranch onto stripAdoGitRef.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: keep independent ADO timeline failure leaves for evidence

Select innermost failed records via parent links so a peer job-level failure
is retained when another job already has a failed task.

---------

Co-authored-by: Daniel Riccio <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…accept null timeline fields (#672)

Live smoke testing against a real Azure DevOps org surfaced two gaps in the
CI Failure Triage integration:

- Subscriptions defaulted to resourceVersion 1.0, which delivers the legacy
  XAML build shape (status only — no result, sourceBranch, sourceVersion,
  repository, or project), so the build.complete handler skipped every real
  delivery as a non-failure. Pin the hook to 2.0, which sends the modern
  Build resource. Existing 1.0 subscriptions self-heal on the next repo
  sync because ensure PUT-refreshes them.

- Real timeline records carry explicit "log": null / "issues": null on
  wrapper and pending records; the schema rejected them and the whole
  evidence fetch failed with a ZodError. Accept nullish values.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat: allow Suggest Ideas to deliver via sticky Telegram topics

Make Telegram a first-class Suggest Ideas destination that auto-creates
and reuses a recurring forum topic, without a thread picker.

* chore: fix knip unused exports after Suggest Ideas Telegram work

* fix: keep Telegram suggester destinations off Slack metadata

Only attach Slack channel fields for Slack destinations, and merge sticky
Telegram topic ids when settings saves race first delivery.

* feat: add Teams as a first-class Suggest Ideas destination

Offer Teams · primary conversation alongside Slack, Discord, and Telegram so
Suggest Ideas covers all chat surfaces and no longer shows a limited-comms badge.

---------

Co-authored-by: Roomote <roomote@roomote.dev>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
#670)

Co-authored-by: Daniel Riccio <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
* feat: add Bitbucket CI Failure Triage for default-branch pipelines

* fix: ignore non-Pipeline Bitbucket commit statuses in CI triage

* fix: mock Bitbucket commit-status handler in webhook router tests

Importing the real handler pulls SDK/db graph into the router suite and
fails-when @roomote/db/server is only partially mocked.

* fix(bitbucket): mock commit-status handler in router tests, update badge test, surface scope rejections

Review fixes for the Bitbucket CI Failure Triage PR:

- Mock ../handleCommitStatus in the router tests so its import chain does
  not break the narrow @roomote/db/server mock, and add a routing test for
  repo:commit_status_updated.
- The capability-badge test now expects one 'GitHub - GitLab - Azure DevOps
  only' badge (conflict_resolver) and one four-provider badge for
  ci_failure_triage.
- Pipeline lookups throw on 401/403 with a pipeline-scope hint instead of
  returning null: every existing deployment's OAuth consumer predates the
  pipeline scope, and a missing scope must not read as 'no failed pipeline'
  (same treatment ADO got in #667). 404 still maps to null.
- New pipeline/step schemas accept explicit nulls on nested objects; real
  provider APIs send them where mocks never do (the #672 timeline lesson).
- Document the 20-pipeline scan cap in getBitbucketPipelineByBuildNumber.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: require Bitbucket host on commit-status pipeline URLs

Only extract a Pipelines identity when the status URL host matches the
configured Bitbucket instance, so external CI URLs with a pipelines/results
path cannot open triage for فص an unrelated Pipeline number.

* fix(bitbucket): request step logs as application/octet-stream

Bitbucket's pipeline step log endpoint responds 406 Not Acceptable to
Accept: text/plain, which silently degraded every failure evidence
block to "Log trace unavailable." Request the log as
application/octet-stream (the content type Bitbucket actually serves)
and make the test mock enforce the 406 behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Daniel Riccio <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
mrubens and others added 2 commits July 21, 2026 18:07
…automation framing from reports (#683)

* [Fix] Use the custom automation's name in the report footer and drop automation framing from reports

The root-footer refresh resolved its label from the initiator key via the
built-in automation registry, so custom automation threads rendered
'Created via the custom automation automation'; resolve the automation's
own name from the run payload marker instead. The anchored prompt now
also tells the agent to write the report as the result itself, without
mentioning the automation or the request; the footer already carries the
attribution.

* [Fix] Resolve the custom automation footer label across sibling runs

Resume runs do not copy customAutomationId into their payloads, so an
arbitrary findFirst could return a resume row and leave the footer on the
raw-key fallback. Scan the task's runs oldest first and take the marker
from whichever payload carries it.

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
@roomote-roomote

roomote-roomote Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

No code issues found. See task

Reviewed 63d4947

@mrubens
mrubens merged commit 12d8ef9 into main Jul 21, 2026
45 checks passed
@mrubens
mrubens deleted the release/v0.16.0 branch July 21, 2026 22:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants