Skip to content

refactor(opencode): retire bus automation facades - #1453

Merged
Astro-Han merged 2 commits into
devfrom
codex/i936-bus-automation-facade-retire
Jun 20, 2026
Merged

refactor(opencode): retire bus automation facades#1453
Astro-Han merged 2 commits into
devfrom
codex/i936-bus-automation-facade-retire

Conversation

@Astro-Han

@Astro-Han Astro-Han commented Jun 20, 2026

Copy link
Copy Markdown
Owner

Summary

Retire the Bus and Automation per-service runtime facades and move direct callers to injected services, AppRuntime-owned boundaries, or explicit scoped event publication.

Why

Related to #936. Bus and Automation still carried service-owned runtime bridges (makeRuntime(Service, layer) / automationRuntime) after the broader Effect graph had moved to AppRuntime. This PR removes those compatibility runtimes and adds a guardrail so they cannot quietly return.

Related Issue

Related to #936

Human Review Status

Pending

Review Focus

Please focus on Bus event semantics, Automation active-run state ownership, and the small caller migrations that previously depended on synchronous callback facades.

Risk Notes

Bus callback subscriptions now go through caller-owned service boundaries rather than namespace facades. Automation direct publish helpers keep their Promise-shaped public API while emitting scoped GlobalBus events without a per-service runtime. No UI, dependency, generated output, Worktree adaptor, Hono route source, OpenAPI, or SDK files changed.

Fresh-eye result: no P0/P1 findings. One P2 was found and fixed before PR creation: Automation.publishDefinitionUpdated / publishRunUpdated should preserve their Promise-shaped helper API even though the runtime facade is gone.

Skipped checklist items: visible UI/copy check does not apply because this is a backend Effect/runtime cleanup.

How To Verify

Guardrail RED: `bun test test/effect/legacy-boundaries.test.ts` failed before migration on Bus runtime facade import/export.
Focused tests after rebase: `bun test test/effect/legacy-boundaries.test.ts test/bus/bus.test.ts test/bus/bus-integration.test.ts test/tool/automate.test.ts test/tool/automate-manage.test.ts test/server/automation-routes.test.ts test/server/automation-runner.test.ts test/server/automation-scheduler.test.ts` -> 208 pass, 0 fail.
Typecheck after rebase: `GOMAXPROCS=2 bun run typecheck` -> pass.
LSP caller check: `bun test test/lsp/client.test.ts` -> 3 pass, 0 fail.
Diff check after rebase: `git diff --check` -> pass.
Static guard: `rg` confirms no production/test `Bus.publish/subscribe/subscribeAll` facade calls remain outside sync README examples, and Bus/Automation target files no longer contain their service runtime facades.

Screenshots or Recordings

Not applicable: no visible UI changes.

Checklist

  • Type label — this PR carries exactly one of bug, enhancement, task, documentation. Type labels are author-added; the labeler bot does NOT assign them. Add the label in the GitHub UI, then tick this.
  • Routing labels — this PR carries at least one of app, ui, platform, harness, ci. The labeler bot assigns these on PR open based on changed paths. Confirm the bot's choice (or override if wrong), then tick this.
  • Priority label — this PR carries exactly one of P0, P1, P2, P3. The priority-triage bot suggests one on PR open. Confirm or override, then tick this.
  • Human Review Status above is set to Pending, Approved by @<reviewer>, or Not required: <reason> (default is Pending; "not required" is restricted to bot-authored low-risk PRs).
  • I linked the related issue, or stated in Summary why there is no issue.
  • I described the review focus and any meaningful risks.
  • I replaced the example block in How To Verify with the real verification steps and the key result for each.
  • I did not introduce unrelated refactors, dependencies, generated files, or file changes beyond the stated scope.
  • (conditional) I manually checked visible UI or copy changes when needed, with screenshots or recordings. Leave unticked only if no visible UI or copy changed.
  • (conditional) I considered macOS and Windows impact for platform, packaging, updater, signing, paths, shell, or permissions changes. Leave unticked only if no platform/packaging surface was touched.
  • (conditional) I called out docs, release notes, dependencies, permissions, credentials, deletion behavior, generated content, or local file changes when relevant. Leave unticked only if none of those surfaces was touched.
  • I reviewed the final diff for unrelated changes and suspicious dependency changes.
  • I am targeting dev, and my PR title and commit messages use Conventional Commits in English.

Summary by CodeRabbit

