Repository navigation
feat(spec)!: retire five inert objectstack.manifest.json keys (name, specVersion, skills, scaffold, visibility) - #31064
objectstack-fleet[bot] wants to merge 6 commits into
Conversation
…specVersion, skills, scaffold, visibility) Each is a retiredKey tombstone on TemplateManifestSchema (ADR-0049 enforce-or-remove): nothing read the file's value of any of them, and os package publish read visibility only to warn that it ignores it. publisher and isStarter are left for a maintainer decision. WIP: generated artefacts, docs and changeset follow. Claude-Session: https://claude.ai/code/session_01L9qibz5AiZzgut2WFyXVqW Co-authored-by: Claude <noreply@anthropic.com>
…e manifest retirement Claude-Session: https://claude.ai/code/session_01L9qibz5AiZzgut2WFyXVqW Co-authored-by: Claude <noreply@anthropic.com>
…scoped absence Claude-Session: https://claude.ai/code/session_01L9qibz5AiZzgut2WFyXVqW Co-authored-by: Claude <noreply@anthropic.com>
…roject Its tree-scoped walk reads every objectstack.manifest.json under packages/ and examples/, so it belongs in vitest.repo-tests.json, whose turbo hash moves with those inputs (check:cross-package-test-inputs). Claude-Session: https://claude.ai/code/session_01L9qibz5AiZzgut2WFyXVqW Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 7 package(s): 12 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 8 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 181 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin d612225a19facf86f8151be852edb74705d31764 && git checkout d612225a19facf86f8151be852edb74705d31764
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin cad764d3e2d71210bce48653aa823a3b940071d7 5da9dd3c992a8eebf258e58c3c74543dad86853f && git checkout -B drift-repro cad764d3e2d71210bce48653aa823a3b940071d7 && git merge --no-ff 5da9dd3c992a8eebf258e58c3c74543dad86853f
node scripts/docs-audit/affected-docs.mjs --json cad764d3e2d71210bce48653aa823a3b940071d7
|
|
domain:spec#1 · os-tesla · session_01L9qibzzqHZdAVqgBAvxXKB Contract reviewServed-tier: Inputs read: card #31035 body and all three comments (triage 6694088718, claim 6695659165, dev report 6698579350); PR #31064 body, 41-file list and the net diff against Check-runs at read time — success: Auto Label, Dogfood Regression Gate, Plan Test Core shards, Spec property liveness, Check PR Size, Check Changeset, filter, Governed Surface Queue Guard, Flag docs affected by code changes, Check Documentation Links, PR-body guards. Pending (in_progress, reported as pending, not polled): Test Core 1/8 to 8/8, Build Core, Build Docs, Build UI Deps, Live E2E UI, Type Check (workspace, source gates, consumer gates, debt ledger), Lint (ESLint, docs and code guards, repo and tooling gates, CI/release/engine gates, PM dispatch-gates, three scoped), Scaffold with repo dist. Skipped: UI Published Artifacts, Temporal Conformance, Dogfood Verify CLI, Dogfood Regression Gate shards, Schedule gate, Registry canary, 18.x upgrade harness, Packed-tarball smoke. No check-run has concluded failure. The pending families (build-schemas gate b, the migrate-sentence and rationale-merge pins, the repo-project pin, tsc on the ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgmentEach
Findings:
Implemented-by: VERDICT: PASS |
…lding, not only name rewriteProjectIdentity deleted only `name`, so a template authored before spec 18 would still hand a new project `specVersion`, `skills`, `scaffold`, `visibility` or `category`, which the schema refuses (and publish refuses `visibility` and `category`). One list, RETIRED_TEMPLATE_MANIFEST_KEYS in rewrite-identity.ts, now drives the strip; a test pins it equal to the spec's RETIRED_KEYS_BY_MAJOR rows for TemplateManifest (which is how it picked up `category`, retired in #30980), proves a pre-18 manifest parses after the strip, and pins the call site. check:template-manifests also walks packages/apps, so the three connector manifests are parsed by the gate too. Claude-Session: https://claude.ai/code/session_01L9qibz5AiZzgut2WFyXVqW Co-authored-by: Claude <noreply@anthropic.com>
… subpaths to source The retired-key pin imports both; through dist/ its verdict would follow build state instead of the checkout (check:test-source-alias). Claude-Session: https://claude.ai/code/session_01L9qibz5AiZzgut2WFyXVqW Co-authored-by: Claude <noreply@anthropic.com>
|
domain:spec#1 · os-tesla · session_01L9qibzzqHZdAVqgBAvxXKB Contract reviewServed-tier: Inputs read: card #31035 (no comment newer than the dev report 6698579350); PR #31064 body, 44-file list and the delta diff; the 44 check-runs on Check-runs at read time — success: Auto Label, Dogfood Regression Gate, Plan Test Core shards, Spec property liveness, Check PR Size, filter, Governed Surface Queue Guard, Flag docs affected by code changes, Check Documentation Links, PR-body guards. Pending (in_progress, reported as pending, not polled): Test Core 1/8 to 8/8, Build Core, Build Docs, Build UI Deps, Live E2E UI, Type Check (workspace, source gates, consumer gates, debt ledger), Lint (ESLint, docs and code guards, repo and tooling gates, CI/release/engine gates, PM dispatch-gates, three scoped), Scaffold with repo dist, Check Changeset. Skipped: eight opt-in or push-only families. No check-run has concluded failure. Test Core (where the new create-objectstack pin and the spec repo-project pin run) and Lint (where ① Derived judgments
② Semver levelUnchanged from record 6698836904: ③ Boundary flags
④ Design judgment
Findings:
Implemented-by: VERDICT: PASS |
Requested by Tesla · project thread
Clause-②: no (narrowing) — five authorable keys of
TemplateManifestSchemabecome tombstones, andos package publishrefuses the file'svisibilityby nameMetadata-protocol: narrowed
Skills-docs: none — no
skills/**page teachesobjectstack.manifest.json; the docs pages that did are updated herePart of #31035
维护者速读
objectstack.manifest.json里五个没人读的键(name、specVersion、skills、scaffold、visibility)改成retiredKey()墓碑:tsc 和 schema 解析都按键名拒绝并给出替代做法;os package publish遇到文件里的visibility直接拒绝(指向--visibility),其余四个只警告让作者删除;blank 模板、三个 connector 应用的清单和脚手架不再写这些键;版本同步脚本不再盖specVersion。visibility只被读来警告「我忽略你」。publisher/isStarter有 hotcrm 的服务模式发送链,不在本 PR,等单独的决策卡。os package publish只对visibility拒绝,其他四个继续发布并警告,所以老脚手架项目还能发。hotcrm 的清单和版本测试在它下次升级平台时要删这几个键(与category同一载体)。回滚即 revert。packages/spec/src/marketplace/template-manifest.zod.ts(五个墓碑和提示语);packages/cli/src/commands/package/publish.ts(visibility拒绝 + 四键警告);scripts/sync-template-versions.mjs(去掉specVersion盖章,自测基线重测)。pnpm --filter @objectstack/spec exec vitest run --project repo src/marketplace/template-manifest-inert-keys-retirement.test.ts,预期 12 个用例全绿(逐键拒绝、两条替代指引、publisher/isStarter对照、tsc 墓碑、登记、全树清单扫描)。What changes
TemplateManifestSchema).name,specVersion,skills,scaffoldandvisibilitybecomeretiredKey()tombstones. The schema is non-strict, so a bare delete would strip silently; a tombstone refuses each key at its own path with the prescription`TemplateManifest.<key>` was removed in @objectstack/spec 18 (ADR-0049) — ….visibilitynamesos package publish --visibility;specVersionnamesmanifest.engines.protocol.RETIRED_KEYS_BY_MAJOR[18]rows (marketplace/TemplateManifest:<key>), one D3 semantic entrymarketplace-template-manifest-inert-keys-retirednaming all five, and its STEP18_RATIONALE fragment. No D2 conversion: this file is not a stack collection member (thecategoryprecedent on the same schema), soos migrate metahas nothing to rewrite.template_manifestrows staydeadwith a REMOVED note; thescaffold.*children are removed.publisher/isStarternotes now say they are pending a maintainer decision (hotcrm is a producer).os package publish. A manifest declaringvisibilityis refused before any network call (retiredVisibilityRefusal(), thecategoryshape).name,specVersion,skillsandscaffoldget a non-fatal warning naming them for deletion; the warning list no longer carriesvisibility.name,specVersion,skillsandscaffold; scaffolding strips every retired key (categoryand these five) from the template's manifest viastripRetiredManifestKeysinstead of writingname; the key listRETIRED_TEMPLATE_MANIFEST_KEYSis pinned to the spec'sRETIRED_KEYS_BY_MAJORrows byscaffold-retired-manifest-keys.test.ts.scripts/sync-template-versions.mjsno longer stampsspecVersion; its self-test battery floors are re-measured (Control A 14, Control C 4, Control I now pinsengines.protocolat 9), and the create-objectstack version tests follow.packages/apps/connector-{docusign,github,stripe}/objectstack.manifest.jsondropnameandspecVersion.template-manifest-inert-keys-retirement.test.ts(spec, repo project): refusal per key at its own path with its prescription, the--visibilityandengines.protocolpointers, apublisher/isStartercontrol,@ts-expect-errortsc pins, the ADR-0087 registration (five rows, one D3 entry, no D2 conversion), and a tree-scoped walk of everyobjectstack.manifest.jsonunderpackages/andexamples/(at least 4 found, none declaring a retired key). It is listed invitest.repo-tests.jsonand is aheldBywitness inscripts/cross-package-test-inputs.mjs.check:template-manifests' self-test base drops the retired keys and gains a REDspecVersionfixture. Spec, CLI and create-objectstack fixtures that still wrote the keys are trimmed.engines.protocolonly), marketplace handbook and CLI reference. Thecontent/docs/references/page is regenerated, not hand-edited.@objectstack/specminor,@objectstack/climinor,create-objectstackpatch, with both declaration lines, the BREAKING banner, the FROM → TO list and the adr-0087 marker.Why
ADR-0049 enforce-or-remove. Measured on
origin/main115a43a (per-key table on #31035): no reader of the file'sname,specVersion,skillsorscaffoldexists in the CLI, create-objectstack or hotcrm; create-objectstack wrotenameand never read it back, the protocol check reads the artifact'sengines.protocol, and the skills install is the whole catalog.os package publishreadvisibilityonly to warn that it ignores it.Verification
All runs on head
4f2f3c85in a dedicated worktree, baseorigin/main115a43ad, except where the rework block below says5da9dd3c.Rework on
5da9dd3c(contract-review should-fix, commits073cd355+5da9dd3c): create-objectstackvitest runTest Files 25 passed (25), Tests 374 passed (374),pnpm typecheck:: exit 0;dispatch-gates --commands136 derived, 136 run, 0 NOT-MEASURED, all exit 0 (record/mnt/project-files/spec-seat-1/r2026-11-06/out/31035-gates-ran-5da9dd3c.list). Ablations restored after each: the call site back todelete m.name→ 1 red; droppingcategoryfrom the list → 2 red;specVersionadded to connector-github's manifest →check:template-manifestsexit 1.Tests
pnpm --filter @objectstack/spec test(local project): Test Files 820 passed (820), Tests 25908 passed, 1 todopnpm --filter @objectstack/spec test:repo(repo project, which now carries the new pin): Test Files 91 passed (91), Tests 1551 passed (1551)pnpm --filter @objectstack/spec check:test-typecheck:: exit 0;check:generated:: exit 0 after a declaration buildvitest run: Test Files 24 passed (24), Tests 369 passed (369);pnpm typecheck:: exit 0@objectstack/cliunit project: Test Files 396 passed (5 of them re-run after a declaration build; their first local run was red on a dts-less build, not on the diff),pnpm typecheck:: exit 0packages/apps/connector-{docusign,github,stripe}pnpm test(objectstack validate && vitest run): 28, 14 and 20 tests passednode scripts/sync-template-versions.mjs --self-test:: exit 0, 44 assertionsThe CLI, create-objectstack and connector runs are on
58b292e7;4f2f3c85only adds the new test's path topackages/spec/vitest.repo-tests.json.Ablations
Through
scripts/ablation-replace.mjs, each restored to the committed blob afterwards:publish.tsdisabled (if (false && …)): 1 test red (the retired visibility › refuses …); restored, green.specVersiontombstone swapped back toz.string().optional(): 2 tests red (refusal at its own path; theengines.protocolprescription); restored, green.Derived gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 134 families for the 41-path change set; all 134 ran with exit 0.--ranreconciliation: 134 derived, 134 run, 0 NOT-MEASURED, 0 UNRUN. One finding on the first pass, fixed in4f2f3c85:check:cross-package-test-inputsasked for the new tree-walking test to be listed invitest.repo-tests.json. Four first runs answered exit 3 (prerequisite, nothing measured) and were re-run green after the prerequisite:check-plugin-teardown-shape --self-test(pinned fixture commit fetched),check:skill-examples,check:dual-build-cjs-loadsandcheck:i18n-coverage(declaration build of./packages/*and./packages/*/*).check-platform-checklist --changed-from origin/main:: exit 0 (no anchored file in the change set). Record:/mnt/project-files/spec-seat-1/r2026-11-06/out/31035-gates-ran-4f2f3c85.list.Dogfood: full battery on
4f2f3c85(pnpm --filter @objectstack/dogfood test, no shard, closure built first, under the verify lock): Test Files 429 passed, 3 skipped (432); Tests 3569 passed, 41 skipped (3610); lock VERDICT command-exit 0.Acceptance notes
publisherandisStarterare excluded, pending their own decision card: hotcrm'sscripts/lib/marketplace-listing.mjs#packageUpsertBodysends both from its manifest in service mode, so their fate is a maintainer decision. The control case in the new test holds that this PR did not take them.category). hotcrm'sobjectstack.manifest.jsonstill writesname,specVersionandskills, and itstest/docs-declared-versions.test.tsandtest/marketplace-listing.test.tsparse or stamp them; both go red on the first hotcrm bump to a spec carrying this change.os package publish(every project scaffolded from the blank template before this release carries them); onlyvisibilityrefuses.check:template-manifestsnow walks create-objectstack's templates andpackages/apps/*(a zero-file guard per root; 4 manifests parsed), so the three connector manifests are gated bycheck:generatedtoo. The new test's tree-scoped walk also covers them and is registered as aheldBywitness inscripts/cross-package-test-inputs.mjs..github/workflows/release.ymlstill has a comment mentioning the manifest stamp. It is a governed file, so it is left for a maintainer edit; nothing executes it.Metadata-protocol: none; a tombstone isnarrowed, declared here per the seat's ruling.Human Minimum
packages/specholds no runtime logic.pnpm lintpasses (CI-owned).main, one pull request.packages/spectouched: its generated artifacts are regenerated and committed.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_01L9qibz5AiZzgut2WFyXVqW