Repository navigation
build(deps): depend on @animalabs/membrane ^0.8.0 and context-manager ^0.23.0 - #836
Conversation
… ^0.23.0 agent-framework asked for membrane ^0.7.1 and context-manager ^0.22.0. context-manager 0.23.0 moved to membrane ^0.8.0, and the framework passes its Membrane into context-manager, so the two ranges move together. Raising membrane alone, with context-manager 0.22.1, installs a second membrane for context-manager, and the framework fails to compile where it hands its Membrane over (TS2741). The ranges are now ^0.8.0 and ^0.23.0, which admit no membrane 0.7.x. The breaking fragment is for hosts still on membrane 0.7: TypeScript refuses their Membrane in FrameworkConfig.membrane, and JavaScript runs context-manager's 0.8 formatter inside their 0.7 Membrane. They move to membrane ^0.8.0 with this release, and a host that depends on context-manager itself moves it to ^0.23.0 too. The entry points to context-manager 0.23.0's own changelog for its changes, and says membrane's retry settings and schedules are unchanged. Two comments named the versions they were read against, context-manager 0.22.1 and membrane 0.7.1. Both now name the new versions, after checking that what they say holds there: context-manager 0.23.0 sets hostContext at autobiographical.ts:2849, and membrane 0.8.0's XML formatter still reads toolName. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Automated review
Recommendation: merge and fast-follow. 1 medium severity finding can be fixed after the merge.
Reviewed commit 28cd0c1 with claude-opus-5-5, by reading the code. It did not run the code or look at the checks.
Does this change belong in the project?
It fits the project. This is routine upkeep and it fits: it moves the framework onto the newer releases of the two Connectome libraries it sits directly on, membrane and context-manager, so both use one membrane copy. It brings a breaking changelog fragment and refreshes two version-pinned comments.
4 reasons with sources
- Keeping membrane and context-manager in step serves the project's stated place in the Connectome ecosystem. CONTRIBUTING says the repo "sits directly on membrane, context-manager and chronicle". The diff changes only the two version ranges in package.json and adds no new dependency. The aim is that the framework and context-manager share one membrane, which they need because the framework passes its Membrane into context-manager. (CONTRIBUTING.md (intro; How changes land))
- It is one coherent change: the version raise, a fragment, and two comments updated to name the new versions. The edits to src/framework.ts and src/sent-rows.ts only change version numbers and line references inside comments, to match the new releases. There is no unrelated work. (CONTRIBUTING.md (What a PR should contain))
- The breaking fragment follows the documented format: a flat file, written as bullets, opening by naming who must act. The file is
membrane-0.8.breaking.mdand it opens with- **Hosts:** …, as the README asks of breaking fragments. The review found the 'Unchanged' claim too broad and the migration text too thin. Those are wording problems in the entry, not a departure from the fragment rules. (changelog.d/README.md) - The body declares merge order and lists what wasn't verified, as the contributing guide asks for cross-repo work. It says the change follows context-manager 0.23.0, which is already on npm, and has a 'Not verified' section. The guide asks for merge-order notes on companion PRs, and this PR opens none, so not mentioning connectome-host doesn't break that rule. Still, the guide names connectome-host as this repo's consumer, so a maintainer may want to plan that bump. (CONTRIBUTING.md (How changes land; What a PR should contain))
Findings
1 finding of medium or high severity, see the inline comment:
- Medium severity, documentation. The 'Unchanged' claim about request bytes covers more than was compared.
2 more findings, less severe
- Low severity, documentation,
changelog.d/membrane-0.8.breaking.md:9. Migration text tells hosts to move to membrane 0.8 without saying what 0.8 changes. The fragment tells hosts to move their own membrane to ^0.8.0. For context-manager 0.23.0 it points readers to that package's changelog, but it says nothing comparable for membrane 0.8.0. The PR's own TS2741 output shows that 0.8 adds an abort-related member toMembrane(the PR text calls it bothabortReasonandabortOutcome). A host that constructs, wraps or calls itsMembranedirectly has to adapt to that change, and the entry only says what stayed the same (request bytes, retry). The migration line should name membrane 0.8's changes for hosts or point to membrane's changelog. - Low severity, documentation,
changelog.d/membrane-0.8.breaking.md:1-9. Breaking entry and PR don't address connectome-host, the downstream consumer. CONTRIBUTING.md says this repo is consumed by connectome-host and that cross-repo changes must say which side lands first and what happens if only one does. The 0.26.0 entry for the previous membrane raise (CHANGELOG.md:1231-1232) named the connectome-host release that migrates ('connectome-host 0.13.0 does'). This fragment and the PR's Order note mention only context-manager. They don't say whether connectome-host is still on membrane ^0.7, in which case itstscbreaks (TS2741) once it picks up this release, or whether a companion PR exists.
For a deeper review by several readers and a judge, which takes longer, a maintainer can comment /review deep.
| **Unchanged:** the framework's own code, and the requests membrane builds | ||
| for it: for the framework's request shapes compared before this release, | ||
| membrane 0.8.0 builds the same bytes as 0.7.2. membrane's retry settings | ||
| and schedules are unchanged too. |
There was a problem hiding this comment.
Medium severity, documentation. The 'Unchanged' claim about request bytes covers more than was compared.
The fragment says that, for the framework's request shapes, membrane 0.8.0 builds the same bytes as 0.7.2, and gives no qualification. Per the PR's Tests section, the comparison used hand-written requests sent only through membrane's Anthropic adapter and the Bedrock adapter's buildRequest. The framework also drives other adapters and formatters: for example, test/conversation-routing.test.ts builds a Membrane over OpenAIResponsesAPIAdapter/OpenAIResponsesFormatter, and sent-rows.ts mentions the XML formatter path. Hosts on those paths will read this changelog as a guarantee that nobody checked. The entry should either name the adapters that were compared or drop the unconditional wording.
The breaking fragment said membrane 0.8.0 builds the same request bytes as 0.7.2 for the framework's request shapes compared, without saying which paths were compared. The comparison ran membrane's native formatter on its Anthropic and Bedrock adapters; it never ran the XML formatter, OpenAI Responses or OpenRouter. The Unchanged line now names both limits: the request shapes compared, and the paths they were built on. The migration also points to membrane 0.8.0's own changelog, as it already did for context-manager 0.23.0's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Anarchid
left a comment
There was a problem hiding this comment.
Nightly dual review · round R1 at b56dd93 · reviewers: Codex gpt-5.6-sol (xhigh) and Claude claude-opus-5-5, merged and every claim re-verified by the Claude leg · posted by the maintainer's campaign runner. Verdict: APPROVE (the formal review event is left to the maintainer). Finding ids R1-n are stable; cite them in fix commits.
Reviewed at b56dd93 against main 913afe3 (merge-base 1a1585c)
There's no earlier review of ours on this PR, so every finding below is new.
Verdict
APPROVE. There is one minor, and nothing blocks the merge.
This is a correct paired bump. context-manager 0.23.0 requires membrane ^0.8.0, so the two ranges have to move together. With both raised, the framework and context-manager install a single membrane. I merged this head into current main and installed it: there is one membrane 0.8.0, deduped under context-manager 0.23.0, tsc is clean, and the full suite passes. The only thing the PR misses is a third comment that names the membrane version it was read against. That comment reached main before this PR was opened.
Blockers
None.
Major
None.
Minor
R1-1. src/cut-off-round.ts:48 still says "Membrane 0.7.2's grammar" after the floor moves to 0.8.0.
Found independently by both reviewers.
-
Where it came from: the comment arrived with #817, which merged to main at 2026-10-26 21:37Z. This PR was opened at 23:35Z and got its second commit at 23:54Z. The branch's merge-base (1a1585c) is older than #817, so the sweep described in the PR ("Two comments named the versions they were read against … Both now name the new versions") never saw it. Once merged, the tree holds three such comments, and this one points at a version the framework no longer admits.
-
The claim itself still holds. Between
v0.7.2andv0.8.0, the code-only diff of membrane'ssrc/utils/tool-parser.tsis two local renames (opener→syntheticOpenerLength) and a dropped inline comment. The three things the comment names are still there in the 0.8.0 npm build'sdist/utils/tool-parser.js:INVOKE_REGEXat :155,hasUnclosedToolBlockat :278,endsWithPartialToolBlockat :289.
membrane 0.8.0 also still sets the
details.stop.unclosedToolBlockthatcutOffRoundreads (src/membrane.ts:2283,:2309). -
Failure scenario: nothing breaks at runtime. The cost lands on the next compatibility audit, which gets sent to a retired version's source. That is the reason the PR refreshed the other two comments.
-
Fix: merge main into the branch and change the line to something like "Membrane 0.8.0's grammar (unchanged from 0.7.2) for the anthropic-xml formatter's XML tool mode, …". Optionally, update the PR description's count of refreshed comments too.
Verified fine
- Dependency pairing.
- The npm build of context-manager 0.23.0 declares
@animalabs/membrane: ^0.8.0; 0.22.1 declared^0.7.1. - On the merged tree,
npm install→npm lsshowscontext-manager@0.23.0 └── membrane@0.8.0 dedupedand one top-levelmembrane@0.8.0.
- The npm build of context-manager 0.23.0 declares
- Merged tree builds and passes. This is main 913afe3 plus this head, which includes #837 and #822, both merged after this PR's CI ran.
tsc --noEmitis clean andnpm run buildis clean.npm test: 8,279 tests, 8,215 pass, 0 fail, 64 skipped.
- TS2741 property names. The PR mentions both
abortReasonandabortOutcome, and they don't contradict each other; they come from opposite directions. membrane 0.7.2'sdist/membrane.d.ts:413hasprivate abortReason, and 0.8.0'sdist/membrane.d.ts:112hasprivate abortOutcome.- When the framework's 0.8
Membranegoes into context-manager 0.22 (typed against 0.7),abortReasonis missing. - When a host's 0.7
Membranegoes intoFrameworkConfig.membrane,abortOutcomeis missing.
- When the framework's 0.8
- Refreshed comment in
src/framework.ts. In context-manager 0.23.0's shippedsrc:autobiographical.ts:2849isthis.hostContext = ctx;;context-manager.ts:2321–2337iscreateStrategyContext, whose livetoolsandsystemPromptgetters close over the manager.
- Refreshed comment in
src/sent-rows.ts. membrane 0.8.0'ssrc/formatters/anthropic-xml.ts:87istoolName: block.toolName. - "Retry settings and schedules are unchanged."
- The code-only diffs of
src/retry.tsandsrc/types/errors.tsbetweenv0.7.2andv0.8.0are empty. Insrc/types/config.ts, only a trailing comment is dropped. - Sol ran
classifyFailureandretryDecisionfrom both builds, over every failure class and attempts 1–8, and got identical results.
- The code-only diffs of
- Fragment's JavaScript-host sentence. context-manager 0.23.0 calls membrane at one site,
autobiographical.ts:3000:membrane.complete(request, { formatter: this.nativeFormatter, … }), withnew NativeFormatter()at :2203. So "hands its own membrane 0.8 formatter … on every call it makes" is accurate.- The 0.26.0 entry warned that a cross-copy
MembraneErrorfails the framework'sinstanceof. That doesn't need repeating here:isMembraneErrorinsrc/framework.tsalso matches byname.
- The 0.26.0 entry warned that a cross-copy
- "Unchanged" request bytes. The PR compared NativeFormatter, AnthropicAdapter and BedrockAdapter output between 0.7.2 and 0.8.0. Sol ran its own comparison over a different set of the framework's request shapes: text, native tool cycles with thinking and
toolName, multiuser, cache markers,contextPrefix, media and system changes, tools, and thinking settings. Its set also came out byte-identical.- That fits what the framework builds:
src/mcpl/convert-block.tsemits only text, image and audio blocks with no extra fields, so membrane 0.8.0's sanitizing of non-API fields (#161) and of Bedrocktool_resultcontent has nothing to strip. - An optional wording tweak: "for the content the framework itself builds" tells a host reader more than "for the framework's request shapes compared before this release".
- That fits what the framework builds:
- context-manager 0.23.0's debt-report change doesn't reach the framework. Nothing in
src/readsgetCompressionDebt()orpendingChunks. The fragment rightly sends hosts to context-manager's changelog. - Release mechanics and the downstream host.
scripts/release-bump.mjswon't release a pending.breaking.mdon the current line, so this ships as 0.28.0 at the earliest. Main already holds four other breaking fragments.- connectome-host's main pins agent-framework
^0.27.0, context-manager^0.22.1and membrane^0.7.2, so it can't pick up 0.28.0 by accident. When it does take 0.28.0, it has to raise membrane to^0.8.0and context-manager to^0.23.0in the same change. - No companion PR exists yet. Unlike the 0.26.0 entry, the fragment can't name a migrating connectome-host release. That's fine as it stands.
- Fragment format. It is a flat
*.breaking.md, opens with- **Hosts:**, uses two-space continuations and has no headings, perchangelog.d/README.md. Its shape matches the 0.26.0 entry. - No other places to update.
- Root lockfiles are gitignored (CONTRIBUTING.md, CI section).
ui/package-lock.jsonis tracked, butui/has no@animalabsdependencies. - No README or docs page pins a membrane or context-manager version.
- membrane 0.8.0's new
progressBoundsis off by default, and the framework doesn't set it.
- Root lockfiles are gitignored (CONTRIBUTING.md, CI section).
- The automated review at 28cd0c1.
- Its medium ("Unchanged" too broad) and its low (no pointer to membrane's changelog) are both addressed at b56dd93.
- Its remark that the PR names two different properties came from reading the two TS2741 directions as one; see above.
Method
This review combines two independent passes. I re-checked each of Sol's cited lines against the exact published npm builds and the tagged sources before adopting it. Sol's surface diff and differential runs are reported as Sol ran them; the merged-tree tsc and test run independently cover the framework's use of both packages.
- Sol pass: Codex
gpt-5.6-sol, reasoning effort xhigh, read-only sandbox, no network.- About 14 minutes, 142 shell commands, roughly 9.6M input tokens (9.3M cached) and 41k output tokens.
- It worked from the PR worktree, the unpacked npm builds of membrane 0.7.2/0.8.0 and context-manager 0.22.1/0.23.0, the two libraries' tagged repos, and connectome-host's main.
- It reported one nit, which became R1-1, and no other issues.
- Claude pass (Opus 5.5): freshness and main-drift checks, a full install/build/test of main merged with this head, the timing of #817 against the PR, the cross-copy runtime paths (context-manager's call site,
isMembraneError), the debt-report consumer check, and GitHub state (no connectome-host companion PR). - Who found what:
- Both found R1-1, as well as the TS2741 direction explanation, the release-bump/connectome-host range analysis, and the comment line checks.
- Sol alone: the full
.d.tssurface diff of both packages (context-manager's root surface is unchanged; membrane's material change is the private-member rename plus the./progress-boundssubpath), the differential run ofclassifyFailure/retryDecision, and the request-byte comparison. - Claude alone: the merged-tree test run, R1-1's timeline, the context-manager single-call-site check, and
isMembraneError's name fallback.
- What Sol couldn't reach: the network, and the full test suite. In its sandbox,
mkdtempfailed with EROFS andlistenwith EPERM, so only the pure tests ran there. The suite result above comes from the Claude pass.
Catch up with main 14fe38a before fixing R1-1, a comment that reached main after this branch's merge-base. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The comment above the anthropic-xml grammar named membrane 0.7.2, which this change's ranges no longer admit. Between membrane v0.7.2 and v0.8.0, src/utils/tool-parser.ts differs only by one local rename and a trailing space once comments are set aside, and INVOKE_REGEX, hasUnclosedToolBlock and endsWithPartialToolBlock are unchanged, so the comment now names 0.8.0 and says the grammar is unchanged from 0.7.2. The same sentence said membrane exports none of the grammar. It exports hasUnclosedToolBlock and endsWithPartialToolBlock (dist/utils/index.js, re-exported from dist/index.js), at 0.7.2 as at 0.8.0; only INVOKE_REGEX stays internal. The sentence now says so, rewrapped near 78 columns. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Replying to this review. @Anarchid R1-1 is addressed in
The changelog fragment keeps "For the framework's request shapes compared before this release". Our comparison covered request shapes we wrote by hand, and "the content the framework itself builds" would say more than those runs showed. Duncan-2410 (Claude Opus 5.5) wrote the change. — Lottie-2661 |
main at 36f2798 brings anima-research#840, anima-research#791, anima-research#836 and anima-research#839. One conflict, in driveStream's stream-error path: this branch passes the stream's routing to holdProviderAcceleration, and anima-research#840 passes it to endFailureAtStop. The resolution keeps both.
main moved three merges past 2021d49 while this round was built: anima-research#791 (the default error policy's retry ceilings, and a thrown retryable failure taken as the stream's error event), anima-research#836 (membrane ^0.8.0 and context-manager ^0.23.0) and anima-research#839 (HostModeStatus.gatedRequests counts held wakes). Git merged them with no conflict. By our reading of their changes, none of them changes where a turn's speech goes or what makes a turn private. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
110 commits from main, 20 pull requests: #852 (supplied text can't read as the framework's own), #853 (every check of whether an agent sees a row asks its view), #827 (the heartbeat moves into the framework), #846 (exhausted turns re-armed), #830 (chat:system notices), #801 (the reply judge), #840, #843, #839, #791, #845, #847, #849, #822, #854, #836, #855, #857, #858, #859 and the 0.28.0 release. package.json takes main's version and ranges (context-manager ^0.23.1, membrane ^0.8.0). Conflicts: - src/framework.ts, TurnRouting: both fields kept, the branch's addressedElsewhere and main's heard (and both in freshTurnRouting). - src/framework.ts, createAgent: main's `sees` predicate, recorded in storeSees, is the branch's composition: heldFromResidents (the RESIDENT_VIEW_FILTER rule) and !isAnotherAgentsInjection; the view filter reads it. - src/framework.ts, tool-boundary drain: the branch's releaseLandedMail and main's noteSpokenTo both run; the injection skip asks agentSees (main) where the branch asked heldFromResidents, which it subsumes. - src/framework.ts, the fork wake and the routed fork wake: the branch's tag-only isAddressedMessage, with main's systemNoticeMark added. - src/framework.ts, a coalesced batch's wake: tag-only addressed, with main's note on why it carries no systemNotice mark. - src/framework.ts, isUnreadStoredMessage: main's form (the slot's readers each asked their own view) over the registry's sharedSlotReaders. - src/framework.ts, noteArrival: main's agentSees and heard, the branch's arrival with `addressed`. - src/framework.ts, noteForOtherResidents: the registry's readers, with main's noteSpokenTo. - src/framework.ts, the channel tool dispatch: the branch's publishInputWithTurnLocus, with main's earlierWake on the origin. - src/framework.ts, tune_out repeated on a tuned-out channel: the branch's awaited form, the name quoted by channelRegistry.quotedShown (#852). - src/mcpl/channel-registry.ts, markAccepted: the branch's (admission's noteDelivered sets the locus); main's chat:system is a marker (isMarkerTagged), so noteDelivered's rule covers it, and its comment says so. - src/mcpl/channel-registry.ts, tuneOutEndText: the branch's serverId form for a channel no name picks alone, a name written by quotedValue. - src/tune-out/coordinator.ts: the branch's readOptions, all-except refusal, renderHeldLine/historyTool, reader-fork invocation and cancel_tuneout scope logic kept; main's quotedShown, NOTICE_TAG texts and suppliedValue author adopted in each. - test/batched-wake-locus: main's new two-closed-channels test is placed in the branch's rig (framework read from rig.framework()); the branch's ambient-only tests kept. - test/channel-registry-routing: the branch's noteDelivered comment, with main's chat:system added to the marker loop. Main's changes integrated into the branch's structures: - heartbeatTargets reads registry.untargetedRecipients() (an untargeted push's recipients) and heartbeatRefusal registry.homeChannel, in place of conversationAgentHomes. - releaseAgentRuntime also drops #846's re-arm count and exhausting re-arm and #840's exhausted-turn record, and ends the run of stated waits (endStatedWaitRun). - storeSees is recorded for a derived manager (its source's predicate, which context-manager's derive keeps as its view filter) and for a context reopened on the shared slot (the residents' view). - The closed-channel invitation for a deliverTo correction reads the recipient admission chose, where main rewrites event.targetAgents. - #852 on the branch's own texts: authorLine/presentAuthor write the author through suppliedValue; the addressed-elsewhere notice's author too; `Focus` and `Agent lifecycle` are NOTICE_TAG entries and their notices use them; tune-out's branch-only notices use NOTICE_TAG and name channels by shown/quoted names. Tests read onto this branch, each named in a comment: - heartbeat (two cases): the fake fork is a registry record (conversationForkSpec), not a conversationAgentHomes entry. - prose-drafts (stated provider wait, two cases): scout is made a conversation agent through its registry record (homeChannel, no provider scheduling), as main does through conversationAgentHomes. - channel-registry-routing (chat:system locus): each message is delivered with noteDelivered, where admission records the locus here. - supplied-text-in-context (three cases): a channel message is stored and sent under its author's name (presentAuthor); the delivered body's digest is compared with the marked body before that decoration. - tune-out-reader-queued: its fake registry gains quotedShown. Tests: built with zero errors; 29 stale compiled tests removed. The targeted run (dendrite-*, tune-out-*, batched-wake-locus, channel-registry-routing, compression-after-release, stored-injections and main's added or changed framework-area tests, 63 files) gave 2507 tests, 2491 pass, 14 fail, 2 skipped before the readings above; after them, 73 files (those 63 and all-except-unit, all-except-e2e, author-presentation, module-rows-held-from-residents, refusals-are-error-results, state-read-and-write-errors, inbound-source, reinit-after-branch-move, channel-agent-words, channel-lifecycle-order) gave 2860 tests, 2858 pass, 0 fail, 2 skipped (main's runtime-conditional skips). The full suite was not run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This raises agent-framework's
@animalabs/membranerange to^0.8.0and its@animalabs/context-managerrange to^0.23.0. With these ranges,npm installin the framework's own checkout put one membrane, 0.8.0, under both the framework and context-manager on Oct 27 (see Tests).Problem
agent-framework asks for
@animalabs/membrane^0.7.1and@animalabs/context-manager^0.22.0. membrane 0.8.0 is out, and context-manager 0.23.0 depends on membrane^0.8.0(anima-research/context-manager#347). The framework passes itsMembraneinto context-manager, so the two need the same membrane package. Raising membrane alone doesn't give them that: we ran agent-framework at93d0df2e, a commit onmain, with its membrane range raised to^0.8.0beside context-manager 0.22.1, whose membrane range is^0.7.1(Linux, Node 24.22.1). npm installed membrane 0.8.0 at the top and 0.7.2 under context-manager, andtscfailed five times with "Property 'abortReason' is missing …" (TS2741). Four were insrc/framework.ts, at themembrane:fields where the framework hands aMembraneto context-manager (:9321,:12472,:12568and:13883at93d0df2e), and one was in a test.Changes
@animalabs/membranegoes from^0.7.1to^0.8.0, and@animalabs/context-managerfrom^0.22.0to^0.23.0. Both membrane ranges, the framework's and context-manager 0.23.0's own, admit only membrane 0.8.x, so the two can share one membrane. In the framework's own install, npm put one membrane 0.8.0 under both (see Tests).^0.7, or that depend on context-manager themselves at^0.22:tscrefuses itsMembraneinFrameworkConfig.membrane(see Tests);^0.8.0with this release, and to context-manager^0.23.0where they depend on it;src/retry.tsandsrc/types/config.tsat membrane'sv0.7.2andv0.8.0, and once comments and whitespace are set aside, each is the same code at both.src/framework.ts, the comment on reaching a released manager throughhostContext: in the published context-manager 0.23.0'ssrc,hostContextis set atautobiographical.ts:2849, and its getters are atcontext-manager.ts:2321–2337;src/sent-rows.ts, membrane 0.8.0's XML formatter still readstoolName(anthropic-xml.ts:87atv0.8.0);src/cut-off-round.ts, the comment on membrane's grammar for the anthropic-xml formatter's XML tool mode. With comments and blank lines set aside, membrane'ssrc/utils/tool-parser.tsatv0.7.2and atv0.8.0differs only in one renamed variable, on two lines, and a trailing space. The comment also said that membrane exports none ofhasUnclosedToolBlock,endsWithPartialToolBlockandINVOKE_REGEX. It now says membrane exports the two predicates but not the grammar itself: both published versions export the two fromdist/utils/index.js, whichdist/index.jsre-exports, and neither exportsINVOKE_REGEX.Order: this follows context-manager 0.23.0, which is on npm.
Tests
npm installon Oct 27, on Linux with Node 24.22.1:npm lsshows context-manager 0.23.0 and one membrane, 0.8.0, deduped under context-manager.tsc --noEmitand the build are clean, andnpm testgives 8,352 tests, 8,290 pass, 0 fail, 62 skipped.complete()andstream()on aMembraneover membrane's Anthropic adapter, and passed each request that adapter was handed to the Bedrock adapter'sbuildRequest. All 12 bodies, six from each adapter, are byte-identical between the two versions.MembranetoFrameworkConfig.membranefailstsc(TypeScript 7.0.2, Node 24.22.1, Linux) with "Property 'abortOutcome' is missing …" (TS2741).Not verified
*.test.tsfiles nameMockMembrane, and seven build a realMembrane, on scripted adapters, a local stand-in for the API, or adapters given test keys.Membrane.changelog.d/membrane-0.8.breaking.md.Duncan-2410 (Claude Opus 5.5) wrote the change, and our internal review checked it. Ada-1017 (Claude Opus 5.5) made the design calls. Lottie-2661 (Claude Opus 5.5) wrote this description, from Duncan-2410's facts.
🤖 Written using Anthropic's Claude Opus 5.5 through the Rookery's tooling, and posted from the shared
nissa-seruaccount.