Release Notes

  • Refactor
    • Redesigned core event system architecture to use dependency-injected services instead of static facade methods for improved modularity and testability.
    • Event publishing and subscription now routed through structured Bus.Service with Effect-based wiring across automation, LSP, file watching, and session services.

@Astro-Han Astro-Han added P2 Medium priority harness Model harness, prompts, tool descriptions, and session mechanics task Narrow execution, audit, spike, migration, tracking, or upstream follow-up work tech-debt Supplemental cleanup, maintainability, architecture, test, or quality debt context labels Jun 20, 2026
@coderabbitai

coderabbitai Bot commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@Astro-Han, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 1 minute and 49 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 8a2a3cd3-9995-4360-a224-289b0b07604e

📥 Commits

Reviewing files that changed from the base of the PR and between 0a1a1ac and 42f87a0.

📒 Files selected for processing (33)
  • packages/opencode/src/automation/index.ts
  • packages/opencode/src/bus/index.ts
  • packages/opencode/src/cli/cmd/github.ts
  • packages/opencode/src/cli/cmd/mcp.ts
  • packages/opencode/src/cli/upgrade.ts
  • packages/opencode/src/config/agent.ts
  • packages/opencode/src/config/command.ts
  • packages/opencode/src/file/watcher.ts
  • packages/opencode/src/lsp/client.ts
  • packages/opencode/src/lsp/index.ts
  • packages/opencode/src/lsp/server.ts
  • packages/opencode/src/server/instance/event.ts
  • packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts
  • packages/opencode/src/session/llm.ts
  • packages/opencode/src/sync/index.ts
  • packages/opencode/test/bus/bus-integration.test.ts
  • packages/opencode/test/bus/bus.test.ts
  • packages/opencode/test/effect/legacy-boundaries.test.ts
  • packages/opencode/test/file/watcher.test.ts
  • packages/opencode/test/lib/bus.ts
  • packages/opencode/test/lsp/client.test.ts
  • packages/opencode/test/mcp/lifecycle.test.ts
  • packages/opencode/test/mcp/oauth-browser.test.ts
  • packages/opencode/test/permission/next.test.ts
  • packages/opencode/test/pty/pty-session.test.ts
  • packages/opencode/test/server/automation-routes.test.ts
  • packages/opencode/test/server/automation-runner.test.ts
  • packages/opencode/test/server/automation-scheduler.test.ts
  • packages/opencode/test/server/event-stream-routes.test.ts
  • packages/opencode/test/session/session.test.ts
  • packages/opencode/test/session/turn-change-aggregate.test.ts
  • packages/opencode/test/sync/index.test.ts
  • packages/opencode/test/tool/automate-manage.test.ts
📝 Walkthrough

Walkthrough

Removes the static Bus.publish, Bus.subscribe, and Bus.subscribeAll facade functions from bus/index.ts and moves the GlobalBus fallback emission into Bus.Service.publish. Every caller across source modules (automation, file watcher, LSP, session LLM, sync, config, CLI, server handlers) is migrated to injected Bus.Service instances or GlobalBus.emit. A shared test helper library (test/lib/bus.ts) and all affected test files are updated accordingly.

Changes

Bus Facade Removal and Caller Migration

Layer / File(s) Summary
Bus.Service publish fallback and static API removal
packages/opencode/src/bus/index.ts
Removes makeRuntime import, rewrites Bus.Service.publish to build the payload outside the effect and emit a GlobalBus fallback with directory: "global" on LocalContext.NotFound, and deletes the exported publish/subscribe/subscribeAll static facade functions.
Automation state and event publishing refactor
packages/opencode/src/automation/index.ts
Replaces InstanceState/runtime-bridge state with a module-level activeStates map keyed by ownerDirectory with disposer cleanup; updates state() to accept optional Scope; changes deleteBySourceSession to emit via GlobalBus.emit; rewrites publishDefinitionUpdated/publishRunUpdated as async functions using currentScope(); updates the exported layer to yield Bus.Service and defaultLayer to provide Bus.defaultLayer.
Source module migrations to injected Bus.Service
packages/opencode/src/file/watcher.ts, packages/opencode/src/lsp/client.ts, packages/opencode/src/lsp/index.ts, packages/opencode/src/lsp/server.ts, packages/opencode/src/session/llm.ts, packages/opencode/src/sync/index.ts, packages/opencode/src/server/instance/event.ts
Acquires bus from Bus.Service in each module's layer and routes all event emissions through bus.publish(...) or GlobalBus.emit; LSPClient.create gains a bus parameter; each module's defaultLayer is extended to provide Bus.defaultLayer.
Config and CLI error/event path migrations
packages/opencode/src/config/agent.ts, packages/opencode/src/config/command.ts, packages/opencode/src/cli/cmd/github.ts, packages/opencode/src/cli/cmd/mcp.ts, packages/opencode/src/cli/upgrade.ts
Config error paths switch to GlobalBus.emit; CLI subscription sites switch to AppRuntime.runSync + Bus.Service.use + bus.subscribeCallback; upgrade.ts adds a publishInstallationEvent helper backed by Bus.Service.use.
Server-side session handler Bus.Service wiring
packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts
publishPromptAsyncError becomes an Effect.gen that yields Bus.Service and publishes the session error; promptAsync error branches call it directly.
Test bus helper library and legacy-boundary enforcement
packages/opencode/test/lib/bus.ts, packages/opencode/test/effect/legacy-boundaries.test.ts
Adds publishBus/subscribeBus/subscribeAllBus helpers wrapping Bus.Service via AppRuntime; adds a new boundary test asserting bus/index.ts and automation/index.ts contain no forbidden runtime facade strings.
Test file migrations to new bus helpers
packages/opencode/test/bus/*, packages/opencode/test/file/watcher.test.ts, packages/opencode/test/lsp/client.test.ts, packages/opencode/test/mcp/*, packages/opencode/test/permission/next.test.ts, packages/opencode/test/pty/pty-session.test.ts, packages/opencode/test/server/automation-*.test.ts, packages/opencode/test/server/event-stream-routes.test.ts, packages/opencode/test/session/*.test.ts, packages/opencode/test/sync/index.test.ts, packages/opencode/test/tool/automate-manage.test.ts
Replaces all direct Bus.subscribe/Bus.publish/Bus.subscribeAll calls with subscribeBus/publishBus/subscribeAllBus or GlobalBus-backed subscribeAutomationEvent/publishAutomationEvent helpers; LSP client tests add a fakeBus stub; file watcher tests add Bus.defaultLayer to the test layer.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • Astro-Han/pawwork#507: Modifies bus/index.ts to add a fallback GlobalBus "event" emission on missing instance, directly overlapping the main PR's relocation of that same fallback into Bus.Service.publish.
  • Astro-Han/pawwork#1438: Adds a companion test in test/effect/legacy-boundaries.test.ts asserting MCP/McpAuth no longer expose promise facades, the same file the main PR extends with Bus/automation facade checks.
  • Astro-Han/pawwork#1387: Modifies automation HTTP route handlers that publish definition/run updates and deletes, depending directly on the publishDefinitionUpdated/publishRunUpdated semantics refactored in this PR.

Poem

🐇 Hop hop, the static bus is gone,
No more facades to lean upon!
Each service now injects its own,
A scoped bus seed, properly sown.
GlobalBus handles the strays,
And tests all pass with cleaner ways! 🎉

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 8.89% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the primary change: retiring Bus and Automation facades, which is the core refactoring objective of the entire PR.
Description check ✅ Passed The description is comprehensive and follows the template well: Summary explains what changed, Why addresses the problem context, Related Issue is linked, Human Review Status is set, Review Focus is specific, Risk Notes are thorough, How To Verify includes detailed test results, and all required checklist items are addressed.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/i936-bus-automation-facade-retire

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 and usage tips.

@github-actions github-actions 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.

Suggested priority: P2 (includes non-doc, non-test paths outside the low-risk bucket).

P1/P0 are reserved for maintainer confirmation. Please relabel manually if this is a release blocker, security issue, data-loss risk, or updater/runtime failure.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 9

🧹 Nitpick comments (1)
packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts (1)

149-155: ⚡ Quick win

Use a named Effect.fn for this helper effect.

publishPromptAsyncError is a traced effect boundary in packages/opencode/**/*.ts; define it with Effect.fn("Session.publishPromptAsyncError") instead of a plain function returning Effect.gen.

