Repository navigation
[Decision] @objectstack/spec publishes a 10.3 MB CHANGELOG.md in its npm tarball and 83 package CHANGELOGs weigh 72 MB in git, mostly prerelease sections copied again under the stable release #26079
Description
Ruled: 6417011624 · letter A′ · 2026-10-26T13:20Z
Filing gate ②: a maintainer-only decision. Maintainer, 2026-10-26, verbatim: 「完整的评估本项目, 还有哪些可以优化的地方。包括 ci 和文档」 then 「使用 pm-dispatch 技能创建 issue,需要决策的立为决策卡。」 and 「低优先级的先不考虑」. Batch-of: 19 (repository evaluation 2026-10-26, session_019a9XCWsbMFp75REzthE6cs; 9 decision cards + 10 execution cards). Reader: the director seat presents this card in a decision batch; after the ruling the lane named under "After the ruling" dispatches. ⛔ Not a claim. Dedupe: REST list (439 issues), grep CHANGELOG → 3 hits: #25638 (closed: 18.1.0 entries attributed to one commit), #25806 (closed: the 18-1 release page caution), #25321 (closed: tree-wide git grep pins read CHANGELOGs). None is about tarball contents or prerelease duplication. New.
维护者速读
packages/spec/CHANGELOG.md 10.3 MB、约 10.5 万行;spec、cli、objectql、runtime 四个包的 files 字段都列了 CHANGELOG.md,所以它随 npm 发出去——每个 npm install @objectstack/spec 多下 10 MB。83 份包级 CHANGELOG 在 git 里共 72 MB。体积来自重复:预发布条目 18.0.0-next.0..5 在 18.0.0 下被整段再抄一遍(service-job/CHANGELOG.md 第 107 行与 622 行逐字相同;spec 有 4,076 条重复长行)。改发布包内容是对外可见动作,请裁:A 从四个包的 files 里去掉 CHANGELOG.md(npm 页面与仓库仍有),并让 scripts/changeset-changelog.mjs 把预发布小节并入稳定版小节而不是复制;存量 CHANGELOG 不横扫;B 只做前半(去掉 files 条目),生成器不动;C 保持现状。选 A / B / C?
Governing text
packages/spec/package.jsonfiles:[dist, json-schema, liveness, prompts, llms.txt, README.md, src/**/*.zod.ts, CHANGELOG.md, api-surface, spec-changes.json, protocol-upgrade-guide.md]; the same entry in cli, objectql, runtime.scripts/changeset-changelog.mjs— the changelog generator the release lane runs (docs/releases-maintenance.md).RELEASE_NOTES.md:3-8/CHANGELOG.md:9-22: the canonical narrative iscontent/docs/releases/+ per-package CHANGELOGs — the per-package files stay; only their duplication and their shipping change.- Prime Directive 15: the release act is the maintainer's; this card changes what a future release emits, not any release.
- docs: narrative cost — 42.5% of source lines are comments, workflows 58.6%, AGENTS.md is 103 KB with three stale claims, ROADMAP.md still says v3.3.2 and 80 Storybook stories #25919 ruling A 「存量不横扫」 — existing CHANGELOG text is not rewritten.
Premises
- P1 —
ls -la packages/spec/CHANGELOG.md→ 10,325,107 bytes;du -ch $(git ls-files | grep 'CHANGELOG.md$') | tail -1→ 72M. - P2 —
node -e 'console.log(require("./packages/spec/package.json").files)'listsCHANGELOG.md; repeat for cli, objectql, runtime. - P3 — duplication:
sed -n 107p packages/services/service-job/CHANGELOG.mdequalssed -n 622p …;sort packages/spec/CHANGELOG.md | uniq -d | awk 'length>80' | wc -l→ about 4,076. - P4 —
npm view @objectstack/spec@18.1.0 dist.unpackedSize(the dev reads the published number; a seat container may be refused).
One-sentence problem
Every consumer of the protocol package downloads ten megabytes of release history it will never open, and the history itself says each prerelease change twice.
Options
| Option | What | Consequence | Workload |
|---|---|---|---|
| A | Drop CHANGELOG.md from the four files arrays; teach the generator to fold X.Y.Z-next.N sections into X.Y.Z on the stable cut. |
Smaller tarballs from the next release; future CHANGELOGs grow at half the rate; existing text untouched. The npm "Changelog" tab still renders from the repository link. | devx (release tooling) · 1 PR · precedent: #25638's generator fix (closed; read its +/− before sizing) |
| B | files only. |
Tarballs shrink; the git weight keeps growing. | 1 PR, S |
| C | Nothing. | 10 MB per install of spec; 72 MB and rising in every clone. | 0 |
Business meaning
- A: ship the protocol, not its diary; write the diary once.
- B: stop shipping the diary.
- C: keep paying bandwidth on every install.
四维分析
- 实际业务需求:每个
npm create objectstack都装 spec;10 MB 是北极星「一条命令起一个项目」路上的真实延迟,且 CI 里tree-wide git grep已经因为读 CHANGELOG 撞过 60 秒预算(tree-widegit greppins read every byte underpackages/(CHANGELOGs included) against a 60 s budget: the runtime twin hit 86 s on a loaded shard (#25298); five siblings still do #25321)。 - 项目长远合理性:发布叙事的唯一真源是
content/docs/releases/;包级 CHANGELOG 是 changeset 的副产物,保留但不发行、不重复,是与那条规则一致的形态。 - 防 AI 犯错:生成器改动的风险是把稳定版小节也折叠掉;派发令要求在
scripts/changeset-changelog.mjs的--self-test里加「预发布折叠、稳定版保留」两条用例。错误形态是一次发布的 CHANGELOG 缺条目,发布前check:release-notes能看到。 - 创业阶段不扩散:减体积、不加门禁;存量不横扫。
Recommendation
A. 只看①选 A;②③④ 是否翻转:否。
Confidence gaps: whether any downstream tooling (hotcrm, cloud) reads the CHANGELOG from the installed package rather than the repository; the dev greps those repositories' scripts for node_modules/@objectstack/*/CHANGELOG.
After the ruling
- A / B: devx execution seat, one os-dev; file surface
packages/{spec,cli,objectql,runtime}/package.json,scripts/changeset-changelog.mjsand its self-test; no governed path. Clause-②: no (no metadata contract change). Metadata-protocol: none. - C: close not planned.
os-decision-facets
① 项目长远合理性:包级 CHANGELOG 留作副产物,不发行、不重复,与「唯一真源在 content/docs/releases」一致。
② 实际业务拉动:每次安装 spec 多 10 MB;CI 的 git grep 已因读它撞过预算(#25321)。
③ 防 AI 犯错:生成器折叠逻辑进 --self-test,缺条目会在发布前的 release-notes 检查里响亮。
④ 创业阶段不扩散:减体积零新门禁,存量不横扫。
Prior rulings read: changelog,files field,tarball,prerelease → 2 hits (#25638, #25806); none; thread: none; repo: objectstack-ai/objectstack
Related
#25638 (closed), #25806 (closed), #25321 (closed), #25919 (open, ruled A).
Activity
objectstack-fleet commentedon Oct 26, 2026
Triage: first grade —
tooling·priority:p2·domain:devx·area:devpath·needs-user-decision·pm:awaiting-maintainer· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-26T12:04Z⛔ Not a claim, ⛔ not a dispatch. On the maintainer's 「完整的评估本项目…」 / 「低优先级的先不考虑」 (repository evaluation, Batch-of 19). Low priorities were excluded at filing, so the execution cards grade p2.
Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Brief-claimed-by: session_01KrKXQVvgYk2AJ4VkqMobyb · batch #397 · 2026-10-26T12:47Z
Director seat, summon #51 continuation (ledger objectstack#12708). Presented to the maintainer in batch #397 (the CI / tooling family of the 2026-10-26 repository review) as item 3 of 4. Seat increment (re-verified on
origin/maincdd4eea9; the card's own analysis is not restated):packages/spec/CHANGELOG.mdis 10,325,107 bytes onorigin/main;fileslistsCHANGELOG.mdin spec, cli, objectql and runtime;scripts/changeset-changelog.mjsexists.packages/*/CHANGELOG.mdrow (AGENTS.md:711): the per-package CHANGELOG "ships inside the npm tarball as the text an upgrading agent greps" (Post-Task Checklist step 3: the changeset body with the FROM → TO mapping is what an agent reads afternpm install). DroppingCHANGELOG.mdfromfiles(the first half of A, all of B) contradicts that rule; it can only land with an AGENTS.md change (Tier H) that moves the grep target elsewhere (protocol-upgrade-guide.mdis already infiles).X.Y.Z-next.Nsections intoX.Y.Zon the stable cut (the second half of A, where the weight comes from: 4,076 duplicated long lines in spec), existing text not rewritten (docs: narrative cost — 42.5% of source lines are comments, workflows 58.6%, AGENTS.md is 103 KB with three stale claims, ROADMAP.md still says v3.3.2 and 80 Storybook stories #25919 A 「存量不横扫」), and the file keeps shipping. If the maintainer also wants the tarball slimmer, a second question: trim the shipped copy to the current major atprepack(the repository keeps the whole file), which satisfies the AGENTS.md rule for every supported upgrade path — that is a rule change the maintainer names, not the seat.content/docs/releases/, the tarball copy stays the upgrading agent's grep target; ② the 10 MB per install is real; ③ the fold goes into the generator's--self-test(prerelease folded, stable kept); ④ no new gate. 只看①选 A′;②③④ 是否翻转:否.Prior rulings read:
CHANGELOG·tarball·prerelease→ AGENTS.md:711 (ships in the tarball, by rule), release(changelog): the published 18.1.0 CHANGELOGs attribute 260 of 265 entries to 3937697, the commit that reverted the first cut, instead of each entry's own commit #25638, docs(releases): 18-1.mdx's "the commit beside an entry is mostly not its own" caution goes stale for the repository's CHANGELOGs once #25804 lands — narrow it to the published tarballs #25806, docs: narrative cost — 42.5% of source lines are comments, workflows 58.6%, AGENTS.md is 103 KB with three stale claims, ROADMAP.md still says v3.3.2 and 80 Storybook stories #25919 A; thread: this card's triage comment.objectstack-fleet commentedon Oct 26, 2026
Ruling: batch #397 item 3 · letter A′ · maintainer 「同意」 2026-10-26T13:19Z
Recorded by the director seat (summon #51 continuation,
session_01KrKXQVvgYk2AJ4VkqMobyb, ledger objectstack#12708, brief 6416358883). Letter A′, the seat's variant the maintainer accepted:scripts/changeset-changelog.mjsfolds everyX.Y.Z-next.Nsection into theX.Y.Zsection on the stable cut instead of copying it, with two--self-testcases (a prerelease section folds; a stable section is kept whole); existing CHANGELOG text is not rewritten (#25919 A 「存量不横扫」);CHANGELOG.mdkeeps shipping in the four packages'files— AGENTS.md:711 (Documentation Guardrails) makes the tarball copy the text an upgrading agent greps after install, and that rule stands. Not A/B (dropping the file fromfilescontradicts AGENTS.md:711 without an AGENTS.md change) and not C. Open for a later word, not ruled: trimming the shipped copy to the current major atprepack— a rule change the maintainer would name.Workload of the chosen letter: devx · 1 PR (
scripts/changeset-changelog.mjs+ its self-test), no governed path, nofileschange; precedent #25638's generator fix (read its +/− before sizing).Execution:
needs-user-decision→pm:queuein this act (domain:devx, p2);pm:awaiting-maintainerremoved in the same stroke.Ruling-ref:names this comment;Clause-②: no,Metadata-protocol: none; the dev checks (confidence gap from the card) that no downstream script readsnode_modules/@objectstack/*/CHANGELOG.mdfor a section the fold would rename.objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 2 · 2026-10-26T13:25Z
Session:
session_01Q4MDXRbEJCNdPAP4SiXwp9(devx seat 2) · card threadsession_01PbYqgMPfuTjR2CMEqrjHVLAccount:
os-steveBranch:
claude/project-thread-3p0fdh(the harness-pinned branch of the card thread; it names no issue, so this claim is the identity record; amended on spawn)Worktree:
objectstack-issue-26079Domain:
domain:devxSeat:
domain:devx#2(seat post #20163)File surface:
scripts/changeset-changelog.mjs(the fold) andscripts/release-pending-publish.mjs(its--self-testgains the two cases, because that is the self-test CI runs; widened by the seat on spawn, sincechangeset-changelog.mjshas no CI-run self-test) only; ⛔ nofileschange in any package.json, ⛔ no rewrite of existing CHANGELOG text, ⛔ no workflow change (stop on breach; explain in the report)Container & model: M,
mode:thread,model: default tier (TIER_DEFAULT, from dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6417011624
Premise: holds (ruled A′ in 6417011624;
scripts/changeset-changelog.mjsexists, last touched by #25669; not governed)Serial constraints cleared: no other
Claim:names this file; the ruling keepsCHANGELOG.mdin the four packages'files(AGENTS.md:711)Ruling-ref: 6417011624 (batch #397 item 3, letter A′, maintainer 「同意」)
Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 26079, "status": "done", "branch": "claude/project-thread-3p0fdh", "pr": "https://github.com/objectstack-ai/objectstack/pull/26156", "head": "2f44043a", "session": "session_01PbYqgMPfuTjR2CMEqrjHVL", "premise_still_valid": true, "ruling_ref": "6417011624", "files_changed": ["scripts/changeset-changelog.mjs (+184 -3)", "scripts/release-pending-publish.mjs (+69 -1)"], "line_budget": "257 changed lines (+253 / -4, 2 files) vs the 3000 human-merge threshold: under; precedent #25669 was +331 / -8", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 2f44043a: 33 derived, 33 run, every exit 0 captured before any pipe; --ran: 33 derived, 33 run, 0 NOT-MEASURED, 0 UNRUN. release-pending-publish --self-test: 136 cases across 34 batteries pass (3 new batteries, floor 31 -> 34). check:pm-dispatch-gates fast tier 1917 cases pass. CI families outside the derivation: read from PR #26156 check-runs, in_progress at report time.", "tests": "self-test above; end to end through @changesets/cli 3.0.3 in a throwaway repo (pre enter -> 1.2.0-next.0 -> 1.2.0-next.1 -> pre exit -> 1.2.0): 4 prerelease sections folded in 2 CHANGELOGs, older 1.1.0 / 1.1.0-next.0 byte-identical; control leg with the origin/main 95294be3 generator: 5 sections kept, 37 + 36 lines vs 23 + 22", "confidence_gap": "this repo: CHANGELOG readers count GA or major headings only; hotcrm at 9464673: no script reads node_modules/@objectstack/*/CHANGELOG.md; cloud: NOT MEASURED, not readable from this session", "deviations": [ "file surface widened by the seat on the claim (6417130710) to scripts/release-pending-publish.mjs: changeset-changelog.mjs has no CI-run self-test, so the two cases (plus one wiring battery) live in the self-test lint.yml runs", "the fold runs from a process exit handler of changeset version, because the generator API has no post-write hook; declared in the PR body's Timing section", "no test file names either edited script (git grep over *.test.* / *.spec.* exit 1), so the self-test is the scripts' only suite" ], "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0 GitHub MCP calls (claude-code-remote list_repos and add_repo read-only, for hotcrm)", "api_writes": "3 of 3 — git push of the branch; relay pr_create #26156 (draft, assignee os-steve, label skip-changeset, body read back identical); this os-dev-report comment", "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
devx seat 2 · review: ACCEPT → PR #26156 comment 6418072425 (ruling A′, 6417011624). Landing: ready + merge queue (all checks on the reviewed head green or skipped).
Generated by Claude Code