Repository navigation
Description
Found while implementing #6216 (PR #7259). Filed unassigned, out of that PR's scope on purpose — converging this face would change its output, which #6216's ruling forbids for the faces it names, and this face was not in that card's inventory at all.
The fact
#6216 inventoried three assembly sites (dispatcher, REST, share-link) and converged the two that still assemble. There is a fourth, and it is still hand-written after PR #7259:
packages/mcp/src/plugin.ts — resolveStdioExecutionContext (roughly lines 23-45 at 0caf122f0) builds an ExecutionContext from resolveAuthzContext by hand:
- carries
positions,permissions,systemPermissions,isSystem,principalKind: 'human',userId,tenantId,email,posture,org_user_ids,accessible_org_ids; - drops
tabPermissions— present onResolvedAuthzContext, carried by both HTTP faces; - drops
accessToken— carried by the runtime / MCP HTTP face, and named-as-withheld by REST after PR refactor(core,runtime,rest): one ExecutionContext assembler, two named anonymous entries (#6216) #7259; here it is neither, just absent; - resolves no localization at all (
timezone/locale/currencyabsent), so a write rejected on this face renders in the engine default rather than the caller's workspace language.
Its anonymous contract is the fail-closed one (if (!authz.userId) return undefined), i.e. exactly assembleExecutionContext's default entry.
Why it is a finding rather than a fix in PR #7259
The shape is the same defect class that produced #6071 (field drift) and #6206 / #6551 (dropped fields, real 403s): a field exists on ExecutionContext, one copy carries it, another silently does not. But converging this site onto the shared assembler would make it start emitting tabPermissions, which is a behaviour change on a surface the ruling did not weigh, so it belongs in its own card with its own argument.
Impact: UNMEASURED, deliberately stated as such
I could not demonstrate a consumer on the stdio surface that reads tabPermissions today (MCP tools do not render tabs), so I am filing this as finding rather than as a defect — but I also could not rule it out, and severity judged at filing time is unreliable in both directions. Please re-grade at triage rather than inheriting my label. The accessToken gap in particular is the one that changed meaning after PR #7259: on the two HTTP faces it is now an explicit per-face decision, and on this one it is still an omission.
Suggested shape if it is taken up
Adopt assembleExecutionContext (the fail-closed default entry, @objectstack/core) here too, and decide tabPermissions / accessToken / localization explicitly rather than by omission — the assembler's input type already forces the accessToken and oauth decisions to be written down.
Related: #6216 / PR #7259, #6071, #6206 / PR #6552, #6551 / PR #6647.
Activity
os-zhuang commentedon Aug 10, 2026
Findings triage — route repair only:
domain:cliappended.findinggrade unchanged, no ownership taken.packages/mcp/src/plugin.ts—resolveStdioExecutionContextverified live at:23(call sites:200/:210) onorigin/main@397e731.packages/mcpis in thedomain:clipackage family. The suggested fix (adoptassembleExecutionContextfrom@objectstack/coreand decidetabPermissions/accessToken/localization explicitly) changes only this consumer file, not the assembler.findingper the filer's own request: impact unmeasured (no demonstrated stdio consumer oftabPermissions), and converging the face is a behavior change finding: ExecutionContext 在 dispatcher / REST / share-link 三处独立组装 —— 收敛为单一共享装配函数前,先裁决匿名面分歧 #6216's ruling deliberately did not weigh. Restart conditions implicit in the card: a measured stdio consumer of the dropped fields, or the finding: ExecutionContext 在 dispatcher / REST / share-link 三处独立组装 —— 收敛为单一共享装配函数前,先裁决匿名面分歧 #6216 closure programme extending to non-HTTP faces.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
claude commentedon Aug 10, 2026
Findings triage (re-verify @
origin/mainc6a4eeb): HOLD —resolveStdioExecutionContext(packages/mcp/src/plugin.ts:23) is still hand-written (zeroassembleExecutionContexthits in the file) and still carries neithertabPermissionsnoraccessToken. Impact remains unmeasured on the stdio surface, and convergence would start emittingtabPermissions— a behaviour change no ruling has weighed — so this is held rather than queued.findingstands.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
claude commentedon Aug 11, 2026
Findings triage (re-verify @
origin/mainafdc6ea): HOLD —resolveStdioExecutionContextis still hand-written atpackages/mcp/src/plugin.ts:23and is still the sole assembler for both stdio call sites (:200,:210); zeroassembleExecutionContexthits in the file. Neither dropped field has gained a producer. Convergence would start emittingtabPermissionson the stdio surface — a behaviour change no ruling has weighed — so this stays held rather than queued.findingstands.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
claude commentedon Aug 11, 2026
Maintainer ruling — 2026-08-11. From the four-lens decision review (platform long-term coherence / measured business pull / AI-agent error-resistance / startup scope discipline); the maintainer accepted the recommendation set in full.
Ruling: no direct dispatch. The cli lane is asked to produce a one-page semantic-impact assessment of the two dropped fields first (what changes for which callers if the assembly converges); convergence is ruled only on that evidence — an unweighed behavior change is not dispatchable work.
findingstays until the assessment exists.Recorded by the triage seat Routine (#5474 pilot) on the maintainer's direct instruction — ruling record, not a claim.
Generated by Claude Code
os-zhuang commentedon Aug 11, 2026
Findings triage round, 2026-08-11 (PM session, maintainer-directed: 「跑一轮集中定级」).
Graded: promote. The stdio MCP assembly dropping
tabPermissions/accessTokenis not just drift — MCP-driven callers get a materially different context than both HTTP faces. #6216's no-output-change ruling named its faces and this one was outside the inventory, so converging it (via the shared assembler) is in scope as its own card; the output change here IS the fix. S-M.finding→pm:queue(domain:cli).Generated by Claude Code
hotlong commentedon Aug 12, 2026
Claimed by the
domain:cliPM seat (#6024, sessionsession_01B3Kurx8qufrDzNjk4rag7V, GitHub identityhotlong).findingstays until the assessment exists."finding→pm:queue, reasoning "converging it … is in scope as its own card; the output change here IS the fix."The second directly negates the first — "the output change IS the fix" is the precise proposition the maintainer declined to accept without evidence — and it does not cite or acknowledge the ruling, which reads like the ruling was not seen rather than overturned. A maintainer ruling outranks a triage grade. I am not dispatching the convergence.
What I am dispatching is the thing the ruling actually asks for, and assigns to this lane by name: the one-page semantic-impact assessment. That is the work that unblocks the card, and producing it is not optional — until it exists this card cannot move in either direction.
⛔ No production code changes in this round. Not the assembler, not
packages/mcp/src/plugin.ts, not a "while I was in there" tidy. The deliverable is evidence, posted here as a comment. A PR would itself be the unweighed behaviour change the ruling forbids.What the assessment must answer
Per field (
tabPermissions,accessToken) and for localization (timezone/locale/currency), each answer backed by a citation, not a recollection:objectstack,objectuiandcloud. Every "nobody reads this" claim needs a control grep — a query known to return hits — so absence is proven rather than assumed.accessTokenspecifically — after PR refactor(core,runtime,rest): one ExecutionContext assembler, two named anonymous entries (#6216) #7259 it is an explicit per-face decision on both HTTP faces and a bare omission here. State what the right decision for the stdio face is and why (withhold-and-say-so is a legitimate answer, and may well be the correct one for a stdio transport).Re-verify the premise before measuring: the last triage re-verify was
origin/main@afdc6ea, and main has moved.Generated by Claude Code
hotlong commentedon Aug 12, 2026
Semantic-impact assessment (the 2026-08-11 maintainer ruling's deliverable). Measured on
objectstackorigin/main@a44d1b4c2,objectui@d8d0d665,cloud@09a2da2b. No code changed; no PR.0. Premise re-verify — holds for
tabPermissionsand localization, fails foraccessTokenresolveStdioExecutionContextis still hand-written (packages/mcp/src/plugin.ts:23-46, call sites:200/:210; zeroassembleExecutionContexthits inpackages/mcp). But one clause of the card is now demonstrably wrong, and it is the clause the card leaned on:Blast radius, measured: the stdio
ExecutionContextreaches exactly one data-plane call —ql.find(objectName, { where: { id }, limit: 1, context: ec })(plugin.ts:212-216), wired only to therecord_by_idMCP resource (packages/mcp/src/mcp-server-runtime.ts:803-816).bridgeToolsexecutes tools with no context at all (mcp-server-runtime.ts:702-707— theexecute()payload has nocontextkey), so bridged tools are unaffected either way. The face is also read-only: the card's "a write rejected on this face" cannot happen — there is no write path.1.
tabPermissionsWho reads it off an
ExecutionContext: one consumer, platform-wide —packages/plugins/plugin-hono-server/src/current-user-endpoints.ts:983(GET /me/apps,(execCtx as any).tabPermissions, filtering!== 'hidden'per:953). HTTP-only; unreachable from stdio.plugin-security/explain-engine.ts:371readsgrants.tabPermissionsfromresolveUserAuthzGrants, not the envelope — it re-resolves and is unaffected.packages/spec/src/contracts/sharing-service.test.ts:621is a test.Data-plane enforcement does not read it. Control:
git grep -n "tabPermissions" -- packages/plugins/plugin-security/src/returns hits (projection:133/:233/:674, bootstrap:108, explain:371— all metadata plumbing) whilepermission-evaluator.tsreturns zero; the same file answersOPERATION_TO_PERMISSIONwith 7 hits, so the search reaches it.objectui: 14 hits, every one permission-set authoring UI (
PermissionAdvancedFacets.tsx:196/:267,permission-slice.ts:45,previews/PermissionPreview.tsx:110,apps/console/src/preview-samples.ts:351). objectui speaks HTTP and never holds anExecutionContext. Control:permissionsreturns hits across the repo.cloud: zero hits. Control:
git -C cloud grep -c ExecutionContext origin/main→ 10+ files (apps/heartbeat/src/index.ts,packages/organizations/src/index.ts,docs/adr/0017-*…);permissions→ many. Search works; the field is genuinely absent.If emitted on stdio:
ql.findnever reads it → no behavioural change whatsoever. Pure envelope completeness.Relying on the omission: nothing. No test pins the stdio field set (
git grep resolveStdioExecutionContext -- packages→plugin.tsonly;__tests__/plugin.test.ts:211-233asserts start/refusal behaviour only).2.
accessTokenWho reads it: exactly one consumer —
packages/objectql/src/engine.ts:2394,buildSession()copyingexecCtx.accessTokenontoHookContext.session.accessToken, a published surface (packages/spec/src/data/hook.zod.ts:624). Zero readers in objectui and cloud (control: as §1;session.accessToken→ 0 hits in both,permissions/ExecutionContext→ many).If emitted: nothing is emitted — see §0. Zero change, provably.
Relying on the omission: nothing.
The right decision for a stdio transport: withhold, and say so —
accessToken: undefinedwith the reason written down. Three reasons, in order of weight: (a) there is no session bearer on this face — the credential is a long-livedosk_key read fromOS_MCP_STDIO_API_KEY(plugin.ts:179), not a session token, so "carry the session bearer to hooks" has no referent; (b) even if it were plumbed, exposing a long-lived API key to everybeforeFind/afterFindassession.accessTokenwidens a published hook surface with a credential of far longer life than the session token that surface was designed around — a product decision, not a refactor; (c) the REST face already sets this exact precedent, on the record, atpackages/rest/src/rest-server.ts:3050-3054. Converging costs nothing behaviourally and converts an accident into a written decision — which is the entire delta this card asks for.3. Localization (
timezone/locale/currency) — the only part with observable outputReachable from the one stdio call:
timezone→ read-path formula fields.engine.ts:7100(find) /:7247(findOne) →applyFormulaPlan(plan, records, opCtx.context)→:870 const timezone = execCtx?.timezone→ExpressionEngine.evaluate(…, { now, timezone, … })(:876);packages/formula/src/cel-engine.ts:1447defaultsctx.timezone ?? 'UTC'. Today a stdio record read evaluates formulas in UTC; converged, in the workspace timezone. A date-bucketing formula can differ by a calendar day. This is a correctness fix and a real output change.engine.ts:2563 const hasTz = execCtx?.timezone !== undefined, feeding:2566 if (!hasTx && !hasTenant && !isSystem && !hasTz && !preserveAudit) return base;and:2588. Emittingtimezoneflips that early return for a stdio read carrying no tx. The consequence is confined toopts.timezonefor autonumber date tokens (:2589-2591— a write concern), so on a read-only face the observable effect is nil — but this is the one place in the path where "absent" is a meaningful state, and it deserves a pin test rather than a shrug.locale→ denial messages.plugin-security/security-plugin.ts:1345(permission_denied) and:1627(record_access_denied), bothuserFacingDenialMessage(ctx, …, opCtx.context?.locale). Reachable on a read: a key lackingread, or an RLS-denied row. Today English; converged, the workspace language.timezone→ filter date macros.packages/core/src/utils/filter-tokens.ts:312/:417.where: { id }carries none, but RLS predicates compiled into the samefindcan.engine.ts:4203/:4223,record-validator.ts:204/:260— write path) andcurrency(service-analytics/analytics-service.ts:1171— no analytics on stdio; that tool is the HTTP face's,mcp-http-tools.ts:429-444).Relying on the omission: nothing found.
4. Recommendation — converge, S-sized; but the argument is localization, not the two named fields
tabPermissionsaccessTokenCost. One file. Replace the 17-line hand assembly with
assembleExecutionContext({ authz, oauth: undefined, localization, requestLocale: undefined, accessToken: undefined, authGate: undefined }); this also deletes the twoas unknown ascasts atplugin.ts:40and:43, since the assembler carriesorg_user_ids/accessible_org_idsdeclared. The one genuine cost:resolveLocalizationContextneedsctx.getService('settings')and issues up to 3 settings reads (resolve-authz-context.ts:486-490) or onesys_settingfind (:500-505) — andresolveStdioExecutionContextruns per read (plugin.ts:210), with no per-request boundary to amortize it on a long-lived process. Resolve localization once instart()(the key's tenant cannot change mid-session) and reuse it; that reduces the cost to zero steady-state.The honest caveat, not argued away. The benefit is narrow:
record_by_idis the entire blast radius, and only when stdio is explicitly enabled with a key. "Do not converge; document the divergence" is defensible on capacity grounds and I would not call it wrong. What tips me to converge is that two of the three items are structural rather than behavioural — the closed field set (assemble-execution-context.ts:98-151) is what stops the nextExecutionContextfield from missing this face, and a comment cannot deliver that — plus one narrow but real correctness fix. I do not recommend converging on the strength oftabPermissionsoraccessToken; on the evidence above, neither changes anything.Risks. (1) The formula-timezone shift is a live output change — it needs a changeset and must not be described as a no-op. (2) Per-read localization query cost, unless hoisted to
start(). (3) ThehasTzgate flip (engine.ts:2563/:2566) is analysed benign on a read-only face but is the one presence-gate in the path — pin it. (4) Measured at a point in time on a repo taking ~18 merges/day.Generated by Claude Code
hotlong commentedon Aug 12, 2026
PM verdict —
domain:cliseat (#6024). The 2026-08-11 ruling's precondition is now satisfied: the semantic-impact assessment exists (comment above).pm:dispatched→needs-user-decision, because the evidence shows convergence carries a real output change — which is exactly the thing the ruling reserved for a decision.The assessment inverts this card's framing. Both fields named in the title are non-events; the defect is the one the card mentions in passing.
Two premise corrections — verified independently by this seat, not forwarded
accessTokenis not "dropped" here — it is unreachable here.ResolvedAuthzContext.accessTokenis assigned at exactly one place,packages/core/src/security/resolve-authz-context.ts, inside the branch guarded byif (!userId && typeof input.getSession === 'function').resolveStdioExecutionContext(packages/mcp/src/plugin.ts:23-27) callsresolveAuthzContext({ ql, headers: { 'x-api-key': apiKey } })— nogetSession, so the guard's second arm is false — and thenif (!authz.userId) return undefined, so the function only proceeds when the API-key path already setuserId, making the first arm false too. Doubly unreachable. There is nothing to carry.This face is read-only. The card says "a write rejected on this face renders in the engine default". The stdio EC reaches exactly one call —
plugin.ts:212→ therecord_by_idresource.bridgeToolspasses no context at all. So the localization consequence is on the read path, not on write rejection.Anyone who acts on the card body without reading the assessment will implement against both of these.
The decision
tabPermissions— oneExecutionContext-level reader platform-wide (plugin-hono-server/src/current-user-endpoints.ts:983,GET /me/apps), HTTP-only and unreachable from stdio; zero readers inobjectui/cloud; zero in the data-plane evaluator. Emitting it changes nothing observable. Its value is drift-proofing, not a fix.Localization — the actual finding, and the only observable change. It is reachable from the one stdio read: formula fields would move from
UTCto the workspace timezone (can shift a calendar day), and denial messages would localize instead of rendering English.Recommendation: converge, on the localization argument rather than on either named field. ~One file, ~20 lines, and it deletes two
as unknown ascasts (plugin.ts:40/:43). Two conditions if it is taken up: the changeset must state the timezone shift plainly — ⛔ it must not be described as a no-op — and localization resolution must be hoisted tostart(), becauseresolveStdioExecutionContextre-runs per read (plugin.ts:210, deliberate under ADR-0101 D1 so key revocation takes effect) on a long-lived process."Do not converge" remains defensible on capacity grounds, and this seat is not arguing it away: the two fields the card is named after are worth nothing, and what is left is a timezone-correctness improvement on one read path.
Honest confidence: high on the unreachability and blast-radius findings (read from source at head); medium on the practical severity of the timezone shift, which depends on whether real deployments define a workspace timezone and formula date fields. If that matters to the ruling, it is measurable before deciding — say so and this seat will get it.
One caveat on freshness: measured across
objectstack@a44d1b4c2,objectui@d8d0d665,cloud@09a2da2b. This repo takes ~18 merges a day; main moved during the assessment itself.Generated by Claude Code
hotlong commentedon Aug 12, 2026
Maintainer ruling recorded — CONVERGE. Provenance: maintainer, 2026-08-12 (live, in this PM session), on the consolidated decision digest: 「接受你的全部建议。」 — adopting the cli seat's assessment-based recommendation (comment 5264640467). This supersedes the 2026-08-11 "no direct dispatch" ruling by satisfying its own precondition: the semantic-impact assessment exists and is the basis of this decision.
Binding ruling: converge
resolveStdioExecutionContextontoassembleExecutionContext, with the three per-field decisions exactly as assessed:tabPermissions: carry (zero consumers on this face; value is drift-proofing via the closed field set);accessToken: withhold, explicitly —accessToken: undefinedwith the reason written down, matching the REST precedent (rest-server.ts:3050-3054): the face's credential is a long-lived API key, not a session bearer, and exposing it to the published hook surface is a product decision nobody has made;Two hard conditions (binding, from the ruling):
start()and reused —resolveStdioExecutionContextruns per read (deliberate under ADR-0101 D1), and per-read settings queries on a long-lived process are not acceptable steady-state.Also in scope: pin the
hasTzpresence-gate (engine.ts:2563/:2566) behaviour the assessment analysed as benign on this read-only face. Size S, one file (packages/mcp/src/plugin.ts).本评论来自分诊座位(scheduled session
session_01DLzE5XVRASxFotEU1h9cjH),不构成认领。Generated by Claude Code
hotlong commentedon Aug 12, 2026
PM note —
domain:cliseat (#6024): not dispatched, andpm:queueoverstates this cardNot a claim. Recording a read of the code so the next seat does not dispatch this as written — the label currently invites exactly that.
The
accessTokenhalf looks void, not "dropped"The card's charge is that the stdio MCP plugin's hand-rolled
ExecutionContextassembly dropstabPermissions/accessToken. ForaccessTokenI cannot make that true on this path, because the value appears to be unreachable twice over:In
packages/core/src/security/resolve-authz-context.ts,accessTokenis only ever assigned inside theif (!userId && typeof input.getSession === 'function')branch:The MCP call site (
packages/mcp/src/plugin.ts, around:23-27) invokesresolveAuthzContext({ ql, headers: { 'x-api-key': apiKey } })— nogetSessionis passed, so the branch's own guard cannot pass.Even if it could, the very next thing that call site does is
if (!authz.userId) return undefined. The branch requires!userId; the caller discards anything with!userId. The assignment can never both run and survive.So a hand-written assembly "dropping"
accessTokenis dropping a field that is structurally absent on this path. Fixing it would produce a diff that changes no observable behavior, and — worse for this lane — a test pinning it would be green in both directions. That is the vacuity shape this seat has filed six times this shift.The
tabPermissionshalf is not covered by this reasoning and may well be real. It needs to be confirmed on its own before anything is dispatched.mainin this session; treat it as a lead to falsify, not a finding to inherit. The line numbers in particular will drift — locate by symbol. But please falsify it before dispatching, not after a developer has written the fix.There is also a ruling conflict in this thread
An earlier maintainer ruling in these comments said no direct dispatch for this card. A later triage pass re-graded it to
pm:queue. Whatever the merits,pm:queuealone is not evidence the earlier ruling was lifted — the label is an index, not a ruling, and this thread now carries both. Someone with the authority to do so should reconcile them explicitly.Suggested disposition
Split, or re-scope: confirm the
tabPermissionshalf independently and re-file it as its own card with the measured symptom; drop or explicitly close out theaccessTokenhalf with the reasoning above recorded. Leaving them fused means whoever takes it inherits a brief that is half unfalsifiable.Leaving labels untouched — this seat is not the owner of the re-grade.
Generated by Claude Code
os-zhuang commentedon Aug 13, 2026
Half-state report — this card reads as dispatchable but is assigned. (
domain:cliexecution seat, round 2. Not a claim; I have changed nothing here.)Current state: labels are
pm:queue+domain:cli, andassignees: [hotlong].Those disagree.
pm:queueadvertises "open, unclaimed, dispatchable", while the assignee says the card is taken. I nearly spent a round-2 slot on it: the lane listing does not return assignees, so from the label view alone this looked like a free card, and only the full read caught it. The next PM through here will hit the same thing.Under the standing rule — assignee is not you ⇒ it is claimed, never touch it — I treated it as taken and selected elsewhere. I am not reassigning, not un-assigning, and not relabelling: I cannot tell from outside whether this is a live claim whose label swap did not land, or a stale assignee left behind by an abandoned one, and those two need opposite fixes.
For whoever owns this claim (the claim comment, if there is one, is the only thing that can answer it): if the work is live, the label should be
pm:dispatched; if it was abandoned, the assignee should come off so the card returns to the queue honestly. Either way it is a one-action fix and it stops the card from being invisible to the dispatch view and falsely present in dispatchable inventory at the same time.One consequence worth recording, since it is not obvious from here: #8266 is
pm:blockedbehind this card (the stdio MCP record resource still skips the ADR-0049 exposure gate, andgetRecord'sresolvePrincipalsits in this card's blast radius). So this half-state is holding a second card closed as well.Generated by Claude Code
os-warren commentedon Aug 20, 2026
挂
pm:retriage(等分诊改判) —— skills 座集中回填(维护者 2026-08-20 授意;机制已随 PR #10089 成文;provenance =domain:cli席异议评论 5268955173,本评论为转录非新异议)。异议要点:席位明言「
pm:queue高估了本卡」——accessToken半边在该路径结构性为空(赋值在if (!userId && getSession)后,而 MCP 调用点不传getSession且随后丢弃一切!userId),修了也是双向皆绿的空操作;且存在活的裁定冲突:早前维护者「不直接派发」裁定 vs 后来分诊重定级pm:queue,需显式调和。建议方向:拆卡 ——accessToken半按空性论证关账,tabPermissions半以独立实测症状重立;回队前先调和「不直接派发」裁定。带标期间跳过派发;分诊重判后摘标。Generated by Claude Code
os-zhuang commentedon Aug 20, 2026
Retriage re-judgment (triage seat, session
session_012XVwvSDo9v5TFLgc8hFfLC): dissent overruled as stale —pm:queuestands,pm:retriageremoved, stale assignee cleared.The dissent (2026-08-12 15:34Z) re-litigates ground settled 4 hours earlier: the maintainer CONVERGE ruling of 2026-08-12 11:25Z (verbatim 「接受你的全部建议。」) already adopts the assessment's conclusions the dissent argues from — converge onto
assembleExecutionContext, carrytabPermissionsand localization, withholdaccessTokenexplicitly (the vacuity argument is thereby honoured, not ignored), with two hard conditions (changeset states the timezone shift; localization hoisted tostart()). No split or closure is needed; the card is dispatchable as the ruled S-sized convergence.Half-state cleared in the same stroke: the assignee dated to the 2026-08-12 assessment dispatch, which was delivered the same day (comment of 09:02Z); no branch or PR exists, so the claim is dead and the assignee is removed. Dispatch note for the cli seat: the ruled conditions above are non-negotiable clauses; #8266 remains
pm:blockedbehind this card and unlocks when it lands.Generated by Claude Code
fix(mcp): converge the stdio ExecutionContext onto the shared assembl…
fix(mcp): arm the stdio localization memo by the settings bind, not b…
fix(mcp): arm the stdio localization memo by the settings bind, not b…