Skip to content

feat(federation): member 配置正交化到 entity (specs/020) - #133

Merged
allmonday merged 10 commits into
masterfrom
020-federation-config-orthogonal
Aug 9, 2026
Merged

feat(federation): member 配置正交化到 entity (specs/020)#133
allmonday merged 10 commits into
masterfrom
020-federation-config-orthogonal

Conversation

@allmonday

Copy link
Copy Markdown
Collaborator

概述

Federation member 侧配置正交化:联邦能力全部声明在 entity 上(__federation_keys__ 纯标记 + __pagination_orders__ 单一 order 载体),AutoQueryConfig 退化为纯开关执行者,γ DTO 的 join key + order 从源 entity 推导。解决正交性 5 问题(join key member 侧 3 处重复 / order βγ 重复 / __pagination_orders__ 双重身份 / order 无单一载体 / 配置散落 4 处)。设计存档 specs/020/

核心改动

  • entity 声明__federation_keys__(联邦批量入口字段)+ __pagination_orders__(order 单一载体,靠 __federation_keys__ 路由联邦根 vs 本地关系)
  • by_/page_ 叠加(FR-002 + FR-003):每个 federation key 总生成 by_<key>_in,有 order profile 额外生成 page_by_<key>_in(分页联邦关系同时 wire full + paged 双 loader)
  • γ DTO:不再自带 __pagination_orders__ / federation_join_key,从源 entity 推导(单 key 自动;多 key 用 SubsetConfig.federation_key 选择器)
  • T006registry._resolve_local_page_capability 按 federation key 路由(联邦根 vs 本地 loader)

⚠️ Breaking(直接删,无 deprecated 期)

AutoQueryConfig(batch_keys=...) entity.__federation_keys__
AutoQueryConfig(batch_pages=...) entity.__pagination_orders__
SubsetConfig(federation_join_key=...) 从源 entity __federation_keys__ 推导;多 key 用 federation_key
DTO 级 __pagination_orders__ 读源 entity __pagination_orders__[join_key]

迁移说明见 docs/advanced/federation.md 末尾对照表。

测试

  • 全量回归 1517 passed, 6 skipped(零回归,全程基线持平)
  • SC-004 三层联邦 demo(catalog→reviews→users)端到端:β deep chain + γ composed_tree errors None

Commits

  • e0ce442 fix(resolver): drop Core API context→Paged override(P6 修复,020 的前置基础)
  • 75689c7 spec-kit 产物
  • aae4109 / c523140 US1:add_standard_queries 读 entity dunder + by_/page_ 叠加 + T006 + 迁 18 测试
  • 0470251 US2+US3:γ DTO order/join key 归并源 entity
  • 6dc579d Polish:docs 迁移说明 + changelog breaking + SC-004 验证

🤖 Generated with Claude Code

allmonday and others added 10 commits August 9, 2026 15:32
Resolver(context=...) could override a DTO field's Paged default on the
Core API path (γ federation :586 + local entity :1650), leaking runtime
input into the Resolver. Pagination params are declarative/fixed on the
field; runtime input belongs on the UseCase method signature, not Resolver
context.

- resolver.py: use paged_default directly at γ (:586) and local (:1650);
  delete _extract_page_params. _merge_paged stays (GraphQL entity-relation
  path uses it for client gql args).
- Mode B (DTO) Paged is now fixed everywhere: use-case GraphQL never exposed
  limit/order on Paged fields, so clients could never override.
- tests: drop 6 caller-override tests (test_dto_paged / test_paged_provider
  / test_dto_paged_remote).
- demo/core_api + docs/advanced/federation (+zh): remove caller-override wording.

1517 passed (was 1523; -6 removed override tests), 87% coverage, zero regressions.

Co-Authored-By: Claude <noreply@anthropic.com>
spec / plan / tasks / research / data-model / contracts / quickstart。
设计:member 侧联邦配置移到 entity(__federation_keys__ 纯标记 +
__pagination_orders__ 统一不区分对内对外)+ γ join_key 归并 +
AutoQueryConfig 退化为执行者。解决正交性 5 问题。breaking。

Co-Authored-By: Claude <noreply@anthropic.com>
- add_standard_queries 改读 entity.__federation_keys__ + __pagination_orders__
  生成 by_/page_ 根(有 order profile → page_by;无 → by_),替代
  AutoQueryConfig.batch_keys/batch_pages
- AutoQueryConfig.batch_* 标 removed(未真删,待 US1 收尾迁移)
- tasks.md 顶部加「实现进度」段(新对话交接)

⚠️ 工作进行中(未完成):7 个 federation 测试 + demo 未迁到 entity dunder,
当前测试会红。新对话接手见 tasks.md 进度段 + specs/020/。

Co-Authored-By: Claude <noreply@anthropic.com>
- 真删 AutoQueryConfig.batch_keys/batch_pages(参数+赋值),manager.py 错误消息
  + registry.py docstring 同步去 batch_*
- add_standard_queries 改「叠加」:federation key 总生成 by_<key>_in(FR-002),
  有 order profile 额外生成 page_by_<key>_in(FR-003)。接手代码的「互斥」实现
  违背 FR-002 + federation manager full_br(分页关系同时 wire by_/page_ 双 loader,
  manager.py:364),导致所有 pagination=True 联邦测试崩
- T006: registry._resolve_local_page_capability 加 federation key 路由判断
  (profile key 在 __federation_keys__ → 归联邦根,不归本地 loader)
- 18 个 federation/dto 测试 + page_config + reviews/users demo 迁到 entity dunder
- 全量回归 1517 passed, 6 skipped(零回归)

剩余 US2(γ DTO __pagination_orders__ 收敛)/ US3(join key 归并)/ Polish。

Co-Authored-By: Claude <noreply@anthropic.com>
US2 (T007-T008):
- γ DTO 不再自带 __pagination_orders__;add_dto_batch_roots 改读源 entity 的
  __pagination_orders__[join_key](order 单一载体,β/γ 统一)
- SubsetMeta 元类去掉 DTO 级 __pagination_orders__ 保留
- contracts「有→page_,无→by_」互斥措辞修正为叠加(FR-002+FR-003)

US3 (T009-T011):
- γ DTO join key 从源 entity __federation_keys__ 推导(单 key 自动;
  多 key 用 SubsetConfig.federation_key 选择器,引用 entity 已声明的 key 名)
- SubsetConfig.federation_join_key → federation_key(退化为选择器)
- stamp __federation_join_key__ 保留为 entity 推导结果缓存(introspect/
  standard_queries 读它不变 —— 最小改动,单一来源仍是 entity)

迁移:6 dto 测试 + reviews_app ReviewDTO(去 federation_join_key +
__pagination_orders__)。全量回归 1517 passed, 6 skipped 零回归。

剩余 Polish:docs 迁移说明 + changelog breaking + SC-004 demo 端到端。

Co-Authored-By: Claude <noreply@anthropic.com>
- docs/advanced/federation.md + .zh.md: 代码示例改新声明模型(entity
  __federation_keys__ / __pagination_orders__ + γ DTO 派生),加「从 pre-020 迁移」表
- demo/federation/README.md: 更新声明说明(去 batch_keys/batch_pages/federation_join_key)
- docs/changelog.md: Unreleased 段标 020 breaking(移除 batch_keys/batch_pages/
  federation_join_key;AutoQueryConfig 退化为纯开关)
- SC-004 验证: 三层联邦 demo(catalog→reviews→users)端到端跑通,β deep chain +
  γ composed_tree errors None,确认新声明模型工作

纯 docs,不计 semver(src 行为变更在 c523140/0470251)。发版由 release skill 处理。

Co-Authored-By: Claude <noreply@anthropic.com>
- subset.py: 删未用的 get_fk_fields import(US3 改 _validate 不再用)
- query_executor.py / loader/__init__.py: import 排序(既有 I001,顺带修让 CI green)

1517 passed 零回归。

Co-Authored-By: Claude <noreply@anthropic.com>
排序是被排序对象的单一属性,与分桶维度(federation key)/关系归属正交:

- __pagination_orders__ 从 dict[federation_key, cfg] 退化为单一 BatchPageConfig
  (entity 自己的排序)。add_standard_queries: 有 __pagination_orders__ → 每个
  federation key 都出 page_by_<key>_in(共用这一个 profile),否则只 by_。
- 本地关系分页归 target entity: _resolve_local_page_capability 改读
  target.__pagination_orders__(Comment 的排序,Review.comments 分页时用),
  去掉 owner dict + T006 重名判断。Comment 被 N 个 owner 挂载时排序只配一次。
- add_dto_batch_roots / introspect γ 序列化读源 entity 单一 __pagination_orders__。

迁移: 所有 entity 声明 dict→单一;本地关系(Review.comments / Sprint.tasks /
LOReview.comments 等)从 owner 迁到 target。docs 同步。
全量 1517 passed 零回归 + ruff src/ green。

Co-Authored-By: Claude <noreply@anthropic.com>
spec 是设计真相来源,补上 src 实现演进(spec 之前还停在 dict[key] + 统一路由):

- spec.md: US2 重写(统一载体→排序归被排序对象,联邦读 owner/本地读 target);
  FR-003/4/5(entity 级 page_/by_ + 单一 + 归 target);Edge(去维度重名,本地读
  target 不冲突);Key Entities(__pagination_orders__ 单一)
- research.md: 决策 2/5 重写(统一路由→单一+target;per-key→entity 级)
- data-model.md: __pagination_orders__ 形态 dict→单一;关系图(双 entity 各自)
- contracts: 声明示例(Review 单一 + Comment 单一)+ 规则(归 target,去路由)
- plan.md / quickstart.md: 概述/验证同步单一

纯 docs(spec-kit 产物),实现已在 9ca4bb1。

Co-Authored-By: Claude <noreply@anthropic.com>
- test_federation_pagination_transitive: A→B→C 穿透分页,B/C enable_pagination=False
  仍正常(钉死 enable_pagination 与联邦分页正交)。对比实验(B→C pagination=False
  崩溃)作为 021 动机证据。
- specs/021-federation-pagination-auto/spec.md: 议题存档 —— 去掉
  RemoteRelationship.pagination(020 后冗余 + 不传递),mounter 自动 page_by_ 优先,
  分页回归 ER diagram 级全局开关。

Co-Authored-By: Claude <noreply@anthropic.com>
@allmonday
allmonday merged commit be535fe into master Aug 9, 2026
6 checks passed
@allmonday
allmonday deleted the 020-federation-config-orthogonal branch August 9, 2026 14:22
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