As per coding guidelines, packages/opencode/**/*.ts: “Use Effect.fn("Domain.method") for named/traced effects and Effect.fnUntraced for internal helpers.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts`
around lines 149 - 155, The helper function handling the prompt async error
publishing should be defined using Effect.fn for proper tracing and naming
rather than as a plain function returning Effect.gen. Refactor the function that
logs the error and publishes the SessionNs.Event.Error event to use
Effect.fn("Session.publishPromptAsyncError") as the named effect definition,
which will enable automatic tracing while maintaining the same behavior of
logging and publishing the error with the sessionID and error details.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/opencode/src/automation/index.ts`:
- Around line 276-291: The registerDisposer callback at lines 277-279 only
deletes the state map entry without cleaning up active automation runs. You need
to enhance this callback to first retrieve the state for the given directory
using activeStates.get(), then iterate through all AbortControllers in the
activeRuns map within that state and call abort() on each one to cancel pending
work, and only then delete the state entry from activeStates. This ensures that
no work continues running after the instance is disposed and prevents orphaned
operations from keeping resources alive.

In `@packages/opencode/src/bus/index.ts`:
- Around line 87-110: The GlobalBus.emit call is currently inside the try block,
so errors thrown by its listeners get caught by the catch block that's meant to
handle only missing instance errors. This masks actual bus listener failures.
Move the GlobalBus.emit call that publishes the event with directory, project,
and workspace information outside of the try-catch block so it executes after
the catch block completes. Keep the event envelope construction (directory,
context, workspace variable assignments) inside the try block, but defer the
emit. The fallback GlobalBus.emit with directory "global" should remain in the
catch block as the error handler for missing instances.

In `@packages/opencode/src/config/command.ts`:
- Around line 32-34: The publishSessionError call in the reportLoadError
function is using void to ignore the promise, which can result in unhandled
rejections if the function fails. Add a catch handler to the publishSessionError
promise to explicitly handle any potential rejections, ensuring the error is
logged or handled gracefully rather than surfacing as an unhandled promise
rejection.

In `@packages/opencode/src/file/watcher.ts`:
- Around line 626-628: The fire-and-forget publish calls using void on lines
626-628 and 777-781 can result in unhandled promise rejections if the publish
operation fails. Instead of using void to suppress the promises, attach a
.catch() handler to each publish call to log any failures, similar to how the
rescan paths already handle publish failures. This applies to all three event
type handlers (create, update, delete) in both locations where they are used.

In `@packages/opencode/src/lsp/client.ts`:
- Around line 67-69: The `Effect.runPromise` call that publishes
`Event.Diagnostics` via `options.bus.publish` is being discarded with `void`,
which means any rejection from this promise will become an unhandled rejection
since it's being called from an LSP notification callback. Instead of using
`void` to discard the promise, attach a `.catch()` handler to the promise
returned by `Effect.runPromise` to log any errors that occur during the publish
operation, ensuring all rejections are properly caught and logged rather than
becoming unhandled promise rejections.

In `@packages/opencode/src/session/llm.ts`:
- Around line 303-307: The callback function inside bus.subscribeCallback for
Permission.Event.Replied is not doing anything with evt.properties.reply - it's
just reading the value without forwarding it. This is a no-op that prevents the
approval from being properly completed. Modify the callback to actually forward
or resolve the reply value (evt.properties.reply) to complete the approval
handler instead of discarding it. The reply should be passed to whatever
mechanism is waiting for the approval response in this async flow.

In `@packages/opencode/test/server/automation-routes.test.ts`:
- Around line 29-38: The subscribeAutomationEvent function filters GlobalBus
events only by payload.type, which allows events from other test instances to
interfere with the current test's event stream, causing flaky assertions. Modify
the listener callback to also check for an instance or scope identifier in
addition to the type check before invoking the callback. This requires adding an
instance-scoped identifier to the event filtering logic in the listener function
that processes events from GlobalBus.on, ensuring that only events from the
current test instance are processed and preventing cross-test event
contamination.

In `@packages/opencode/test/server/automation-runner.test.ts`:
- Around line 27-37: The subscribeAutomationEvent function's internal listener
only filters events by type, which allows same-type events from other tests to
trigger the callback and cause test pollution. Enhance the listener's filtering
logic to include additional scoping criteria such as directory, project,
workspace, or add an explicit predicate parameter to the function signature that
can be used to filter events before the callback is invoked. This scoping check
should be performed in the listener before calling the callback to ensure only
events relevant to the current test trigger the handler.

In `@packages/opencode/test/tool/automate-manage.test.ts`:
- Around line 23-33: The subscribeAutomationEvent function currently filters
events only by payload.type, which is insufficient for a process-wide GlobalBus
emitter and can incorrectly capture unrelated events from other tests. Enhance
the event filtering logic in the listener function to include additional scope
checks such as directory, project, or workspace identifiers from the event
payload, or alternatively add a required predicate parameter to the function
signature that allows callers to provide custom filtering logic before the
callback is dispatched.

---

Nitpick comments:
In `@packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts`:
- Around line 149-155: The helper function handling the prompt async error
publishing should be defined using Effect.fn for proper tracing and naming
rather than as a plain function returning Effect.gen. Refactor the function that
logs the error and publishes the SessionNs.Event.Error event to use
Effect.fn("Session.publishPromptAsyncError") as the named effect definition,
which will enable automatic tracing while maintaining the same behavior of
logging and publishing the error with the sessionID and error details.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 605c48ee-f637-4272-a23c-20d3817c17af

📥 Commits

Reviewing files that changed from the base of the PR and between 6452290 and 0a1a1ac.

📒 Files selected for processing (33)
  • packages/opencode/src/automation/index.ts
  • packages/opencode/src/bus/index.ts
  • packages/opencode/src/cli/cmd/github.ts
  • packages/opencode/src/cli/cmd/mcp.ts
  • packages/opencode/src/cli/upgrade.ts
  • packages/opencode/src/config/agent.ts
  • packages/opencode/src/config/command.ts
  • packages/opencode/src/file/watcher.ts
  • packages/opencode/src/lsp/client.ts
  • packages/opencode/src/lsp/index.ts
  • packages/opencode/src/lsp/server.ts
  • packages/opencode/src/server/instance/event.ts
  • packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts
  • packages/opencode/src/session/llm.ts
  • packages/opencode/src/sync/index.ts
  • packages/opencode/test/bus/bus-integration.test.ts
  • packages/opencode/test/bus/bus.test.ts
  • packages/opencode/test/effect/legacy-boundaries.test.ts
  • packages/opencode/test/file/watcher.test.ts
  • packages/opencode/test/lib/bus.ts
  • packages/opencode/test/lsp/client.test.ts
  • packages/opencode/test/mcp/lifecycle.test.ts
  • packages/opencode/test/mcp/oauth-browser.test.ts
  • packages/opencode/test/permission/next.test.ts
  • packages/opencode/test/pty/pty-session.test.ts
  • packages/opencode/test/server/automation-routes.test.ts
  • packages/opencode/test/server/automation-runner.test.ts
  • packages/opencode/test/server/automation-scheduler.test.ts
  • packages/opencode/test/server/event-stream-routes.test.ts
  • packages/opencode/test/session/session.test.ts
  • packages/opencode/test/session/turn-change-aggregate.test.ts
  • packages/opencode/test/sync/index.test.ts
  • packages/opencode/test/tool/automate-manage.test.ts

Comment thread packages/opencode/src/automation/index.ts
Comment thread packages/opencode/src/bus/index.ts Outdated
Comment thread packages/opencode/src/config/command.ts
Comment thread packages/opencode/src/file/watcher.ts Outdated
Comment thread packages/opencode/src/lsp/client.ts
Comment thread packages/opencode/src/session/llm.ts Outdated
Comment thread packages/opencode/test/server/automation-routes.test.ts
Comment thread packages/opencode/test/server/automation-runner.test.ts
Comment thread packages/opencode/test/tool/automate-manage.test.ts
@Astro-Han
Astro-Han force-pushed the codex/i936-bus-automation-facade-retire branch from 0a1a1ac to a4f5d67 Compare June 20, 2026 16:30
@Astro-Han
Astro-Han force-pushed the codex/i936-bus-automation-facade-retire branch 2 times, most recently from 2580e1d to 7482e02 Compare June 20, 2026 17:06
@Astro-Han
Astro-Han force-pushed the codex/i936-bus-automation-facade-retire branch from 7482e02 to 42f87a0 Compare June 20, 2026 17:09
@Astro-Han
Astro-Han merged commit 1a9734e into dev Jun 20, 2026
41 checks passed
@Astro-Han
Astro-Han deleted the codex/i936-bus-automation-facade-retire branch June 20, 2026 17:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

harness Model harness, prompts, tool descriptions, and session mechanics P2 Medium priority task Narrow execution, audit, spike, migration, tracking, or upstream follow-up work tech-debt Supplemental cleanup, maintainability, architecture, test, or quality debt context

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant