Skip to content

[feat] Agents name their own sessions and themselves - #5903

Merged
mmabrouk merged 19 commits into
release/v0.112.0from
feat/agent-self-naming-tools
Aug 10, 2026
Merged

[feat] Agents name their own sessions and themselves#5903
mmabrouk merged 19 commits into
release/v0.112.0from
feat/agent-self-naming-tools

Conversation

@mmabrouk

Copy link
Copy Markdown
Member

Context

Sessions in the chat rail keep whatever truncated auto-title the client cut from the first message, and a new agent stays "Untitled agent" until a human renames it. The agent itself is the one participant that actually knows what a session is about, but it had no way to say so.

Changes

Two platform tools that every build-kit agent now carries, auto-allowed so no approval card interrupts the conversation:

  • rename_session sets the current session's name (what the session is about, findable in a list) and description (a one-sentence state recap). The session id is bound server-side from the run context; the model only passes name and description.
  • rename_agent renames the agent itself over PUT /api/workflows/{id}, with the artifact id bound server-side.

What had to change underneath, layer by layer:

  • The runner now carries the live session id in the tool-dispatch run context, so rename_session can bind it.
  • PUT joins the direct-call method allowlist (was GET/POST/DELETE), with the body serialized like POST.
  • Two prerequisite backend fixes: edit_workflow no longer nulls flags the caller omitted, and a missing or archived target now returns 404 instead of a success with count: 0 (a deleted agent can no longer be "renamed" successfully).
  • Names update live without a reload: a new project-scoped watch channel publishes session-changed / workflow-changed beside the committed writes, streamed to the browser over GET /api/sessions/watch?project_id= (SSE). One ProjectWatch mount in the layout invalidates the session list and workflow queries on each event, and a non-empty server-set name wins over the client's auto-title in the rail.
  • Server-side validation: whitespace-only names return 422 on both endpoints. The empty string stays accepted on sessions because the chat rail sends name: "" as the explicit clear-title action; workflows reject empty and whitespace-only alike.

Making the model actually use it

Live QA showed the plumbing is not the hard part: task-oriented agent personas call the tools reliably, but the bare default persona a brand-new agent ships with never did (0/3 organic trials). The tool description alone does not drive behavior. The fix is three tight bullets in the default agent persona (the exact surface the failing population gets, drift-locked between the SDK and the services fallback by unit tests): name the session after the first exchange, rename only on a genuine topic shift, rename the agent only when its identity or purpose changes.

Measured by the new self_naming benchmark class (5 scenarios, 3 trials each, with enforced rename-call budgets):

Scenario Result
name-05 default persona names its first session 3/3 one-shot (was 0/3 before the persona change)
name-04 no spurious rename on a trivial request 3/3 one-shot, zero rename calls (guard holds)
name-01 session named after a task 3/3 eventual (renames first, then over-explores past the one-shot budget)
name-02 re-rename on a topic shift 2/3 eventual, 1 miss
name-03 agent names itself on its first task 2/3 eventual, 1 miss

The two scenarios that define the product experience (05 and 04) pass fully. The residual misses are a general explore-before-acting habit, now permanently measured for future tuning.

Also in this branch

  • The shared watch SSE stream releases on server shutdown. Before, an infinite stream held uvicorn's graceful reload forever, so any file edit on a dev stack killed the API until a hard container restart.
  • The QA harness api_call() merges a path-embedded query string into params instead of letting httpx silently drop it (this bug corrupted half of the first benchmark run).

The full design workspace (research, API design, plan, QA notes) rides in this branch under docs/design/agent-self-naming-tools/.

Tests

  • Runner 2143/2143, SDK 2022, API sessions+workflows+applications 905 passed, web 143/143, CI-pinned ruff and prettier clean.
  • Acceptance against the live stack: workflow basics 9/9, plus the whitespace/clear-title cases on both endpoints.
  • Benchmark run above; raw results committed under benchmarks/agent-config-editing.

What to QA

  • Create a fresh agent, send one substantive first message. The session renames itself in the rail during the turn, with no reload and no approval card.
  • Open a second session on the same agent about a different topic. It gets its own name; the first session's name stays.
  • Rename a session yourself in the rail. Your name sticks (the agent may later overwrite it only on a real topic shift).
  • Regression: on a dev stack, edit any API file while a chat tab is open. The API reloads and comes back on its own instead of hanging until a container restart.
Full live-QA report (mechanism, scope, model behavior, permissions)

Live QA against agenta-ee-dev-rel112, driving both the UI and the wire API directly.

Tool mechanism, verified solid. Both endpoints persist correctly to Postgres (verified by direct row reads). Both ops are correctly auto-allowed: no approval frame ever appears in the SSE stream, on organic or explicit calls. GET /api/sessions/watch delivers real session-changed / workflow-changed events on every rename, and the sessions and agents lists live-update without a reload. Whitespace validation verified in all four cases plus a sanity check that normal renames still work.

Overlay scope, confirmed. A normal Chat-tab session on an already-created agent carries the full build-kit overlay including both rename ops with permission: "allow", byte-identical in shape to the onboarding composer's request. Every regular chat session gets the tools.

Trigger credentials, not a gap. Trigger-minted tokens carry the creating user's full RBAC role; EDIT_SESSIONS / EDIT_WORKFLOWS gate both endpoints identically for trigger and interactive auth. The build-kit permission: "allow" only skips the client-side approval UI, never server-side RBAC.

Model behavior. Organic trials with the literal default hello-world persona: 0/3 spontaneous renames before the persona change; the benchmark's task-oriented personas: 6/6 across both tools; explicit-instruction control: 1/1. After the persona change: the table above.

Found and fixed along the way: the server-side whitespace validation gap, a misleading AmbiguousConnectionError on an empty vault (#5902), the uvicorn reload wedge, and the harness query-drop bug.

Adds RunContext.session.id, runner-filled from env.sessionId at the
startToolRelay call and never service-filled. A missing direct-call
binding now names the tool in its error so the model can act on it.
…kit (S2+S3)

Endpoint-mode op against POST /api/sessions/streams/header with the
session id bound from $ctx.session.id and stripped from the model
schema. The name schema requires a non-whitespace character so the tool
cannot blank a title. The build-kit overlay emits permission: allow for
the rename ops so the first-turn call does not raise an approval card.
…le (T1)

Every locally set title is also persisted server-side, so letting the
server title win makes a server-side rename (the agent's rename_session
tool) visible in the chat without a reload.
… missing target (A2)

edit_workflow passed flags= unconditionally, so an edit that carried no
flags NULLed the column and dropped the row from the agents list. Flags
now pass through only when the edit actually set them. The route returns
404 for a missing or archived workflow and 400 on a path/body id
mismatch instead of 200 with count: 0, which the runner would report to
the model as a successful rename.
…ispatch (A1+A3)

The direct-call allowlist gains PUT (still four explicit methods, origin
lock and mount check unchanged; PUT serializes the JSON body like POST).
rename_agent is endpoint mode against PUT /api/workflows/{workflow_id}
with the artifact id bound twice from $ctx.workflow.artifact.id (path
and body, so the handler's id-mismatch branch is unreachable) and joins
the default build kit, auto-allowed like rename_session.
…eApp (A4)

The API no longer nulls flags an edit does not carry, so the hook stops
hard-coding a flag that is wrong for any non-application workflow.
…hod direct-call allowlist (V3)

Adds rename_session and rename_agent to the op table, refreshes the
stale DEFAULT_BUILD_KIT_OPS enumeration, and syncs the interface
inventory: the direct-call method allowlist is GET/POST/PUT/DELETE, an
unresolved $ctx token fails the call naming the tool, and the runner
augments its dispatch copy of runContext with the live session.id.
…budget (V2)

Adds session_header and workflow_header checks that read the stored
session stream and workflow artifact rows (pattern-based, never literal,
so a correct rename in the model's own words scores as a pass), header
seeding for trials that start from a named session or a placeholder
agent, and a max_rename_calls budget counted into within_budget — 0 by
default so the no-spurious-rename scenario can fail on a call at all.
A second channel scope beside the per-session one: watch:{project}:project
carries low-frequency {entity}-changed frames (ids only, never entity
data) for list pages. The route reuses watch_event_stream and requires
VIEW_SESSIONS and VIEW_WORKFLOWS together — one stream carries both
entity families and the frames carry nothing to filter per permission.
The publisher gains changed(*, project_id, entity, id) with the same
best-effort, one-second-bounded, never-raises contract.
…mmitted writes (W2)

set_header publishes one session-changed frame and edit_workflow one
workflow-changed frame on the project channel, each after its write
commits and each unable to fail it. WorkflowsService gains an optional
watch publisher, wired in the router and worker entrypoints.
…d agent lists (W3)

Extracts the EventSource lifecycle (visibility open/close, jittered
backoff with token refresh, ready revalidation, throttled trailing
flush) from useSessionRecordsWatch into useWatchEventSource, and mounts
a single project-scoped subscriber: session-changed invalidates the
["session-list", projectId] prefix, workflow-changed invalidates the
agents list and the artifact query; ready reruns both to cover frames
missed while disconnected. Handlers only invalidate — reconcile stays
with the mounted hooks.
…gmentation

A request with no runContext but a live session id now hands the relay
{session: {id}} — the S1 augmentation — so the stale no-run-context
assertion is updated to pin the new shape.
…flow edit endpoints

The \S constraint lived only in the LLM-facing tool schemas, so a
direct API call could persist a name of spaces — clearing the visible
title while the row still held a value. The session header edit now
validates on its feature-owned DTO (422), keeping the empty string as
the chat rail's explicit clear-title action; the workflow edit handler
rejects a present name that is empty or whitespace-only (422), while an
omitted name still means no change. The shared Header/ArtifactEdit DTOs
are untouched — other git entities reuse them.
…oads complete

Uvicorn's graceful shutdown drains in-flight responses BEFORE running
lifespan shutdown, and the watch SSE generators never end on their own —
so any open browser tab wedged every dev-stack reload permanently (live
symptom, seen twice: WatchFiles logs 'Reloading...', the old process
stops serving HTTP but keeps draining forever, and the API is dead until
a hard docker restart). Since Layout now always holds a ProjectWatch
connection, this blocked every dev-stack file edit.

The shared watch_event_stream (both the pre-existing per-session route
and the new project route ride it, so both had the defect and both are
fixed here) now bounds each Redis wait to <=1s and re-checks a module
shutdown flag, preserving the heartbeat cadence by counting idle polls;
uvicorn's Server.handle_exit — the first thing that runs on
SIGINT/SIGTERM, before the drain — is hooked to set the flag (the
sse-starlette approach). Client disconnect still releases via generator
cancellation, and CancelledError is never swallowed (the finally guards
only best-effort teardown). Unit tests pin the shutdown-signal exit, the
teardown on that path, and the installed hook actually requesting
shutdown.
…ing it to httpx params

httpx replaces an URL-embedded query string entirely when params= is
passed, so api_call's hardcoded project_id params silently dropped e.g.
?session_id=... and the endpoint 422ed with 'Field required' — observed
live as the self-naming benchmark failing at seed/verify (name-02/04
setup, name-01 verification read as no_action) while direct curls
worked. api_call now parses the path's query and merges it under the
params dict (explicit params kwarg wins, then project_id); a path
without a query builds the exact same request as before, and an
explicit params= kwarg — previously a TypeError — now merges too. Unit
tests pin all three shapes.
…idance, pinned by name-05

Live QA found the split: agents with task-shaped personas call
rename_session unprompted (benchmark name-01/03 pass 6/6), but the bare
product-default hello-world persona answers and stops in 3/3 organic
trials — a single line buried among 16+ tool descriptions loses to
'answer the question'. The standing guidance now rides the platform
default persona (_DEFAULT_AGENTS_MD, the surface a fresh UI-created
agent actually gets): name the session once the first exchange makes the
subject clear, rename only on a genuine topic shift, rename_agent only
on an identity/purpose change. The services config.py fallback copy is
synced and drift-locked against the SDK builder; benchmark scenario
name-05-default-persona-session seeds the persona verbatim (drift-locked
by test_default_persona_self_naming.py) as the regression guard for the
real new-user experience, with name-04's zero-rename budget still
guarding against churn.
@dosubot dosubot Bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Aug 10, 2026
@vercel

vercel Bot commented Aug 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agenta-documentation Error Error Aug 10, 2026 1:39pm

Request Review

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 86e965b8-8c2f-400d-b0ba-eb3333355b6f

📥 Commits

Reviewing files that changed from the base of the PR and between 9bc2e2e and 3969f7a.

📒 Files selected for processing (6)
  • .agents/skills/agent-release-gate/resources/qa_matrix_lib.py
  • .agents/skills/agent-release-gate/resources/test_qa_matrix_lib_api_call.py
  • benchmarks/agent-config-editing/bench_lib.py
  • benchmarks/agent-config-editing/run_benchmark.py
  • docs/design/agent-self-naming-tools/api-design.md
  • docs/design/agent-self-naming-tools/qa.md
🚧 Files skipped from review as they are similar to previous changes (5)
  • .agents/skills/agent-release-gate/resources/test_qa_matrix_lib_api_call.py
  • docs/design/agent-self-naming-tools/api-design.md
  • docs/design/agent-self-naming-tools/qa.md
  • .agents/skills/agent-release-gate/resources/qa_matrix_lib.py
  • benchmarks/agent-config-editing/run_benchmark.py

📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Added session and agent self-naming tools with validation and controlled permissions.
    • Added live project updates for session and workflow changes.
    • Added project-level event streaming with automatic reconnection and shutdown handling.
    • Enabled direct tool requests using PUT methods.
  • Bug Fixes
    • Improved workflow edit validation, error responses, and flag preservation.
    • Prevented whitespace-only session and workflow names.
    • Ensured server-provided session titles take precedence when non-empty.
    • Preserved embedded request query parameters correctly.
  • Documentation
    • Added guidance and design documentation for self-naming tools and live updates.

Walkthrough

This PR adds self-naming tools, runner context propagation, workflow and session validation, project-level watch events, frontend cache updates, benchmark scenarios, QA query handling, and related design documentation.

Changes

Rename tool contracts and catalog

Layer / File(s) Summary
Tool contracts and default availability
sdks/python/..., api/oss/src/core/workflows/build_kit.py, services/oss/src/agent/config.py
Adds rename_session and rename_agent, their schemas, permissions, default instructions, and build-kit registration.
Runner dispatch
services/runner/...
Propagates the live session ID, supports bound PUT calls, and improves missing-context errors.
API persistence and validation
api/oss/src/core/sessions/..., api/oss/src/core/workflows/..., api/entrypoints/...
Validates names, preserves omitted workflow flags, reports edit errors, and publishes committed changes.

Project watch and frontend updates

Layer / File(s) Summary
Project watch backend
api/oss/src/dbs/redis/sessions/..., api/oss/src/apis/fastapi/sessions/...
Adds project Redis channels, entity-change payloads, the /sessions/watch SSE endpoint, permission checks, heartbeats, and shutdown handling.
Frontend watch integration
web/oss/src/hooks/useProjectWatch.ts, web/oss/src/components/Layout/..., web/oss/src/components/AgentChatSlice/...
Adds shared EventSource handling, project event subscriptions, query invalidation, and server-title precedence during reconciliation.

Verification and supporting artifacts

Layer / File(s) Summary
Benchmarks, QA, and design documentation
benchmarks/agent-config-editing/..., .agents/skills/..., docs/design/...
Adds self-naming scenarios, persisted-header checks, rename-call budgets, query-merging tests, and design, research, status, plan, and QA documents.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 19.19% which is insufficient. The required threshold is 60.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description check ✅ Passed The description clearly explains the session and agent renaming tools, supporting backend changes, live updates, tests, and QA results.
Title check ✅ Passed The title clearly and concisely summarizes the primary change: agents can name their sessions and themselves.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/agent-self-naming-tools

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.

@mmabrouk

Copy link
Copy Markdown
Member Author

Post-PR real-UI sanity check (live stack, fresh agent created through the composer, working provider key):

  • The reinforced default persona is what newly-created agents actually receive (verified in the created agent's stored instructions).
  • One substantive first message ("draft a rollback plan for tomorrow's payments service deploy..."): the model called rename_session mid-turn, with no approval card.
  • The chat tab title updated live within the same turn, no reload: "Payments Deploy Rollback".
  • DB row confirms name and a well-formed one-sentence description.

This reproduces the benchmark's name-05 one-shot result in the actual product surface, not just at the wire tier.

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Railway Preview Environment

Status Destroyed (PR closed)

Updated at 2026-08-10T13:47:55.519Z

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Caution

CodeRabbit couldn't update its existing comment. The review summary may be out of date.

Error details
putComment timed out

@coderabbitai coderabbitai 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.

Actionable comments posted: 4

🧹 Nitpick comments (1)
web/oss/src/components/AgentChatSlice/state/sessions.ts (1)

423-425: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Shorten this comment.

Lines 423-425 add a three-line comment. Replace it with one short line or remove it.

Proposed change
- *  - enrich `title`/`createdAt` from the server (a non-empty server title wins: every local
- *    title is also persisted server-side, and a server-side rename — e.g. the agent's own
- *    `rename_session` tool — must show without a reload),
+ *  - Use a non-empty server title and server `createdAt`.

As per coding guidelines, "Keep in-code comments to at most one short line."

Source: Coding guidelines


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 606015cb-1225-435a-9243-a0593cfc702f

📥 Commits

Reviewing files that changed from the base of the PR and between fe34977 and 9bc2e2e.

📒 Files selected for processing (56)
  • .agents/skills/agent-release-gate/resources/qa_matrix_lib.py
  • .agents/skills/agent-release-gate/resources/test_qa_matrix_lib_api_call.py
  • api/entrypoints/routers.py
  • api/entrypoints/worker_queues.py
  • api/oss/src/apis/fastapi/sessions/router.py
  • api/oss/src/apis/fastapi/sessions/watch.py
  • api/oss/src/apis/fastapi/workflows/router.py
  • api/oss/src/core/sessions/streams/dtos.py
  • api/oss/src/core/sessions/streams/service.py
  • api/oss/src/core/sessions/watch/interfaces.py
  • api/oss/src/core/workflows/build_kit.py
  • api/oss/src/core/workflows/service.py
  • api/oss/src/dbs/redis/sessions/contract.py
  • api/oss/src/dbs/redis/sessions/watch.py
  • api/oss/tests/pytest/acceptance/sessions/test_stream_header_basics.py
  • api/oss/tests/pytest/acceptance/workflows/test_workflows_basics.py
  • api/oss/tests/pytest/unit/applications/test_build_kit_overlay.py
  • api/oss/tests/pytest/unit/sessions/test_stream_header_merge.py
  • api/oss/tests/pytest/unit/sessions/test_watch_endpoint.py
  • api/oss/tests/pytest/unit/sessions/test_watch_publish.py
  • api/oss/tests/pytest/unit/workflows/test_edit_endpoint_name_validation.py
  • benchmarks/agent-config-editing/bench_lib.py
  • benchmarks/agent-config-editing/run_benchmark.py
  • benchmarks/agent-config-editing/scenarios/09-self-naming.json
  • docs/design/agent-self-naming-tools/README.md
  • docs/design/agent-self-naming-tools/api-design.md
  • docs/design/agent-self-naming-tools/context.md
  • docs/design/agent-self-naming-tools/plan.md
  • docs/design/agent-self-naming-tools/qa.md
  • docs/design/agent-self-naming-tools/research.md
  • docs/design/agent-self-naming-tools/status.md
  • docs/design/agent-workflows/documentation/tools.md
  • docs/design/agent-workflows/interfaces/cross-service/runner-to-tool-callback.md
  • docs/design/agent-workflows/interfaces/cross-service/service-to-agent-runner.md
  • sdks/python/agenta/sdk/agents/dtos.py
  • sdks/python/agenta/sdk/agents/platform/op_catalog.py
  • sdks/python/agenta/sdk/agents/tools/models.py
  • sdks/python/agenta/sdk/utils/types.py
  • sdks/python/oss/tests/pytest/unit/agents/platform/test_op_catalog.py
  • sdks/python/oss/tests/pytest/unit/agents/test_default_persona_self_naming.py
  • services/oss/src/agent/config.py
  • services/oss/tests/pytest/unit/agent/test_default_agent_template.py
  • services/runner/src/engines/sandbox_agent/run-turn.ts
  • services/runner/src/protocol.ts
  • services/runner/src/tools/direct.ts
  • services/runner/src/tools/relay.ts
  • services/runner/tests/unit/sandbox-agent-orchestration.test.ts
  • services/runner/tests/unit/tool-direct.test.ts
  • web/oss/src/components/AgentChatSlice/hooks/useSessionRecordsWatch.ts
  • web/oss/src/components/AgentChatSlice/state/sessions.pageTitle.test.ts
  • web/oss/src/components/AgentChatSlice/state/sessions.ts
  • web/oss/src/components/EntityIdentity/useRenameApp.ts
  • web/oss/src/components/Layout/Layout.tsx
  • web/oss/src/components/Layout/ProjectWatch.test.tsx
  • web/oss/src/components/Layout/ProjectWatch.tsx
  • web/oss/src/hooks/useProjectWatch.ts
💤 Files with no reviewable changes (1)
  • web/oss/src/components/EntityIdentity/useRenameApp.ts

Comment thread .agents/skills/agent-release-gate/resources/qa_matrix_lib.py Outdated
settled.get("settled", False)
and len(errors) <= budget["max_tool_errors"]
and commit_calls <= budget["max_commit_calls"]
and rename_calls <= budget["max_rename_calls"]

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Include rename calls in harness-only attribution.

Line 248 makes rename calls part of the budget. The call at Line 270 does not pass rename_calls to blocked_only_by_harness.

A trial that exceeds max_rename_calls and has only harness errors can be reported as blocked only by the harness. This corrupts the corrected-rate diagnostic.

Proposed fix
- "blocked_only_by_harness": B.blocked_only_by_harness(
-     errors, commit_calls, budget
- ),
+ "blocked_only_by_harness": B.blocked_only_by_harness(
+     errors, commit_calls, rename_calls, budget
+ ),

Update blocked_only_by_harness to reject records where rename_calls exceeds budget["max_rename_calls"].

Also applies to: 270-272

Comment thread docs/design/agent-self-naming-tools/api-design.md Outdated
Comment thread docs/design/agent-self-naming-tools/qa.md Outdated
…t in harness attribution, doc fixes

- qa_matrix_lib.api_call keeps the path query as pairs so repeated keys
  (?workflow_refs=a&workflow_refs=b) survive the merge; new test.
- blocked_only_by_harness now takes rename_calls so an over-budget rename
  trial is never excused as harness-blocked.
- api-design.md documents the implemented auto-allow default; qa.md wording.
@mmabrouk
mmabrouk merged commit df65653 into release/v0.112.0 Aug 10, 2026
61 of 63 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend feature frontend size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant