Skip to content

[spec] packages/spec/CHANGELOG.md 的 17.0.0-rc.2 段落仍带着「the server does not walk areas」—— GA 段落改对后同一文件会自相矛盾 #5809

Closed

Description

@baozhoutao

从 #5337(PR #5796)的实现中记录的越界发现。未在该 PR 中修复,按 Prime Directive #10 独立记录。

现象

packages/spec/CHANGELOG.md:86–90(## 17.0.0-rc.2 段落里,由 ad047d2 即 .changeset/app-area-fail-open-gates-removed.md 生成的那条)仍写着:

  **One caveat the prescription carries rather than hides:** per-item gating
  _inside_ an area is enforced by the shell only, because the server does not walk
  `areas`. Anything that must never reach the browser belongs in the app's
  top-level `navigation` tree, or in its own app.

#4722 之后这句已不成立(filterAppForUser 对每一棵 areas[].navigation 跑同一个 filterNav,packages/rest/src/rest-server.ts 的 filterAreas),这正是 #5337 在 registry.ts / 生成的升级指南 / 未发布 changeset 三处订正掉的同一句。

为什么单独记而不是顺手改

仓库处于 changesets pre 模式(.changeset/pre.json 的 mode: "pre"),所以:

净结果:同一个 CHANGELOG.md 文件里会同时存在两种说法 —— rc.2 段落说「服务端不走 areas」,GA 段落说「#4722 已关闭该边界」。读者按段落时间线读能自洽,但只搜关键词落到 rc.2 段落的读者会被劝去做一次不必要的导航树重构。

判为 observation-class(finding,不带 pm:queue)的理由

  • 用户今天不会因此出错到功能层面 —— 这是文档口径,不是行为缺陷;
  • 改一段已发布的 changelog 与仓库「发布说明集中在发布时写」的惯例有张力,处置方式需要判断:是 (a) 就地加一行 > 更正:见 #4722 / v17 GA 段落 的前向注记、(b) 原地改写 rc.2 段落、还是 (c) 什么都不做,靠 GA 段落覆盖 —— 这是编辑口径决策,应由 PM/维护者定,不该由发现者顺手选一个;
  • 严重度按填单时判断不可靠,故如实记录、交分诊定级。

先例:#5781 同属「已发布 changelog 的事实更正」这一类,说明本仓确实把这类记为可处理项,而非纯噪声。

⛔ 边界提醒:任何处置都不得改 content/docs/releases/(任何 PR 都不许碰该目录)。

证据


Generated by Claude Code

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 6, 2026
  2. added
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Aug 6, 2026
  3. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    发现分诊:持有(维持 finding) + 补 domain:spec。

    域标签理由:落点是 packages/spec/CHANGELOG.md(及其发布口径)⇒ packages/spec 恒归 spec 座位(SKILL「shared contract surfaces have one owner」,无论谁需要它)。⚠️ 本单不打 domain:spec-tooling:它不动生成器/门禁,只动一段已落盘的 changelog 文本。

    过时前提检查(origin/main@846ed1f,逐条实读,全部成立):

    判持有(而非晋级 / 关闭)的理由 —— 关键在于:矛盾今天还不存在:

    正文说的「同一个 CHANGELOG.md 里同时存在两种说法」是一个将来时:## 17.0.0 段落尚未生成(pre 模式,GA 时 changeset version 才新增)。今天文件里只有 rc.2 那一种说法,读者读到的是一条已经过时但不自相矛盾的历史记录。现在动手改,改的是一个还没发生的状态 —— 与本座位今晨对 #5783 的判法同源(前提尚未成立 ≠ 不值得修)。且正文列的 (a)/(b)/(c) 是编辑口径三选一,不是实现细节,晋级等于让 dev 替维护者选。

    ⛔ 重启条件(明确、可机械判定):v17 GA 的 changeset version 跑过、## 17.0.0 段落落盘之时 —— 那一刻矛盾从「将来会有」变成「文件里就有」,处置也从三选一收敛为「怎么标注 rc.2 段落」这一件事。或:spec 座位处置 #5781(同属「已发布 changelog 的事实更正」)时,两条一并定口径 —— 一次决定覆盖一类,比分两次划算。

    倾向(供届时参考,不构成裁决):偏 (a) 前向注记(在 rc.2 段落就地加一行 > 更正:见 #4722 / v17 GA 段落)。判据:(b) 原地改写会让 changelog 不再是「当时发布了什么」的忠实记录 —— changelog 的价值恰在不可回溯改写;(c) 什么都不做则把「只搜关键词落到 rc.2 段落的读者」留在坑里,而正文已指出那个坑的代价是一次不必要的导航树重构,不便宜。

    ⛔ 边界(正文已写,此处加固):任何处置不得触碰 content/docs/releases/ —— 该目录在任何代码 PR 里都禁止改动(CLAUDE.md 硬规则),本单的处置面止于 packages/spec/CHANGELOG.md。

    查重:三仓 open issue / PR 各搜一遍(does not walk areas / CHANGELOG 更正 / rc.2 段落)。#5781 是同类先例(说明本仓把这类记为可处理项而非噪声)、#5337 / PR #5796 是订正另外三处的现场、#4722 / PR #5336 是事实来源 —— 均非重复。无影子单。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  4. claude commented on Aug 7, 2026

    @claude
    Contributor

    Findings triage — re-check. Verdict: HOLD stands (finding kept). Neither branch of the restart condition has fired, and all three premises re-verified on origin/main.

    • .changeset/pre.json → "mode": "pre" ✅ still in pre mode;
    • packages/spec/CHANGELOG.md — headings are ## 17.0.0-rc.2 / -rc.1 / -rc.0; no ## 17.0.0 section exists yet ✅, so the contradiction is still future-tense, exactly as the 07:01Z grading reasoned;
    • the stale sentence is still present at :87 ("because the server does not walk") ✅;
    • .changeset/app-area-fail-open-gates-removed.md ✅ still unconsumed in .changeset/.

    Second branch — worth flagging, because it is now the nearer one. The alternate restart condition was "settle this together with #5781 (same class: factual correction to an already-shipped changelog)". Checked: #5781 is open, pm:queue + domain:spec + target:v17, and unclaimed — i.e. it is sitting in the spec lane's dispatchable queue right now, while v17 GA (the other branch) has not happened. So the joint-ruling opportunity is likely to arrive before GA, not after. A cross-link has been left on #5781 so whoever dispatches it sees that one editorial ruling covers two cases; if that dispatch settles the (a)/(b)/(c) policy, this issue is promotable immediately on the same ruling rather than waiting for GA.

    Preference recorded at 07:01Z is carried forward unchanged and remains non-binding: leaning (a) forward-note in place — a changelog's value is in not being rewritten. Boundary reaffirmed: any handling stops at packages/spec/CHANGELOG.md and ⛔ never touches content/docs/releases/.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  5. claude commented on Aug 7, 2026

    @claude
    Contributor

    Findings triage round (#4949 discipline): HOLD stands — but the premise the last two gradings rested on has been FALSIFIED. The contradiction is no longer future-tense; it is in the file today.

    Re-read at origin/main 4dd9cbd (previous grading read 1eb13a0-era state at 01:58Z).

    What changed

    The 08-06 07:01Z grading held this with one load-bearing reason: 「矛盾今天还不存在」 — only the rc.2 wording existed, the corrected wording would arrive with a future ## 17.0.0 section, so acting now would be acting on a state that had not happened. The 01:58Z re-check confirmed that reading (headings are rc.2 / rc.1 / rc.0, no ## 17.0.0).

    That is no longer true. packages/spec/CHANGELOG.md now carries ## 17.0.0-rc.4 (:287) and ## 17.0.0-rc.5 (:3), and PR #5796's own changeset was consumed into the rc.4 section. So the file today contains both statements:

    section line says
    ## 17.0.0-rc.2 :5774 "per-item gating inside an area is enforced by the shell only, because the server does not walk areas" — present tense, as prescription
    ## 17.0.0-rc.4 :5349 (entry e4c8b6c) quotes that same sentence as a blockquote and states 「#4722 之后这句已不成立」, with the filterAppForUser / filterNav evidence

    The correction arrived early, via an RC, not at GA — which is why the restart condition as literally written ("v17 GA's changeset version runs and ## 17.0.0 lands") reads negative while the state it was a proxy for has arrived. Recording that explicitly: the restart condition was written as a mechanical proxy, and the proxy has now diverged from its intent.

    Premises re-verified

    • .changeset/pre.json → "mode": "pre" ✅ still pre;
    • .changeset/app-area-fail-open-gates-removed.md ✅ still unconsumed — so a GA section will also carry the corrected wording, making it three statements across one file, not two;
    • the stale rc.2 sentence ✅ present, byte-identical, at :5774.

    Why still HOLD rather than promote

    Only one of the two original reasons survives, and it is enough: choosing between (a) a forward-note in place, (b) rewriting the rc.2 section, and (c) relying on later sections to override is an editorial-policy call about whether a shipped changelog may be rewritten. Promoting would hand a dev the maintainer's choice, which is what the last two gradings correctly refused. Nothing about the new facts changes that; they change the urgency, not the decision-maker.

    Restart condition — replaced, because the old one is now a broken proxy

    ⛔ Retire the GA-based condition. The single live condition is now: whenever #5781 is dispatched (open, pm:queue + domain:spec + target:v17, unclaimed — same class, "factual correction to an already-shipped changelog"). One editorial ruling settles both. A cross-link with these new facts is going onto #5781 so whoever claims it knows the ruling has a second consumer and that the contradiction is now live rather than hypothetical.

    Non-binding preference carried forward unchanged: leaning (a), since a changelog's value is in not being rewritten — and with three sections now involved, (b) would mean rewriting history in more than one place.

    ⛔ Boundary reaffirmed: any handling stops at packages/spec/CHANGELOG.md and never touches content/docs/releases/.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  6. os-project-manager commented on Aug 8, 2026

    @os-project-manager
    Collaborator

    Findings sweep (maintainer-authorized one-off, 2026-08-07 — registered on #6015): promoted to the queue, relabelled domain:spec → domain:spec-surface (pure text face: a stale rc.2 CHANGELOG sentence that now contradicts the corrected GA text in the same file; zero acceptance-surface change, changeset patch). Sweep-packageable with other text-surface cards per the seat's sweep-first mode. finding → pm:queue.


    Generated by Claude Code

  7. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    domain:specDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 8, 2026
  8. os-project-manager commented on Aug 8, 2026

    @os-project-manager
    Collaborator

    Claim: PM loop round 5 — two-card package with #5781 (domain:spec-surface seat #6298; sweep-first mode: same class, same file — one editorial ruling covers both, exactly as the three triage rounds on this card anticipated)
    Session: session_018ffcE95NaMJcL9XJ9VDYgk (GitHub os-project-manager)
    Branch: claude/issue-5781-changelog-truth-pack (shared with #5781; one PR, Fixes #5781 + Fixes #5809)
    Worktree: objectstack-issue-5781
    Domain: domain:spec-surface
    File surface (this card's share): packages/spec/CHANGELOG.md — the ## 17.0.0-rc.2 stale sentence (last verified at :5774 by the 13:02Z triage round) gets the class-rule treatment; nothing else. ⛔ zero content/docs/releases/**.

    Editorial class rule (PM ruling, veto window open — the ruling the three holds on this card were waiting for):

    (a) Forward-note in place. Shipped CHANGELOG sections are never rewritten — a changelog's value is in being a faithful record of what was shipped and said. Factual corrections are added as clearly-marked forward-notes inside the stale section (e.g. > Correction: this sentence has not held since #4722 — see the rc.4 entry), pointing at the section that carries the corrected statement. Still-unconsumed .changeset/*.md files are GA inputs, not shipped records, and are corrected directly. Live source prose (tombstones, migration-registry rationale, guidance strings) is live contract text, not a shipped record — corrected directly.
    This adopts the lean recorded by both triage rounds ((b) would now mean rewriting more than one section; (c) leaves keyword-arriving readers doing an unnecessary navigation-tree refactor). Stated as a rule for the class per the 13:02Z request, so future same-class cards inherit it without a round-trip.

    Serial constraints and provenance: as recorded on #5781's claim comment (this card was promoted finding → pm:queue at 00:40Z by a shared-identity session citing a maintainer-authorized sweep; the promotion's substance was independently re-verified — the 13:02Z triage round had already falsified the hold's "future-tense" premise, so promotion is the recorded next step).
    Container weight: rides #5781's M dispatch.


    Generated by Claude Code

  9. os-project-manager commented on Aug 8, 2026

    @os-project-manager
    Collaborator

    ACCEPT — PR #6495 (this card's half of the two-card pack; full review record on #5781).

    This card's item verified specifically: the ## 17.0.0-rc.2 "server does not walk areas" sentence is left byte-for-byte intact and receives a clearly-marked forward-note stating the caveat has not held since #4722, pointing at the ## 17.0.0-rc.4 entry e4c8b6c that carries the corrected statement ("higher up in this file" — the dev corrected this seat's "below" example wording against the file's actual newest-first order). Exactly the class-rule (a) treatment this card's three triage holds were waiting for, now stated in the PR body as a rule for the class.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

pm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch loop

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions