Repository navigation
Open
Description
以下是架构评审(master 分支 e4efb39b)的设计建议合集(非阻塞项)。如无异议,我可以按条目拆分为独立 issue 供逐一讨论。
A1. builtin 与 server、client 之间存在双向依赖
builtin→server.authz:atomic_memory_search.py:21(模块级)、atomic_memory.py:116、atomic_memory_processing.py:483、relational.py:1045、artifact_merge.py:67,98、composition.py:2140(创建ACCESS_TABLES)builtin→server.processing_security:topic_memory_processing.py:1598,1794、family_processing.py:55,145、dream_processing.py:29,42builtin→client:decision_projection.py:34引用client.capture做脱敏- 反向:
server/authz/{composition,repository}.py与server/processing_security.py引用builtin.persistence和builtin.runtime.composition,循环仅靠函数内延迟导入避开。 - 私有访问:
atomic_memory.py:113读取context.access._deferred_decisions,即服务端AccessControlService的私有属性;核心字段ArtifactSearchExecutionContext.access: Any(artifacts/search.py:62)掩盖了这种耦合。 - 领域内部的循环:
- Profile ↔ Review:
artifacts/profile/review.py:39-147使用约 10 个ReviewService私有成员。 - Review ↔ Dream:Dream 直接对 Review 的
CANDIDATE_HEADS_TABLE执行原始UPDATE取行锁(dream/service.py约:622-629)。 - Prompt 包:
artifacts/prompt/builtin.py:19-60引用所有族,而 Handoff、Profile 又引用prompt.service。 - Experience ↔ Work:
experience/recurrence.py:35与work/models.py:25-34互相引用。 builtin/code/cli.py:26引用powercontext.server.configuration。
- Profile ↔ Review:
方向:授权是运行时的领域关注点,适合抽成独立包,供 builtin 与 server 共同依赖;access 改为有类型的 Protocol。D1(仅安装 [builtin] 无法导入)是这一循环依赖的直接后果。
A2. 中心文件过大,功能扩展集中修改少数文件
server/app.py(5965 行):一个create_app注册全部 123 个操作(:1418-1543),另含 40 个 Protocol 端口(:863-1300)、约 30 个鉴权解析器(:4747-5170)与完整的错误映射(:5433-5965)。只有 Atomic Memory 路由被拆出。builtin/runtime/application.py(4278 行):BuiltinRuntime.__init__接收 57 个关键字依赖(:3622-3687),暴露约 20 个功能门面。- 44 个类覆盖约 15 个领域,引用 17 个
builtin.*子包,文件内有 231 处self._runtime._private访问。 ScopedContextApplication(:951-1874,约 920 行)只有一个公开方法,包含召回与充分性循环,与prepared_context.py、recall_sufficiency.py职责重叠。
builtin/runtime/composition.py:open_builtin_runtime(:480-868)有 34 个参数,传递约 75 个关键字参数。- 修改频率:最近 200 个提交中,
composition.py被修改 19 次,application.py17 次,relational.py13 次。 - 其他大文件:
cli/system.py(2618 行)、client/cli.py(1998 行)、server/authz/service.py(1797 行)。
A3. 传输层承载了领域规则
acknowledge_handoff(app.py:3176-3209):接收方必须与主体一致的规则,以及 receipt 的预留与提交协议。approve_candidate(app.py:4260-4302):终态候选的重试语义与 owner 建立。list_sources(app.py:2268-2294):为条目补充 receipt 身份,未就绪时返回 503。_reject_reserved_handoff_receipt_content(app.py:3228)。- 族相关的授权规则,如 prompt 与 topic memory 写入要求 scope admin(
app.py:4999-5002)。 - 错误映射中嵌入旧版记忆迁移指引(
app.py:5470-5530)。 app.py:4469-4477访问atomic._application(私有),在独立事务中对 atomic memory 标签写入做预鉴权。运行时已在写事务内完成同样的检查(relational.py:682,1378,应用于persistence/tags.py:178),且两处构造的资源引用不同(适配器用最新as_ref(),运行时写死revision=1),存在检查与使用时间差。dashboard/api.py:101-118引用app.py的私有函数(_path_artifact_read_access、_access_audit_context),在路由依赖之外重新执行鉴权。
后果:绕过 HTTP 的调用方(worker、本地模式)得不到这些规则,违反 AGENTS.md 中“传输与宿主适配器只做翻译”的约定。
A4. 各 Artifact 族的特殊处理分散在共享服务中
review/service.py约有 41 处按族分支,例如:501、:1024-1025的硬编码族集合,_validate_proposal_family(:1195-1206)中的类型表。- 同类知识在
dream/service.py(约 18 处,含:448-457的操作到族映射)、evidence/resolver.py(约 22 处)、dream/bindings.py(约 18 处)重复出现。 - 新增一种族需要修改 4 个服务。RFC 1549 已提出族注册表,Review 尚未使用。
catalog_changes/service.py另外实现了一套 propose、revise、approve-retry 与 CAS 逻辑,并借用 Review 的错误与审计模型(:43-49),D5 这类修复需要在两处同时进行。- Dream 来源通过 ID 前缀判断:
candidate_id.startswith("cand_dream_")(review/service.py:195,349,526,542,656,745)。公开 API 不允许传入candidate_id,因此无法伪造,但候选已有带类型的audit.dream_run_id可用。
A5. 服务端路由参数与合约可能漂移
- 对外提供的 OpenAPI 是规范文档(
app.py:1551-1561),FastAPI 自动推导的 schema 被丢弃,因此手写的Path/Query约束(如:2258-2259、:2517-2520、:2625,以及_list_dreams_query中无类型的status/operation)不会与规范比对。 - 未知查询参数的处理方式不统一(这是安全缺陷 S1 的成因)。
- 具名解析器按请求查找(
app.py:4741-4744),规范中拼错的解析器名要到运行时才报错。 - 访问控制开启时,格式错误的请求体在鉴权依赖中失败,返回不带详情的 422
invalid_access_request(:4716-4722、:5634);关闭时同样的请求体返回带字段错误的 422invalid_request(:1375-1394)。生产环境下 agent 与 MCP 客户端拿到的错误信息更少。 - 少量内部信息回显:
AtomicMemoryIndexError的文本(如迁移问题)被原样返回(app.py:5823-5824)。
A6. 宿主集成缺少统一的行为契约
integrations/capabilities.toml只是能力标签、工具名与证据路径的事实来源(scripts/integration_manifest.py),不描述 hook 行为(查询截断、密钥策略、捕获幂等)。- 宿主列表分散在四处:manifest 的
agent_host条目、setup_app命令、HOST_GUIDANCE、FIRST_CLASS_HOSTS(cli/hosts.py:44)。FIRST_CLASS_HOSTS遗漏了 manifest 中标记为完整能力宿主的zcode以及kimi-code,因此setup select与doctor integrations不显示它们。 verify_host对 claude-code 与 openclaw 跳过安装后检查;Claude Code 的回滚只捕获SetupError(cli/system.py:1489)。- hook 运行时各不相同:Claude Code 使用仅依赖标准库的
python3,Codex 每次 hook 执行uv run --project,ZCode 与 Kimi Code 使用 Node。
A7. 客户端与服务管理
PowerContextClient只有异步接口且没有重试,CLI 用asyncio.run包装每个调用(71 处)。- 只有 401、403、503 有专门的错误类型;
/dream的 429 以通用ServerResponseError返回,调用方不显式传response_headers时Retry-After丢失。 _prepare_request中有专门针对PREPARE_CONTEXT的特殊分支(client.py:1376-1386)。- LangChain 的同步路径在事件循环内被调用时完全跳过召回(
middleware.py:184-197);integrations/langchain/.../client.py与integrations/langgraph/.../client.py几乎重复。 client/receiver_service.py为 Skill Receiver 单独写了一套 systemd 用户单元管理,不复用service/adapters/*,没有所有权与挂起处理,只支持 Linux,enable --now失败时残留单元文件。它与adapters/systemd.py都未涉及loginctl enable-linger,在无图形界面或仅 SSH 的主机上,用户服务可能在登出后停止、开机不启动(推断)。
A8. 测试与 CI
- 测试 161k 行,源码 131k 行(含生成代码 152k 行)。
- 54 个测试文件 monkeypatch 私有属性,22 个引用私有名称,例如
codex_plugin/test_recall.py调用_post_json并对冻结的 settings 使用object.__setattr__,与 AGENTS.md “通过公开接口断言” 的要求不符。 - 24 处断言依赖真实耗时(如
-nxdist 下elapsed < 0.5对比 0.1 秒截止时间),与 fix(zcode): stop two plugin tests from depending on runner timing #2051 修复过的不稳定问题同类。 - 根
conftest.py只清理POWERCONTEXT_{SERVER,CLIENT,CODEX}_环境变量,其余依赖各插件自己的 conftest。 - tox 与 CI 总是安装全部 extras,单一安装角色下的依赖缺陷(D1、D2)无法被发现。
A9. 其他
code模块独立性:builtin/code使用子进程中的 tree-sitter 解析器、禁用 hook 的git子进程,以及自有的 SQLite 与文件缓存,查询通过asyncio.to_thread同步执行(code/application.py:35)。它内部自洽(77 个内部导入,不依赖artifacts),更像一个独立的产品域。解析器内存限制只在 macOS 上生效(code/process.py:30-36在其他平台返回None),Linux 上只有截止时间约束。- 推理用量统计:用量只在成功时记录(
inference/usage.py:85-110,与 RFC 0072 一致),失败尝试消耗的 token 不进入统计;未发现生成与提取的按 Scope 花费上限(推断)。 - 小规模问题:
server/app.py:1777为判断某个 Handoff revision 是否存在,载入了所有 revision 的完整内容。- 核心
Sources.list()(context.py)映射到无上限的SourceRepository.list(limit=None)(relational.py:1537),内部未调用,但属于公开 SDK 接口。
- 未验证的安全推断:
- loopback 模式默认
access.mode="disabled"(settings.py:156),REST 路由没有 Host / Origin 校验,DNS 重绑定的网页可能读写记忆;FastMCP 的 Host / Origin 防护只覆盖/mcp。 _require_secure_remote_transport(app.py:3915-3923)把任何 loopback 对端视为安全;位于同一主机的明文 HTTP 反向代理之后,远程目标凭据可能经 HTTP 传输。
- loopback 模式默认
环境信息
- 评审对象:
master分支,提交e4efb39b(ci: scope PR validation to changed areas (#2072)) - 上述均为非阻塞设计建议,可拆分讨论
Metadata
Metadata
Assignees
Labels
No labels
Type
Projects
- StatusShow more project fieldsTodo
Activity
ctxloop commentedon Nov 4, 2026
基于最新
master的复核(1190dcbb)Note
本评论由 Claude Code(Claude Opus 5.5,xhigh)生成,未经人工验证。N2、N3 经实际执行复现,其余结论来自静态读码或推断,未运行完整测试套件。
以
master最新提交1190dcbb逐条复核本 issue,该提交比评审基线e4efb39b新 389 个提交。D1–D6(#2083)、R1–R14(#2084)、#2081 和 #2082 均已关闭,本 issue 的设计问题多数仍成立,其中 A1、A2 有所加重。另有若干新发现,列在文末,建议拆成独立 issue。证据标注:读码表示按代码路径确认,复现表示实际执行确认,推断表示未执行验证。行号均基于
1190dcbb,路径省略src/powercontext/前缀。现状总览
builtin→server的导入从 13 处增至 22 处,D1 靠打包层修复,依赖方向未变app.py6644 行、137 个操作;application.py4954 行;只有cli/system.py缩小A1–A9 逐条明细
A1 双向依赖:成立,加重
builtin→server的导入从 13 处增至 22 处,其中模块级从 3 处增至 6 处。新增的模块级导入有:builtin/runtime/artifact_reads.py:36builtin/runtime/custom_artifact_search.py:66builtin/persistence/migrations/atomic_memory_v1.py:97-98:持久化层直接依赖server.authz.repository。builtin内出现type(access.provider) is BuiltinAuthorizationProvider一类判断,见builtin/runtime/artifact_reads.py:63、custom_artifact_search.py:296、atomic_memory_processing.py:400,826。builtin/runtime/atomic_memory.py:211仍读取context.access._deferred_decisions;artifacts/search.py:61-63中principal、access、audit仍为Any。server.authz的 provider 改为延迟加载,pycasbin移入builtinextra。这是打包层修复,依赖方向没有调整,也没有抽出独立的授权包。artifacts/indexes.py:23在模块级导入builtin.artifacts.memory.models,见下文 N3。artifacts/profile/review.py自基线未改,使用ReviewService的 6 个私有成员,共 35 处引用。UPDATECANDIDATE_HEADS_TABLE:builtin/dream/service.py:626-634。builtin/code/cli.py:27仍导入server.configuration。A2 中心文件过大:成立,加重
e4efb39b1190dcbbserver/app.py行数create_app注册的操作builtin/runtime/application.py行数BuiltinRuntime.__init__关键字参数self._runtime._私有访问ScopedContextApplication类体行数open_builtin_runtime参数builtin/runtime/composition.py行数client/cli.py行数server/authz/service.py行数cli/system.py行数cli/system.py缩小来自2da90ac2(refactor(cli): unify agent setup through thin native adapters)。server/artifact_plugins.py和server/ownership.py都不含路由,插件和 ownership 路由仍定义在app.py。composition.py被修改 21 次,application.py19 次,app.py15 次。A3 传输层承载领域规则:成立
acknowledge_handoff(server/app.py:3657-3690)未作修改。server/app.py:5051-5059读取atomic._application,使用最新的artifact.as_ref()。builtin/runtime/relational.py:1521-1528写死revision=1。server/app.py:4652-4708以on_commit回调实现,按族决定是否建立 owner,例如 atomic-memory 和 topic-memory 不建立。fix(authz): commit local write ownership atomically #2164 让 owner 写入进入了 runtime 的写事务,原子性有改善,但规则本身仍属于 HTTP 层。source_management/gateway.py:286直接调用 runtime 写入 Source。为补上这项校验,它反向导入了server.app._reject_reserved_handoff_receipt_content。approve_candidate的终态重试重复(推断): HTTP 层的重试与ReviewService.approve(builtin/review/service.py:658-674)已有的幂等重试重复,推断是冗余路径。A4 族特殊处理分散:成立
builtin/dream/service.py、builtin/dream/bindings.py自基线未改。builtin/evidence/resolver.py只有 7 行性能改动。builtin/review/service.py的族分支多了一行。builtin/artifact_plugin_validation.py:41-50又新增了一份内置族清单。startswith("cand_dream_")从 6 处增至 7 处,audit.dream_run_id仍只在一处使用。review/service.py的 6 个按族分支中各加了一次相同的 REJECTED 检查。catalog_changes没有同步这项修复(见 N9)。A5 路由与合约漂移:部分成立
_authorization_payload改为路径值优先(server/app.py:5304)。规范中带查询参数的 5 个操作现在都拒绝未知参数,实现见_require_strict_query(server/app.py:2906)以及list_scopes、list_sources的内联校验。Path/Query约束不与规范比对。tests/test_api_contract.py只断言app.openapi()等于 YAML。server/app.py:5336-5338),注册路由时不校验名称是否存在。invalid_access_request,不带details,且这个错误码不在规范中。关闭时返回 422invalid_request,带字段错误。AtomicMemoryIndexError的文本仍原样返回给客户端(server/app.py:6475-6476)。A6 宿主行为契约:部分成立
FIRST_CLASS_HOSTS已删除。CLI 统一使用installers(),tests/test_integration_manifest.py断言它与 manifest 的agent_host一致,zcode 和 kimi-code 现在都可见。verify_host已删除,安装后每个宿主都会执行doctor检查。HOST_GUIDANCE(cli/guidance.py)仍单独维护。python3、uv run和node。SetupError的回滚」变成了不回滚,见 N10。A7 客户端与服务管理:成立
PowerContextClient仍只有异步接口、没有重试。client/cli.py中asyncio.run从 35 处增至 47 处。/dream的 429 仍返回通用ServerResponseError。create_dream_run(client/client.py:643)不读取Retry-After。_prepare_request对PREPARE_CONTEXT的特殊处理增至 4 处字段剔除(client/client.py:1426-1449)。integrations/langchain/src/powercontext_langchain/middleware.py:187-200)。client.py、settings.py、scope.py仍近似重复,并已出现漂移:langgraph 的settings.py缺少hide_input_in_errors=True。client/receiver_service.py自基线未改。A8 测试与 CI:部分成立
.github/workflows/master.yml:286-337),覆盖 core、builtin、cli、builtin+cli、server+cli 五种角色,能发现 D1 这类问题。artifact_plugins的导入(scripts/ci_role_smoke.py:111),所以漏掉了 N3。tests/codex_plugin/test_recall.py:1005仍是elapsed < 0.5。tests/conftest.py:60仍只清理三个环境变量前缀。A9 其他:部分成立
builtin/inference/usage.py:173-213)。code模块仍独立。server/app.py:2012→builtin/persistence/artifacts.py:677-703)。Sources.list()最终仍以limit=None查询。/mcp默认同样没有,见 N4。_require_secure_remote_transport(server/app.py:4432-4440)的风险有前提。uvicorn 默认信任来自127.0.0.1的X-Forwarded-*,同机代理发送这些头时不会误判;只有代理不发送时风险才成立。对原文的更正
artifacts/profile/review.py使用ReviewService的 6 个私有成员,共 35 处引用,不是约 10 个。如果把_candidates、_artifacts上被调用的方法也算进去,约为 10 个。server/app.py中的 Protocol 端口是 27 个,不是 40 个,基线也是 27 个。asyncio.run: 基线src中asyncio.run共 46 处,复现不出「71 处」。client/receiver_service.py有_MANAGED_HEADER所有权检查。docs/en/rfcs/1299_local_server_availability_and_service_installation.md:268)。但两条服务路径都没有检查或提示 linger 状态。builtin/code/worker.py:31-32通过RLIMIT_AS设置硬限制,macOS 上由父进程采样 RSS。基线即是如此。新发现(建议拆分为独立 issue)
N1【高】未认证的慢速请求可占满并发名额,使全部请求返回 503(包括
/health)server/factory.py:451-455、server/http_limits.py:35-92,由 feat(server): bound HTTP request bodies and active responses #2162 引入。HttpResourceLimitsMiddleware在认证中间件之后通过add_middleware注册,处在最外层。请求先占用一个并发名额,再读取请求体,读取过程没有超时。max_concurrent_requests的默认值。Content-Length后,慢速发送请求体。server_overloaded。存活探针失败还可能触发反复重启。N2【中高】含 Claude Code / Codex 采集 prompt 的 Scope 无法
archive exportbuiltin/portability/bundle.py:140(_ABSOLUTE_HOST_PATH)、:1833-1848(_validate_safe_value)。capture_prompts,会在 Source metadata 中写入"cwd": "<绝对路径>"(integrations/claude-code/plugins/powercontext/hooks/user_prompt_submit.py:259)。Codex 会话导入同样会写入(client/session_import.py:581)。cwd且值为绝对路径时,抛出BundleFormatError("bundle contains an absolute host path")。_validate_record_safe,输入为 Claude Code prompt 的 payload 形态。metadata.cwd的 Source 能完成导出与恢复。N3【中】只安装核心包时,
powercontext.artifact_plugins和from powercontext import *失败artifact_plugins列在powercontext.__all__中(__init__.py:126,135)。导入链为:artifact_plugins.py:27→artifacts/indexes.py:23→builtin/artifacts/memory/__init__→jev_reranking.py:25(import httpx)。pip install .(不带 extras)后,以下两条语句都抛出ModuleNotFoundError: No module named 'httpx':import powercontext.artifact_pluginsfrom powercontext import *scripts/ci_role_smoke.py:111只在安装了 extras 时才导入artifact_plugins。artifacts/indexes.py不再依赖 builtin,例如把EmbeddingProfile移入核心包;或者从核心__all__中移除,并在文档中声明需要的 extra。N4【中】
/mcp默认没有 Host / Origin(DNS 重绑定)防护原因:
server/mcp.py:616调用http_app(path="/", stateless_http=True)时没有开启 host/origin 防护,而两个上游库的默认值都是关闭:http_host_origin_protection默认为False。enable_dns_rebinding_protection默认为False。仓库中也没有设置
FASTMCP_HTTP_HOST_ORIGIN_PROTECTION。影响: loopback 模式默认
access.mode="disabled"(server/settings.py:195),REST 又没有 Host 校验。因此 A9 中关于 DNS 重绑定的推断同样适用于/mcp。证据: 读码,包括上游源码。可利用性未实测。
N5【中,多节点】索引校验 token 会被其他节点清除,搜索可能长期不可用
builtin/persistence/artifact_indexes.py:708-714在build()开头无条件把validation_token置为None,无法区分崩溃遗留的 token 和其他节点正在使用的 token。_maintain_search(server/artifact_plugins.py:166),没有租约,也没有选主。index rebuild is incomplete,并且每轮都重复全量校验。change_seq不变(:854-874),持续有写入的族可能始终无法发布。_coverage_valid逐个 head 读取,并把全部投影载入内存。N6【中,外部 owner 存储】不同主体写 Profile 时,flush 可能返回 409 并回滚
server/authz/owner_recovery.py:548生成operation_id时只用 deployment、kind 和资源键,不含 principal。server/app.py:2795-2801、server/factory.py:684-691),以 owner=U 再次 stage。_require_same_intent(:531-537)抛出AccessConflictError,U 的 flush 整体回滚。operation_id时,视为 owner 已存在,或者先 replay 这条 intent。N7【低】规范声明的 4 个解析器名没有实现,
x-powercontext-access对这些操作不生效openapi/powercontext.yaml中声明,但不在_NAMED_ACCESS_RESOLVERS(server/app.py:5747)中:source_status_accesssource_instances_accesssource_management_channel_accesssource_instance_channel_accesssource_management/gateway.py:388-440通过add_api_route直接挂载,鉴权在 gateway 中手写。N8【待确认语义】从
auth.administrators移除用户后,已持久化的server.admin不会被撤销server/authz/composition.py:136-161(_bootstrap_server_roles)只创建绑定,没有对账或撤销逻辑。其他低优先级
catalog_changes没有跟进 fix(review): short-circuit approval of rejected candidates #2123(推断)。_approve_once(builtin/catalog_changes/service.py:289-300)先锁定目标、校验证据和 basis,lock_pending才报终态错误。批准一个已驳回的 Tag 候选时,可能先返回证据或 basis 错误,而不是终态错误。ClaudeInstaller.install(cli/system.py:1486-1511)中,marketplace add成功、plugin install失败后,marketplace 会保留。之后换--source重跑会报来源不一致。integrations/claude-code/plugins/powercontext/hooks/prepared_context.py:85。integrations/langchain/src/powercontext_langchain/middleware.py:140。source_management/manager.py:102-108先查实例:实例不存在返回 404,凭据错误返回 401。server/ownership.py:383→server/authz/service.py:1345-1378。owner_recovery.pending()(:172)逐行解码整页,任何一条损坏都会让整页报错,且错误中不带operation_id。已核查、未发现问题的范围
builtin/portability的归档处理: 只读取固定条目,不解压到磁盘,整包、单行、条数都有大小上限。ops的下载与安装:..路径。builtin/inference/input_encoding.py: 候选编码必须能还原原文,否则回退到原文。topic_memory_recovery.py、mysql_compatibility.py在中断后可续跑。dobet commentedon Nov 4, 2026
Adding a few points not covered by the previous re-check on
1190dcbb:A5: Dream routes still don't constrain
scope_id/run_id; a blank scope returns 500 (reproduced)get_dream_run,create_dream_run, andlist_dream_runsare still barestr(server/app.py:3953/3969/3997), without thePath(min_length=1, max_length=256, pattern=r".*\S.*")the other routes use.BuiltinRuntime:GET /v1/scopes/%20/dream/abcreturns500 internal_error, because theValueErrorraised byvalidate_scope_idis not mapped to a 4xx.Items with open PRs
refactor!: restore package layering in src, opentest: remove redundant tests and implementation detail checks, open; targets tests that depend on implementation detailsrefactor(integrations): generate the shared Python plugin helpers from one source, open; targets duplicated plugin helpers across hostsA6: hook runtimes
Besides
python3,uv run, and Node, there are two more hook runtimes:POWERCONTEXT_PYTHON.That makes 6 in total.
ctxloop commentedon Nov 6, 2026
Status
Checked on 2026-11-08 against
masteree3c1ee3. The original review baseline ise4efb39b, and the re-check baseline is1190dcbb. This comment is edited in place as PRs open and merge.✅ resolved · 🔶 partly resolved · 🟡 in review · ⬜ not started
src.e0bc7f8c), #2502 (89d960e3)scope_idis rejected on the Dream (#2494) and Tag and Atomic Memory state (#2502, #2493) routes. Remaining: hand-writtenPath/Queryconstraints are not compared with the OpenAPI contract, unknown query parameters are handled inconsistently, resolver names are checked only at runtime, the authentication-dependency 422 has no details, andAtomicMemoryIndexErrortext is returned as is.73a819df) generates the shared Python plugin helpers from one source, as a first step of #2250.24e0017e) removes redundant tests and implementation-detail checks.ee3c1ee3)metadata.cwdcannot be exportedartifact_pluginsimport fails with the core package only/mcpand RESTserver.admincatalog_changesdoes not follow #2123fix(server): end disconnected uploads without a response
fix(server): authenticate requests before reading their bodies (#2512)