Repository navigation
Description
domain:server#3 · os-bill · session_01Utp6CaAUev5V62cLHhQwBi
Filing category: ① product defect with a named location (an out-of-scope finding from the #32354 build, measured on claude/project-thread-phk4r9 plus the #32354 local head; notes /mnt/project-files/server-seat3-p2/card-32354/step0.md).
Part of #31527 (ADR-0150) · Refs #32201 · Refs #32354
维护者速读
- 改什么:按名字读元数据分层(
/meta/:type/:name/layers)遇到多个包持有同名项而拒绝时,409 也要带details.candidates,与普通读一致。 - 为什么:metadata-protocol: the /meta door's 409 RESOURCE_CONFLICT carries details.candidates, as /automation and /actions do (ADR-0150 D5) #32201 让普通读的 409 带上候选包,但分层读的 409 只有一句话,调用方无法知道该选哪个包。
- 风险:第一方 0 处;只是在已有的 409 上加一个字段(放宽,Clause-② yes)。
- 先看:
packages/metadata-protocol中/layers的拒绝出口(packagelessLayeredReadRefusal一带),对照 metadata-protocol: the /meta door's 409 RESOURCE_CONFLICT carries details.candidates, as /automation and /actions do (ADR-0150 D5) #32201 在普通读上的做法。 - 验证:两个包持有 d1,
GET /meta/:type/d1/layers应答 409,且details.candidates列出两个包。 - 需要你做的:无,归专题席派发。
What happens
A package-scoped refusal on /layers answers 409 RESOURCE_CONFLICT with a sentence naming the holders, but no structured details.candidates. This holds both for two registry holders and for the row-layer refusals #32354 adds. The plain read at the same address carries details.candidates since #32201. D5 says every ambiguous by-name answer names its candidates.
Do
Carry the candidates, in the /actions shape, on every /layers refusal exit, on both transports. Pin each exit and ablate once. CONTROL: the plain read is unchanged.
Serial: after #32354, which adds row-layer /layers refusals.
Blocked-by: #32354
Reader who acts: the server seat the epic seat routes it to. Grade: p2 (first-party reach 0).
Collecting card (epic seat, #32624 folded in)
Per the maintainer ruling recorded at 6829776521 on #31527 (same-family corner cards fold into one collecting card; first-party exposure 0 on each). The folded card's text, with its evidence, follows verbatim; it is closed duplicate against this card.
Folded from #32624
#32624 as filed
domain:server#3 · os-bill · session_01Utp6CaAUev5V62cLHhQwBi
Filing category: ① product defect with a named location, reproduced (found while measuring #32622 from the #32250 build; real RestServer, HttpDispatcher, protocol and SchemaRegistry using #32201's harness, two packages registering the dashboard sales; tree claude/project-thread-2g3ujl @ 100259e0, which is the PR #32306 head plus #32250; probe output /mnt/project-files/server-seat3-p2/card-32250/probe-32622-layers.txt).
Part of #31527 (ADR-0150) · Refs #32622 · Refs #32201
维护者速读
- 改什么:REST 的分层读(
GET /meta/:type/:name/layers)在两个包都注册同名项时,应和普通读、调度器的分层读一样答 409 并点名两个包,而不是静默返回第一个包的条目。 - 为什么:同一名字三扇门答法不一:普通读 409、调度器 /layers 409、REST /layers 200 给 alpha。按注册顺序悄悄选一个,违反专题红线"歧义要报告、不许猜"。
- 风险:第一方 0 处;REST /layers 200 → 409(收窄,Clause-② yes)。
- 先看:rest 包里
/meta/:type/:name/layers的路由如何取条目,对照调度器路径的PackageScopedNameRefusedError。 - 验证:两个包注册 dashboard
sales,RESTGET /meta/dashboard/sales/layers应 409 且带details.candidates。 - 需要你做的:无,归专题席派发。
What happens (measured)
| door | answer |
|---|---|
plain GET /meta/dashboard/sales (both transports) |
409 RESOURCE_CONFLICT with candidates |
dispatcher GET /meta/dashboard/sales/layers |
409 RESOURCE_CONFLICT (candidates once #32250 lands) |
REST GET /meta/dashboard/sales/layers |
200, alpha's item |
Do
The REST layered read resolves the name as the plain read does. Two served holders refuse 409 with details.candidates and never pick by order. Pin both registration orders; CONTROL: a single holder answers unchanged. Re-measure first on main after #32183 (PR #32497) lands, since that PR changes the served-holder set the layered read uses.
Reader who acts: the server seat the epic seat routes it to. Grade: p2 (first-party reach 0).
Activity
objectstack-fleet commentedon Nov 12, 2026
domain:server#7 · os-sales · session_01L6bhgVSjQBHNkZd6Eqx2XX
Parked · #32622 · 2026-11-12T13:33Z — on the maintainer's release-line ruling 6824949405 on #31527 (Sales tapped 「三招都用(推荐)」 on the epic seat's card 「专题怎么提速?」, 2026-11-12T13:28:14Z): every p2 card of epic #31527 without an open PR, and every nested follow-up card, waits until the release ships.
pm:blocked→pm:on-holdin this stroke. Nothing is deleted.Blocked-by:line stays as it was; both must clear before dispatch.Restart-when: the release that carries the epic #31527 release line is published (ruling 6824949405 on #31527)
[-]metadata-protocol: the /meta/:type/:name/layers 409 for a package-scoped refusal carries no details.candidates, unlike the plain read (ADR-0150 D5; sibling of closed #32201)[/-][+]metadata-protocol + rest: the layered read (/meta/:type/:name/layers) of a name two packages hold answers as the plain read — 409 with details.candidates, never the first holder (ADR-0150 D3/D5; collects #32622 #32624)[/+]objectstack-fleet commentedon Nov 12, 2026
epic:#31527#1 · os-sales · session_01L6bhgXQnNkXTT1Wu7i7Y3i
Epic seat · 2026-11-12T22:50Z: parking is abolished (Sales). This card is not on-hold; it is blocked.
Blocked-by: #32607
It stays p2 and is not on the 24h release line (dispatch order 6838093284). It enters the queue once #32607 merges.
objectstack-fleet commentedon Nov 13, 2026
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Path: none
Triage: first-touch audit (pre-labeled card) ·
p2confirmed · 2026-11-13T08:30Z⛔ Not a claim; the claim (if any) is unchanged.
Generated by Claude Code