Repository navigation
skills(objectstack-upgrade, catalog READMEs): the upgrade playbook gains the 17→18 skills step and the two READMEs teach the scaffolder's pinned --copy sync (ruling A on #22649, second pass) #23276
Description
Filing gate ③ a task the maintainer directed. The maintainer, in the skills seat's session chat on 2026-10-13: 「评估升级到 v18 之后 ,skills 官方应该从 npm 安装,模版项目的 skills 安装流程,文档相关的说明应该如何修正」, and on the seat's evaluation: 「评估里两张卡同意立」. Filed by domain:skills seat 1 (seat post #7623, session_013zGKMG1cRedVzWtqGGGZW9, huangyiirene). Ruling-ref: 6096124407 (ruling A on #22649). ⛔ Not a claim.
Reader who acts: this lane's seat, once PR #23248 (#22659) is on main — the pinned command spelling is that PR's. Surface: skills/objectstack-upgrade/SKILL.md (published, Tier H; read its token headroom at dispatch with node scripts/check-skills-token-ratchet.mjs — an added step is paid under the ratchet, ⛔ no ceiling raise), skills/README.md (ships inside @objectstack/skills; Tier H), packages/skills/README.md. ⛔ No content/docs/** — that is the devx lane's sibling card, filed in the same act.
Why (measured on origin/main afbf960c, 2026-10-13)
skills/objectstack-upgrade/SKILL.mdhas no step for the skills themselves:grep -n -iE 'skills (add|sync|install)|@objectstack/skills|\.claude/skills' skills/objectstack-upgrade/SKILL.md→ 0 lines (positive control:grep -c 'os migrate meta' skills/objectstack-upgrade/SKILL.md→ non-zero). An agent running the upgrade playbook moves the metadata and the packages and leaves the 17.x-era skill text in.claude/skills/; a 17.x project's skills came fromskills add(GitHubmain), theirskills-lock.jsonentries readsourceType: github, andexperimental_syncskips them withSkipped … installed with skills add, exit 0 (PR feat(create-objectstack): a scaffolded project installs its skills from @objectstack/skills at its spec version, never from GitHub main (#22659) #23248's measurement).skills/README.md:12andpackages/skills/README.md:31teach the linked sync (npx skills experimental_sync --agent claude-code -y), unpinned and without--copy; the scaffolder (PR feat(create-objectstack): a scaffolded project installs its skills from @objectstack/skills at its spec version, never from GitHub main (#22659) #23248) runsnpx -y skills@1.7.2 experimental_sync --agent claude-code --copy -y, and theAGENTS.mdit writes says to keep--copy. In a committed project the linked form leaves dangling links after a clone (PR feat(create-objectstack): a scaffolded project installs its skills from @objectstack/skills at its spec version, never from GitHub main (#22659) #23248's measurement: 6 links, 0SKILL.md).
What done looks like
- The upgrade skill's preflight (or its acceptance section) gains one step for the skills: remove the GitHub-installed catalog (
npx skills removeof the tenobjectstack-*skills, or--allwhen only this catalog was installed), install@objectstack/skillsat the installed spec's version, run the pinned sync with--copy; the step says why in one sentence (the lock'ssourceType: githubmakes the sync skip them). Lines are paid under the token ratchet; the PR body reports the whole-file and whole-package before/after token readings. - Both READMEs give the scaffolder's exact spelling (pinned CLI,
--copy), read frompackages/create-objectstack/src/skills-install.tson the tree at dispatch; the linked form is dropped, or kept as one sentence for a project that does not commit its skills. check:skill-compatibility,check:skill-docs,check:skill-refs,check:skills-token-ratchet,check:published-readme-links,check:published-readme-exportsgreen (the generated index block ofskills/README.mduntouched); changesetpatchfor@objectstack/skills(its README and the catalog text ship in the tarball).- Tier H (
skills/**): the PR stays draft with the 速读 draft; the seat requests review from the approvers.
Workload: S; precedents PR #23232 (the two READMEs) and PR #22846 (one automation SKILL.md edit within headroom).
四维(业务立场)
- 长远合理性:升级手册与安装说明都只写终态——技能是随
@objectstack/*一起装、一起升的包。 - 实际业务拉动:17.x → 18 的升级者按今天的 upgrade 技能走完,
.claude/skills/里仍是 17.x 的技能文本,且 sync 静默跳过(实测)。 - 防 AI 犯错:先 remove 再 sync,无静默跳过;
--copy无悬空链接;README 与 scaffolder 一种拼写。 - 创业阶段不扩散:一步、一句、一种拼写;不加门禁。
Dedupe: REST listing labels=domain:skills&state=all&since=2026-09-20 (252 cards) and labels=domain:devx&state=all&since=2026-09-20 (278 cards), grepped for --copy|experimental_sync|skills install|upgrade skill|objectstack-upgrade|upgrading.mdx|install the catalog|skills add → 17 and 9 hits; #22123 and #22120 (closed) fixed other upgrade-skill sentences, #22668 (closed) was the first docs pass; none adds the skills step or the --copy spelling. Dedupe words: objectstack-upgrade skills step · README --copy · skills@1.7.2 pin · catalog reinstall on a major upgrade.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 13, 2026
Unlock scan:
pm:blocked→pm:queue· skills seat 1 (session_013zGKMG1cRedVzWtqGGGZW9, huangyiirene) · 2026-10-13T14:17ZBlocked-by: #22659closed at 2026-10-13T12:48Z: PR feat(create-objectstack): a scaffolded project installs its skills from @objectstack/skills at its spec version, never from GitHub main (#22659) #23248 merged at610d0c6a—create-objectstackdepends on@objectstack/skillsat the spec's version and runsnpx -y skills@1.7.2 experimental_sync --agent claude-code --copy -y; the pinned spelling this card copies is onmaininpackages/create-objectstack/src/skills-install.ts.Unlock-action: re-check PR #23248is spent; both lines leave the body in the stroke that follows.main) — on every objectui PR, or on an objectstack schedule and before each release? #23238, skills(pm-dispatch): a text-only DELIBERATE CORRECTION is confirmed by the seat's ACCEPT quoting before/after; the second same-head subagent review is dropped for that class (#23177 ruling B, item 4) #23201, skills(objectstack-automation): SKILL.md still teaches{$User.<path>}as a kept value-slot spelling and the text-slot run-user remedy through it, which #19939 pass 2 (PR #22563) refuses #22585), so the claim comes at the next free slot.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Pointer: the remove list needs 11 names, not 10 ·
domain:devxseat 1 ·session_012zwsLMxQBwHUYJgPyrpEvx· 2026-10-13T15:10ZThis is information for this card's dispatch, not a claim. It comes from #23275's docs pass (PR #23295, accepted in 6148685432). That pass measured something this card's step 3 relies on.
objectstack-pm-dispatchwas in the catalog in the@objectstack/spec17.0.0–17.4.0 trees, and is absent from 17.5.0 on.skills add … --allagainstmain, so their projects got it.npx skills remove … -yprintedFound 11/removed 10.objectstack-pm-dispatchwas still in.claude/skills/,.agents/skills/andagent/skills/, along with itsgithublock entry.content/docs/upgrading.mdxstep 4, and the same list inreleases/v18/index.mdx):npx skills remove objectstack-ai objectstack-api objectstack-automation objectstack-data objectstack-formula objectstack-i18n objectstack-platform objectstack-pm-dispatch objectstack-query objectstack-ui objectstack-upgrade -yOn a ten-skill project, the name that isn't installed is skipped and the command exits 0. So one list covers both 17.x project shapes.
--all, so they read the same as the site.objectstack-fleet commentedon Oct 14, 2026
Claim: PM loop round 2
Session:
session_013zGKMG1cRedVzWtqGGGZW9Account:
huangyiirene(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-23276-upgrade-skill-skills-stepWorktree:
objectstack-issue-23276Domain:
domain:skillsSeat:
domain:skills#1File surface:
skills/objectstack-upgrade/SKILL.md(one skills step in §0 Preflight or §3 Acceptance; token headroom 8 of 6188 at dispatch — paid by deletion in the same file, ⛔ no ceiling raise),skills/README.md(lines 11–12 and thenextchannel paragraph; the generated index block untouched),packages/skills/README.md(lines 28–31 and theskills addparagraph at 50–52), one.changeset/23276-*.md(@objectstack/skillspatch). ⛔ Nocontent/docs/**(#23275, devx, landed as PR #23295), ⛔ nopackages/create-objectstack/**(the spelling is read from there, not changed). (stop on breach; explain in the report)Container & model:
Streated asM(three published files whose judgment sits in the wording and the ratchet payment),mode:subagent,model: CONTRACT_REVIEW_TIER — --tier on 228357ab69 for the three paths: "MANDATORY: claude-fable-5-1 (derived from the file surface, not recalled)" — skills/** carries no one-line exemption; reason: mandatory clause ①Clause-②: no
Responsibility:
n/a — not a defect cardThread-read: 6148721272
Serial constraints cleared:
no open PR touches skills/objectstack-upgrade/**, skills/README.md or packages/skills/README.md (7 open fleet PRs scanned by file list; PR #23232 on the two READMEs merged as 197fbe2c04 on 2026-10-13); pm:dispatched ∩ domain:skills = #23238 and #22585 (skills/objectstack-automation, skills/objectstack-query) — disjoint; PR #23248 (#22659) is on main (the unlock scan 6147644172 moved this card to pm:queue), so the scaffolder spelling is readable from packages/create-objectstack/src/skills-install.ts on mainReadings (open PR file lists, lane inventory,
--tier, ratchet, churn) taken 2026-10-14T01:12Z; claim written 2026-10-14T01:23Z.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{ "issue": 23276, "status": "done", "branch": "claude/issue-23276-upgrade-skill-skills-step", "pr": "https://github.com/objectstack-ai/objectstack/pull/23366", "head": "441106662ae0de388631131941b41e90a86838a6", "base_at_branch_creation": "e790cfc5032fb36aa9395eb288dffa26d865a042", "merged_origin_main": "18cd410dc4", "session": "session_013zGKMG1cRedVzWtqGGGZW9", "premise_still_valid": true, "summary": "skills/objectstack-upgrade/SKILL.md §0 Preflight gains one step, placed after the upgrade branch and .upgrade/ exist: remove the eleven objectstack-* skills a 17.x project's `skills add` installed (the devx pointer's list, copied byte for byte from content/docs/upgrading.mdx:108-110; the prose names 'a missing name is skipped' and `--all` when they are the project's only skills), install @objectstack/skills at the installed spec's version, and copy it with `npx skills@1.7.2 experimental_sync --agent claude-code --copy -y` — the scaffolder's spelling read from packages/create-objectstack/src/skills-install.ts lines 102/119/127/131 (RUNS `npx -y skills@1.7.2 …`, PRINTS `npx skills@1.7.2 …`); the one 'why' sentence names the lock's `sourceType: github` and the exit-0 skip. The step (815 bytes, ~204 tokens, +16 lines) is paid by six same-file deletions of restated sentences (each named with its home in the PR body): 6180 → 6172 tokens of 6188, 485 → 484 lines. skills/README.md and packages/skills/README.md replace the unpinned linked sync with that pinned --copy spelling and say why --copy (+2 lines each, at the claim's budget); the generated index block is byte-identical. One patch changeset for @objectstack/skills. Draft PR #23366 opened with the closing line for this card on line 1, Clause-②: no, the 速读 draft, the token table and the gate exits; Tier H, awaiting an authorized APPROVED review.", "files_changed": [ ".changeset/23276-upgrade-skill-skills-step.md", "packages/skills/README.md", "skills/README.md", "skills/objectstack-upgrade/SKILL.md" ], "line_budget": { "skills/objectstack-upgrade/SKILL.md": { "before": 485, "after": 484, "net": -1, "claim_budget": "net lines at most +6" }, "skills/README.md": { "before": 128, "after": 130, "net": 2, "claim_budget": "net lines at most +2" }, "packages/skills/README.md": { "before": 74, "after": 76, "net": 2, "claim_budget": "net lines at most +2" } }, "token_readings": { "convention": "ceil(utf8 bytes / 4), the ratchet's; a stamped SKILL.md excludes its release-stamp line (27 bytes); before = origin/main e790cfc503 (branch base), after = head 441106662a; READMEs measured as ceil(bytes / 4) since neither is in the ratchet's population", "skills/objectstack-upgrade/SKILL.md": { "before": { "bytes": 24746, "tokens": 6180, "ceiling": 6188, "headroom": 8 }, "after": { "bytes": 24715, "tokens": 6172, "ceiling": 6188, "headroom": 16 }, "step_cost_bytes": 815, "paid_by_six_same_file_deletions_bytes": 846, "ceiling_moved": false }, "skills/README.md": { "before": { "bytes": 8322, "tokens": 2081 }, "after": { "bytes": 8506, "tokens": 2127 }, "ratcheted": false }, "packages/skills/README.md": { "before": { "bytes": 4024, "tokens": 1006 }, "after": { "bytes": 4224, "tokens": 1056 }, "ratcheted": false, "under_skills_tree": false }, "whole_package_ratcheted_authored_54_files": { "before": 144089, "after": 144081, "ceiling_sum": 154888 }, "whole_package_bundle_total_64_files": { "before": 155052, "after": 155044 }, "all_skill_md_10_files": { "before": { "bytes": 210600, "lines": 4409 }, "after": { "bytes": 210569, "lines": 4408 } } }, "tests": "No test or typecheck script exists in @objectstack/skills (scripts: build, prepublishOnly; a zero-match --filter run would exit 0 having run nothing, so none is cited). Step ① closure empty (no workspace dependencies). `pnpm --filter @objectstack/skills build` under os-verify-lock.sh: `VERDICT command-exit 0 · held the lock 1s`, output `65 file(s) across 10 skill(s) copied from skills/** into dist/skills and read back byte-identical`; `cmp skills/README.md packages/skills/dist/skills/README.md` identical; `cmp` of the SKILL.md against its dist copy identical. Gate sweep below ran on head 441106662a after merging origin/main (18cd410dc4); every exit captured as `cmd > log 2>&1; EXIT=$?`. No ablation or reverse verification applies (prose and a changeset; no gate, test or runtime path whose verdict the diff could move). Eslint narrowed and measured: `eslint --no-inline-config --format json` over the 4 files → 4 results, 0 errors, each `File ignored because no matching configuration was supplied`; eslint.config.mjs:328 states no type-aware linting, so no untouched file's verdict moves.", "gates": { "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths; change set from the merge base) at 441106662a → 68 commands; the same 68 derived on f88e80d981 (that run printed STALE TREE: origin/main 3 commits ahead, package.json among the moved files; merged and re-derived)", "ran_reconciliation": "✓ dispatch-gates --ran: 68 derived famil(ies) accounted for — 66 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3). 0 UNRUN. Outside this card's derivation (3): check:skill-refs, check:published-readme-exports, check:published-readme-links", "derived_exit_0": [ "node scripts/check-adr-0087-registration.mjs --base origin/main", "node scripts/check-adr-0087-registration.mjs --self-test", "node scripts/check-changeset-no-major.mjs --base origin/main", "node scripts/check-changeset-no-major.mjs --self-test", "node scripts/check-ci-filter-parity.mjs", "node scripts/check-closing-keyword-parity.mjs", "node scripts/check-closing-keyword-parity.mjs --self-test", "node scripts/check-comment-mask-adoption.mjs", "node scripts/check-comment-mask-adoption.mjs --self-test", "node scripts/check-comment-mask-corpus.mjs", "node scripts/check-doc-route-spelling.mjs --advisory", "node scripts/check-doc-route-spelling.mjs --self-test", "node scripts/check-dts-emitted.mjs --self-test", "node scripts/check-empty-changeset.mjs --base origin/main", "node scripts/check-empty-changeset.mjs --self-test", "node scripts/check-issue-citations.mjs", "node scripts/check-keyed-text-bounds.mjs", "node scripts/check-keyed-text-bounds.mjs --self-test", "node scripts/check-platform-object-tenancy-census.mjs", "node scripts/check-platform-object-tenancy-census.mjs --self-test", "node scripts/check-plugin-teardown-shape.mjs", "node scripts/check-plugin-teardown-shape.mjs --self-test", "node scripts/check-registry-log-declared.mjs", "node scripts/check-registry-log-declared.mjs --self-test", "node scripts/check-rest-log-spy-declared.mjs", "node scripts/check-rest-log-spy-declared.mjs --self-test", "node scripts/check-skills-token-ratchet.mjs", "node scripts/check-skills-token-ratchet.mjs --self-test", "node scripts/check-system-context-census.mjs", "node scripts/check-system-context-census.mjs --self-test", "node scripts/check-undeclared-dep-imports.mjs", "node scripts/check-undeclared-dep-imports.mjs --self-test", "node scripts/docs-audit/check-affected-docs.mjs", "node scripts/docs-audit/check-drift-comment.mjs", "node scripts/pm/release-rehearsal-clone.mjs --self-test", "node scripts/release-pending-publish.mjs --self-test", "pnpm --filter @objectstack/lint run check:doc-formula-expressions", "pnpm --filter @objectstack/spec run check:skill-docs", "pnpm check:agent-test-spelling", "pnpm check:changeset-gate-self-tests", "pnpm check:corpus-claim-drift", "pnpm check:cross-package-test-inputs", "pnpm check:doc-authoring", "pnpm check:driver-memory-census", "pnpm check:gitlink-declared", "pnpm check:issue-citations", "pnpm check:lean-entry-closure", "pnpm check:merge-driver", "pnpm check:nul-bytes", "pnpm check:objectui-changeset", "pnpm check:org-identifier", "pnpm check:page-declaration-shape", "pnpm check:pm-changeset-deadline-census", "pnpm check:pm-governed-merges", "pnpm check:pm-skill-id-lint", "pnpm check:published-files", "pnpm check:refd-timer-probe", "pnpm check:role-word", "pnpm check:skill-compatibility", "pnpm check:skill-frame-sync", "pnpm check:skill-identifier-liveness", "pnpm check:slot-lookup", "pnpm check:sourcemap-no-sources-content", "pnpm check:test-source-alias", "pnpm check:tier-file-adoption", "pnpm check:watch-hint-literal" ], "derived_not_measured_exit_3": { "pnpm check:dts-closure": "PREREQUISITE NOT MET — reads every package's built dist; turbo dry run reads 82 of 83 build tasks as cache MISS; the full build does not fit a foreground call on the shared box; this diff changes no source, exports or type entry; declared to CI (Lint & Repo Gates)", "pnpm check:dual-build-cjs-loads": "same prerequisite and declaration" }, "outside_derivation": { "pnpm check:published-readme-links": "exit 0 — 226 outbound link(s) across 104 published markdown file(s): 0 root-relative, 0 non-canonical origin(s), 28 docs-site page(s) resolved, 2 anchor(s) verified, 144/144 relative target(s) found", "pnpm check:published-readme-exports": "exit 3 — PREREQUISITE NOT MET: 48 package(s) whose built type entry this run would read are not built; NOT MEASURED locally, declared to CI; neither README carries an import (fenced blocks are sh/bash commands)", "pnpm --filter @objectstack/spec run check:skill-refs": "exit 0 — 9 generated files in sync with packages/spec" }, "card_named": { "pnpm check:skill-compatibility": "exit 0 — 11 pinned major(s) all match the workspace (@objectstack/spec is 18.x); 10 metadata.version stamp(s) all equal 18.0.0-next.0", "pnpm --filter @objectstack/spec run check:skill-docs": "exit 0 — ✓ skills/README.md · ✓ content/docs/ai/skills-reference.mdx · Skill docs in sync (generated index block untouched); git status clean after", "pnpm --filter @objectstack/spec run check:skill-refs": "exit 0", "node scripts/check-skills-token-ratchet.mjs": "exit 0 — skills/objectstack-upgrade/SKILL.md is 6172 tokens (ceiling 6188; headroom 16); 54 authored bundle file(s) within their ceilings", "pnpm check:published-readme-links": "exit 0", "pnpm check:published-readme-exports": "exit 3 — NOT MEASURED (prerequisite), see above" }, "changeset": { "node scripts/check-empty-changeset.mjs --base origin/main": "exit 0 — 1 declaring changeset(s) added; no base changeset modified or deleted", "node scripts/check-changeset-no-major.mjs --base origin/main": "exit 0", "node scripts/check-adr-0087-registration.mjs --base origin/main": "exit 0 — this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)", "pnpm check:changeset-gate-self-tests": "exit 0", "pnpm check:pm-changeset-deadline-census": "exit 0", "pnpm check:published-files": "exit 0", "skip-changeset": "not applied — README and catalog text ship in the tarball (files: dist, README.md, CHANGELOG.md)" }, "verify_lock_runs": { "pnpm --filter @objectstack/skills build": "VERDICT command-exit 0 · held the lock 1s · waited 0s", "pnpm turbo run build --filter='@objectstack/lint...' --filter='@objectstack/objectql...' --concurrency=2": "VERDICT command-exit 0 · 14 successful, 14 total · 2m18s · held 139s · waited 0s — after it, check:doc-formula-expressions and check:lean-entry-closure re-ran from exit 3 to exit 0" }, "bytes": { "control_char_grep_4_files": "grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]' → exit 1, 0 hits", "pnpm check:nul-bytes": "exit 0 — scanned 11340 text file(s); no raw ASCII control bytes", "html_comments_added": 0 }, "not_a_measurement": "pnpm check:changeset-no-major → exit 254 (ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL: no such script) — a wrong spelling, not a red; the derived spelling node scripts/check-changeset-no-major.mjs --base origin/main exit 0 is the reading" }, "mcp_calls": "0 — no MCP GitHub tool was called; GitHub reads were `gh api` GETs (issue 23276, its comments, PR bodies 22846 and 23232); writes went through git push and the fleet-write relay", "api_writes": "5 — git push x3 (empty probe branch; f88e80d981; merge 441106662a — not REST), relay pr_create x1 (POST /repos/objectstack-ai/objectstack/pulls draft + POST /repos/objectstack-ai/objectstack/issues/23366/assignees [huangyiirene], via fleet-write dispatch), relay comment x1 (POST /repos/objectstack-ai/objectstack/issues/23276/comments — this report). 0 label writes, 0 PATCH, 0 direct REST writes", "deviations": [ "The step cost ~204 tokens (815 bytes), not the card's 60–100: the eleven-name list alone is 234 bytes. Paid by six same-file deletions (each a restated sentence, named with its home in the PR body), not one or two; ceiling not moved; net −8 tokens, −1 line.", "Three gates NOT MEASURED locally (exit 3 PREREQUISITE NOT MET): check:dts-closure and check:dual-build-cjs-loads (derived) and check:published-readme-exports (card-named, outside the derivation). Prerequisite is every package's dist on a cold cache (82/83 MISS); declared to CI in the PR body and here. The card's done-criterion names published-readme-exports green; CI measures it.", "origin/main (18cd410dc4) merged into the branch before the sweep because the first derivation flagged STALE TREE; main brought 37 files, none overlapping the four; the derived list was identical before and after.", "pnpm check:changeset-no-major was run once by a wrong spelling (exit 254) before the derived spelling; recorded as not a measurement.", "The harness attribution reminder names a model in its Co-Authored-By line; the commit carries AGENTS.md's model-free trailer pair instead (AGENTS.md takes precedence per the reminder's own clause). The harness wrote no trailer of its own.", "Both README line budgets are used in full (+2 and +2); the eleven-name list therefore lives only in the SKILL.md step, while packages/skills/README.md keeps its existing `--all` / name-the-objectstack-* sentence (the pointer's `--all` alternative)." ], "mechanism_assumptions_tested": [ "Scaffolder spelling — confirmed: skills-install.ts header (lines 21, 31) and code (102 SKILLS_CLI='skills@1.7.2'; 119 skillsSyncArgs; 127 SKILLS_INSTALL_COMMAND = `npx -y …`; 131 skillsInstallHint = `npx …`) agree; the texts carry the printed form, as upgrading.mdx:97,112 and skills-reference.mdx:24 do.", "READMEs — confirmed: skills/README.md:11–12 and packages/skills/README.md:28–31 carried the unpinned linked sync; packages/skills/README.md:49–53 already tells the scaffolded-project reader to `skills remove --all` or by name. The edit is the spelling change plus the why-`--copy` sentence; smaller than the card assumed, as predicted.", "SKILL.md has no skills step — confirmed: the card's grep → 0 lines (exit 1); positive control `grep -c 'os migrate meta'` → 21.", "Step cost 60–100 tokens — falsified: ~204 tokens with the eleven names; six deletions, not one.", "check:published-readme-links / -exports as derived families for these paths — falsified: neither is among the 68 derived; both run as outside-derivation extras (0 / 3).", "Same-day churn — confirmed: both READMEs last changed by 197fbe2c04 (PR #23232); the claim's line numbers held on main." ], "open_questions": [], "out_of_scope_findings": [ "carrier: the next PR that edits skills/objectstack-upgrade/SKILL.md · noted, not filed (no class a/b/c evidence) — §0 pins 'down to the chain's support floor, 16 today' while the same skill's §2.1 forbids carrying a remembered number and its snippet already prints spec-changes.json's supportFloor; this PR did not spend the ratchet on it.", "carrier: the Version Packages release that bumps create-objectstack above 18.0.0-next.0 · noted, not filed — packages/skills/README.md 'Through 18.0.0-next.0 the scaffolder installs … with skills add' and skills-reference.mdx:31's matching sentence are true of every published scaffolder today and go stale on that release (PR #23248 is on main, unreleased)." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
✅ ACCEPT · PR #23366 at
441106662a(Fixes #23276) — Tier H, draft stays; the maintainer's approval lands itSkills seat 1 (
session_013zGKMG1cRedVzWtqGGGZW9, huangyiirene), written 2026-10-14T02:21Z. Report 6159271277 read; everything below is verified on GitHub and the tree, not on the report.main; line 1Fixes #23276is the body's only closing keyword (the other numbers in the body carry no closing verb);Clause-②: noat line start; four files, +50/−36, two commits (the edit, then a merge oforigin/main18cd410dc4);.changeset/23276-upgrade-skill-skills-step.md"@objectstack/skills": patch;check-governed-merges --pr 23366→skills/**, Tier H, 86 changed lines; noskip-changeset(the texts ship in the tarball).## Contract reviewPASS record on the PR for this head (the skill text and the catalog README are a governed face): the step's eleven-name list is byte-identical tocontent/docs/upgrading.mdx:108–110, its sync line is the scaffolder's printed form (skills-install.ts:102,119,131), the two READMEs carry the same pinned--copyspelling with one sentence of why, and each of the six ratchet deletions has its home phrase present on the head (read one by one) with no hit in the skill'sreferences/orevals/.main18cd410dc4and the head):upgrading.mdx:106–117(the list and the two facts beside it);skills-install.ts:100–133(SKILLS_CLI,skillsSyncArgs,SKILLS_INSTALL_COMMAND,skillsInstallHint);skills-reference.mdx:24; headSKILL.md484 lines, home phrases "Upgrade to the floor by an older route first", "Pass--write, or port the printed edits by hand", "Diff against--out", "OneconversionIdper commit", "keeps compiling while readingundefined", "Exercise the path for real", "Pre-existing findings are not this upgrade", "green is necessary and not sufficient", "all four, not three" → 1 hit each; the six deleted phrases → 0 hits underskills/objectstack-upgrade/referencesandevals.441106662a: 40 check-runs — 34success, 6skipped, none red;Lint & Repo Gates(the token ratchet,check:skill-docs,check:skill-refs,check:skill-compatibility, the published-README gates run inside it),TypeScript Type Check,Test Core(six shards) andCheck Changesetsuccess; the skips (Build Docs,Console Pin Gate,Dogfood Regression Gate (${{ matrix.shard }}/3),Dogfood Verify CLI,Packed-tarball smoke (opt-in),Temporal Conformance (live PG + MySQL)) are the full-battery names on the expected-skips roster.@objectstack/skillson a 17.x → 18 move; both READMEs give the scaffolder's pinned--copysync) — matches the diff; paragraph 1 (why:skills add→sourceType: github→ the sync skips, exit 0; what the step does: remove the eleven, install at the spec's version, copy with the pinned command; paid under the ratchet, ceiling unchanged) — matches the step and the readings table; paragraph 2 (the two READMEs replace the unpinned linked sync and say why--copy) — matches both README hunks. No sentence claims what the diff does not do.Lint & Repo Gatesgreen on the head runs them);origin/mainmerged on the stale-tree flag (same 68 derived commands); the README budgets used in full; one wrong-spelling gate invocation recorded as not a measurement. Reads the dev took throughgh api(the card, its comments, two precedent PR bodies) are reads git cannot answer; noted, no finding.--allprimary (the seat keeps the eleven — the site's spelling); a# 0 · preflightQuickstart line for the step (~15 tokens; the seat keeps the Quickstart as is).18.0.0-next.0" sentences inpackages/skills/README.mdandskills-reference.mdx:31→ the Version Packages release that publishes PR feat(create-objectstack): a scaffolded project installs its skills from @objectstack/skills at its spec version, never from GitHub main (#22659) #23248's scaffolder.needs-user-decisionon the PR; the final 维护者速读 comment on the PR (席位意见 filled); review requested from the governed approvers. The PR stays draft and is never flipped or enqueued by a seat; on an authorized approval this seat lands it through the relay and confirms MERGED from the queue ref andorigin/main.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Landed · PR #23366 MERGED —
pm:dispatchedleaves this closed cardSkills seat 1 (
session_013zGKMG1cRedVzWtqGGGZW9, huangyiirene), written 2026-10-14T02:45Z.GET /pulls/23366→merged: true,merged_by: os-zhuang,merged_at2026-10-14T02:43:11Z;origin/maincontains713f231854cfbb115179096b2af1971afff14dbc(the queue's merge of head441106662a); the queue refpr-23366is gone. Path: report 6159271277 → contract review PASS 6159337327 and final 维护者速读 6159344491 on the PR, ACCEPT 6159458961 here, review requested from the governed approvers;os-zhuangAPPROVED at 2026-10-14T02:23:38Z and flipped and enqueued the PR by hand.completedby the body'sFixes #23276at the merge;pm:dispatchedremoved in this act. Closed-since scan overdomain:skillswithsince=set to 2026-10-14T02:40Z: skills(objectstack-upgrade, catalog READMEs): the upgrade playbook gains the 17→18 skills step and the two READMEs teach the scaffolder's pinned --copy sync (ruling A on #22649, second pass) #23276 (and C3 #15204 ADR sweep: ten ADRs cite the four catalog row objects that stage 8 retires; record the retirement per the ADR convention after stage 8 (governed, Tier H) #22978 at 02:37Z by its own PR) — no stray closure.main:skills/objectstack-upgrade/SKILL.md§0 Preflight re-installs the catalog from@objectstack/skillson a 17.x → 18 move (the eleven-namenpx skills remove … -y, the install at the installed spec's version,npx skills@1.7.2 experimental_sync --agent claude-code --copy -y), paid by six same-file deletions (6180 → 6172 tokens, ceiling 6188);skills/README.mdandpackages/skills/README.mdcarry the scaffolder's pinned--copyspelling;@objectstack/skillspatch changeset. This completes the maintainer's 「评估里两张卡同意立」 pair with docs(skills install): the end state after create-objectstack installs @objectstack/skills — one pinned spelling with --copy, one next.0 exception, and the 17→18 skills step in the upgrade guide (ruling A on #22649, second docs pass) #23275 (devx, PR docs(skills): the end state after create-objectstack installs @objectstack/skills — one pinned --copy spelling, one next.0 exception, and the 17.x to 18 skills step (#23275) #23295).18.0.0-next.0" sentences inpackages/skills/README.mdandskills-reference.mdx:31— the Version Packages release that publishes PR feat(create-objectstack): a scaffolded project installs its skills from @objectstack/skills at its spec version, never from GitHub main (#22659) #23248's scaffolder; the two reviewer-decidable wordings (eleven names vs--allprimary; a Quickstart line) were approved as they stand.713f231854,check-harness-currentCURRENT.Generated by Claude Code