Skip to content

fix(effect): abort-recheck in boundary bridges + alias-aware lint - #164

Merged
ScriptedAlchemy merged 1 commit into
mainfrom
fix/review-effect-boundaries
Sep 1, 2026
Merged

fix(effect): abort-recheck in boundary bridges + alias-aware lint#164
ScriptedAlchemy merged 1 commit into
mainfrom
fix/review-effect-boundaries

Conversation

@ScriptedAlchemy

Copy link
Copy Markdown
Owner

Summary

Test plan

  • packages/rsc-runtime/tests/effect-boundary.test.ts — abort-after-composition-before-start
  • packages/agent-bundle/tests/effect-boundary.test.ts — same race on the dev-seam bridge
  • packages/rsc-runtime/tests/effect-boundary-lint.test.ts — alias detection + negative E.succeed fixture
  • pnpm typecheck
  • pnpm lint

Defer the aborted check until the effect starts and recheck after
addEventListener so a signal that aborts between composition and run
interrupts instead of hanging. Track aliased Effect namespaces in the
boundary lint rule so Fx.runPromise cannot slip through.
@changeset-bot

changeset-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 5aca896

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@ScriptedAlchemy
ScriptedAlchemy merged commit 7a9887b into main Sep 1, 2026
4 of 9 checks passed
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 1, 2026

Copy link
Copy Markdown

Codex Review Summary

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

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-01T18:14:29.779443Z 5aca896 PR opened
ℹ️ About Codex in GitHub

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

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

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

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5aca896553

ℹ️ About Codex in GitHub

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

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

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

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

Comment on lines 104 to +105
const objectName = node.object?.name;
if (objectName !== 'Effect' && objectName !== 'Runtime') return;
if (objectName === undefined || !runnerNamespaces.has(objectName)) return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Detect nested runners on root namespace imports

When code uses import * as E from 'effect', the package exports the Effect module as E.Effect (repos/effect/packages/effect/src/index.ts:157), so a valid call is E.Effect.runPromise(...); the new test's E.runSync is not an actual root-package runner. For the valid expression, the outer MemberExpression has another MemberExpression as its object, making objectName undefined here and allowing precisely this star-alias form to bypass no-ad-hoc-run. Recognize E.Effect.<runner> so root namespace imports cannot evade the boundary rule.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed in #199 (merged as 954a44b). The rule now walks nested static member paths, so import * as E from 'effect'; E.Effect.runPromise(...) (and deeper chains rooted at any remembered effect namespace) are flagged, while unrelated roots like Other.Effect.runPromise stay clean. Unit tests cover the nested/renamed namespace cases and the negative case.

ScriptedAlchemy added a commit that referenced this pull request Sep 1, 2026
Rebased survivors of the stranded deslop/wave-3.5 commit (5a8723423)
onto current main. Applied:

- finalizers: sqlite connection close and Flight reader cancel no longer
  mask the original failure when teardown itself throws
- state drivers: shared pending-open tracker replaces the verbatim
  trackPendingOpen/close-drain duplication; drop runPromise(Effect.fail)
  ceremony in favor of direct rejections
- boundaries: remove the unused runSyncExit export from both seams, the
  dead ScopedEffectRuntime E type parameter from the rsc-runtime copy
  (matching the dev-seam copy), and the redundant string ternary in
  toDevError/toRuntimeError
- delete dead epoch-lease-registry.ts (zero importers; #161 rewrote the
  same concept in epoch-store.ts); dedupe boundRenderEventStream through
  emitBoundRenderEvent; trim migration-narration comments

Dropped as superseded: the reconciler progress-queue rework (#172
rebuilt that path with a demand-bounded design), the dev-seam trim of
interruptWhenAborted/runPromiseExit (#164 fixed and kept them with
tests), the sqlite #commit self-rewrite (#171 rewrote #commit), and the
lint-plugin inlining (#164 expanded the plugin around those helpers).
@ScriptedAlchemy
ScriptedAlchemy deleted the fix/review-effect-boundaries branch September 3, 2026 05:27
ScriptedAlchemy added a commit that referenced this pull request Sep 3, 2026
ScriptedAlchemy added a commit that referenced this pull request Sep 3, 2026
…thout one (#410)

* chore(changesets): backfill changesets for merged PRs that shipped without one

Thirteen merged PRs changed a publishable package's shipped surface without a
changeset. Each gets a patch entry named for the PR (backfill-pr-<N>.md) with a
user-facing summary and the PR reference, per .changeset/README.md.

* chore(changesets): rewrite backfill summaries in imperative, consumer-first form

* chore(changesets): drop test-only detail from the #118 backfill summary

* chore(changesets): scope the #164 backfill to the runtime and name the surfaces behind dependency bumps

* chore(changesets): drop create-agent-bundle from the #348 backfill (output-neutral refactor)
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.

1 participant