Skip to content

skills(objectstack-data): two published lines say os migrate meta --from 16 strips retired keys "automatically", but the default run writes no source and --write strips only the sites it can prove #22144

Closed

Description

@objectstack-fleet

Filing gate: ① a product defect with a named landing site. Published skill text is false of the tool it describes (NORTH-STAR priority 4: a wrong sentence in a published skill is a product defect). reach: named producer, the published skill catalog (skills/**), which ships to customer projects through npx skills add. Found by the dev of #9591 (PR #22142, report 6051224331, out_of_scope_findings[0]) and filed by the domain:spec seat 1 (seat post #6017, session_01LAi5BVvQNiYzepSAcsoFLK). ⛔ Not graded or routed here; ⛔ not a claim.

What is false (read on origin/main ef1fcb26a2)

  • skills/objectstack-data/rules/indexing.md:31: "os migrate meta --from 16 to strip them automatically."
  • skills/objectstack-data/SKILL.md:377: "os migrate meta --from 16 strips them."

The default run of os migrate meta writes no authored source file: packages/cli/src/commands/migrate/meta.ts declares the write flag with default: false. With --write, it rewrites in place only the edits it can trace to one literal in one project file, and lists every other edit with the reason it was not written (PR #22108, a959493cdf). Neither line is true of either route as written. An AI author reading the skill expects its sources stripped and leaves the retired keys in place.

Contract

packages/spec/src/shared/retired-key.ts, the house-sentence ruling the class pin enforces: "It must be TRUE of the tool." PR #22142 (#9591) moves the house sentence to "… to list the mechanical edits for existing sources; --write applies the ones it can prove, and you apply the rest by hand." PR #22122 (#22120, landed) already moved skills/objectstack-upgrade to the same vocabulary.

Reader who acts

Triage grades and routes it. The landing site is skills/**, Tier H: a draft landed on an authorized approval or the maintainer's hand. Per the #9591 dev, the class pin's WITHDRAWN_CLAIM regex has no "strip" spelling, so the pin does not see these lines. If the fix also widens that regex (packages/spec/src/shared/retired-key-migrate-sentence.test.ts), the widening must ride the same PR as the skill edit, or main goes red.

Dedupe

MCP search_issues, repo-scoped, closed included:

Dedupe words: objectstack-data indexing strip them automatically · os migrate meta strips skill · withdrawn claim strip spelling

Activity

  1. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: the road — upgrade: the published skills say what the tool does | 缺项 | P3

    Triage: first grade, documentation · priority:p3 · domain:skills · area:devpath · pm:queue. The third member of the family, so this is its closing card: every os migrate meta sentence in skills/**, checked in one pass

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-08T05:04Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: lands in skills/objectstack-data/rules/indexing.md:31 and skills/objectstack-data/SKILL.md:377 ⇒ domain:skills; rationale: skills/** is that lane's (Tier H). Read on main ec8f37c890.

  2. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3
    Session: session_01CXydFDyiQwNbGFkmwrcRQq
    Account: huangyiirene (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-22144-data-skill-migrate-meta-sentences
    Worktree: objectstack-issue-22144
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: skills/objectstack-data/rules/indexing.md (:31) and skills/objectstack-data/SKILL.md (:377) on origin/main 6ed0c0f3e5, plus any other skills/** sentence the closing enumeration finds false of os migrate meta (each named in the PR body with its line and reading). Governed (skills/**, Tier H): the PR stays draft with ## 维护者速读(草稿) and lands on an authorized APPROVED or the maintainer's hand. ⛔ No packages/spec/** — the class pin's WITHDRAWN_CLAIM regex widening (retired-key-migrate-sentence.test.ts) is spec-lane work and that file is held by PR #22142; this PR does not touch it, so main cannot go red on it. ⛔ No re-wrap as token payment (skills/objectstack-data/SKILL.md sits at its ceiling: 6128 of 6128, headroom 0 — growth is paid by content deletion in the same file); stop on breach; explain in the report
    Container & model: S, mode:subagent, model: CONTRACT_REVIEW_TIER — dispatch-gates --tier --repo objectstack-ai/objectstack skills/objectstack-data/rules/indexing.md skills/objectstack-data/SKILL.md prints "Model tier — MANDATORY" for skills/** (the published catalog ships verbatim by npx skills add; derived from the file surface, not recalled)
    Clause-②: no
    Responsibility: the published skill text produces the risk (two sentences promise that os migrate meta --from 16 strips retired index keys "automatically" / "strips them", while the default run writes no source and --write rewrites only the sites it can prove — packages/cli/src/commands/migrate/meta.ts, write flag default false) | the platform path that already covers it: none for the text — the tool itself is honest (it lists what it did not write), but an AI author reading the skill expects its sources stripped and leaves the retired keys in place until tsc or the parse error catches them | who reaches it: every reader of the published objectstack-data skill upgrading across protocol 16; used today — the skill ships with every npx skills add
    Thread-read: 6052701386
    Serial constraints cleared: skills/objectstack-data/rules/indexing.md was last touched on origin/main by PR #22103 (spec lane, MERGED; ef1fcb26a 2026-10-08T01:58Z), so this branch cuts after it — same-day churn: yes, the dispatch order carries the churn line; skills/objectstack-data/SKILL.md last touched 595621d35 (2026-09-23T02:40Z); no open PR touches skills/objectstack-data/** (the 11 open PRs' file lists read at 2026-10-08T05:33Z); PR #22142 (spec lane, draft) holds .claude/skills/spec-property-retirement/SKILL.md and the pin test — file-disjoint from this surface, and this card adopts its house wording without waiting on it; #22176 (this seat, PR #22184 awaiting approval) is skills/objectstack-ui/**, disjoint; #22172 (director seat) is docs/NORTH-STAR.md, disjoint; verify lock free; the lane's open P0/P1: none ⇒ p3 is a candidate (the lane's p2 #22176 is already in its landing window). Readings taken at 2026-10-08T05:33Z.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 22144,
      "status": "done",
      "branch": "claude/issue-22144-data-skill-migrate-meta-sentences",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/22199",
      "session": "session_01CXydFDyiQwNbGFkmwrcRQq — the dispatching PM's harness-stamped id (subagent = parent's); worktree /home/user/objectstack-issue-22144, BASE 1e5d322c1e14803056c789c71d8ba87a538aa23c (origin/main at cut, after 6ed0c0f3e5), head 0aa5205228f83141189fcf67cb538976dcface60",
      "premise_still_valid": true,
      "premise_evidence": "On the branch tree: skills/objectstack-data/rules/indexing.md:31 read 'run `os migrate meta --from 16` to strip them automatically' and skills/objectstack-data/SKILL.md:377 read '`os migrate meta --from 16` strips them' (the lines the card quotes from ef1fcb26a2; PR #22103 left them). packages/cli/src/commands/migrate/meta.ts:762-769 declares `write: Flags.boolean({ description: 'Rewrite the authored source files in place for each mechanical change traced to one literal in one project file; every other change is listed with the reason it was not written. Never writes the manual (semantic) changes.', default: false, exclusive: ['stored'] })`; packages/cli/src/utils/authored-source-codemod.ts header: only a path that leads to ONE literal in ONE project file is written, everything else is refused by a named reason. packages/spec/src/migrations/registry.ts:79 `export const MIGRATION_SUPPORT_FLOOR = 16;`. packages/spec/src/conversions/registry.ts:3906 `id: 'object-index-type-partial-removed'` — the 16→17 step does carry the conversion, so 'lists the mechanical edits' is true of these keys.",
      "summary": "Replaced the two false sentences with the house wording. rules/indexing.md:31-33 now reads '… run `os migrate meta --from 16` to list the mechanical edits; `--write` applies the ones it can prove, and you apply the rest by hand.' SKILL.md:377-378 (ceiling 6128, headroom 0) now reads '`os migrate meta --from 16` lists the edits; `--write` applies the ones it can prove, the rest by hand.' — the shortest true form — paid by deleting the clause 'Access methods and partial predicates are database-layer migrations.' (70 bytes), whose content the same file states at SKILL.md:387-388 ('how to build partial / gin / gist indexes at the database layer') and SKILL.md:44 (Index Strategy: partial indexes), and rules/indexing.md § Access methods and partial indexes; net 24512→24506 bytes, 6128→6127 tokens, no re-wrap, ceiling untouched. Closing enumeration: `git grep -n 'os migrate meta' -- skills/` = 30 hits in 5 files (data SKILL.md 1, data indexing.md 1, upgrade SKILL.md 21, upgrade evals json 5, upgrade examples-upgrade.md 2) plus one bare `migrate meta` hit (upgrade SKILL.md:466); every hit outside the two was judged against (a) default lists / writes no source, (b) --write rewrites only provable sites, (c) --from at or above MIGRATION_SUPPORT_FLOOR=16 and reads true (incl. `.specChanges` at meta.ts:881,928, `todos` at :459, the stored pass exit 1 via storedMigrationClean); the full table is in the PR body; nothing else changed. Frontmatter untouched; no eval quotes either sentence (grep strip in skills/objectstack-data/evals: 0 hits). Draft PR #22199 against main, first line 'Fixes #22144', 'Clause-②: no' on its own line, '## 维护者速读(草稿)' present, session-URL footer; body read back: 15639 bytes sent = 15639 stored, 0 angle brackets, draft=true, head 0aa5205228. Governed Tier H: stays draft.",
      "files_changed": [
        "skills/objectstack-data/SKILL.md (469 lines → 469; 24512 → 24506 bytes; 6128 → 6127 tokens; ceiling 6128)",
        "skills/objectstack-data/rules/indexing.md (229 lines → 230; 8729 → 8805 bytes; 2183 → 2202 tokens; ceiling 3241)",
        "whole package (every skills/**/SKILL.md summed): 4408 lines → 4408; 210279 → 210273 bytes; ratchet bundle total 154833 → 154851 tokens (+18), the before figure measured by running the gate in a detached worktree at 1e5d322c1e"
      ],
      "tests": "All at head 0aa5205228, exit codes captured before any pipe (each command's output redirected to its own log first, EXIT read next, the tail read after). Derivation: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths) = 24 commands; run after the final commit as one union with the tool's loop idiom, recorded as `cmd :: exit N`; reconcile `dispatch-gates --ran` → 'Run reconciliation — 24 derived, 24 run, 0 NOT-MEASURED, 0 UNRUN' (exit 0). All 24 exit 0: node scripts/check-ci-filter-parity.mjs; node scripts/check-closing-keyword-parity.mjs (+ --self-test: '40 assertions, 5 mutations … driven to red'); node scripts/check-comment-mask-corpus.mjs ('8382 files, 0 disagree'); node scripts/check-doc-route-spelling.mjs --advisory (+ --self-test); node scripts/check-skills-token-ratchet.mjs ('skills/objectstack-data/SKILL.md is 6127 tokens (ceiling 6128; headroom 1)', 'rules/indexing.md is 2202 tokens (ceiling 3241; headroom 1039)', '54 authored bundle file(s) within their ceilings', bundle total 154851) (+ --self-test: 65 cases); pnpm --filter @objectstack/lint run check:doc-formula-expressions (first run exit 3 PREREQUISITE NOT MET — @objectstack/formula and @objectstack/lint unbuilt, nothing measured; after `pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2` behind os-verify-lock.sh, VERDICT command-exit 0 · held 92s · waited 0s, it exits 0); pnpm --filter @objectstack/spec run check:skill-docs ('Skill docs in sync'); pnpm check:agent-test-spelling; pnpm check:corpus-claim-drift ('4 rows … 53 skills files'); pnpm check:cross-package-test-inputs; pnpm check:doc-authoring ('53 published skill files clean'); pnpm check:driver-memory-census; pnpm check:gitlink-declared; pnpm check:nul-bytes ('scanned 10174 text file(s) … no raw ASCII control bytes'); pnpm check:pm-governed-merges; 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:watch-hint-literal. Outside the derivation, also exit 0: pnpm --filter @objectstack/spec run check:skill-refs ('9 generated files in sync'); pnpm check:skill-top-level-keys. NOT MEASURED locally (CI's): type-check lanes, Test Core shards, the 11 wide-population and 51 roster families the derivation names; the 15 pending-changeset families do not apply (no changeset; skip-changeset intended — see deviations). No package code touched ⇒ no package build/test owed (① empty). Ablation of the ratchet payment (committed first; scripts/ablation-replace.mjs): attempt 1 was a no-op by the tool's own count check (anchor was a substring of the replacement, count 1→1), refused and restored, nothing measured; attempt 2 re-anchored on 'prove, the rest by hand.' re-adding the deleted clause: mutation landed on disk (blob 7220a34363d3 → efe8f6825326), `node scripts/check-skills-token-ratchet.mjs` exit 1 — 'skills/objectstack-data/SKILL.md is 6144 tokens; the ratchet ceiling is 6128 (over by 16)' — restore proven: blob == HEAD 7220a34363d3, `git diff HEAD` empty, `git status --porcelain` empty. No build/dist involved in the ablation (text gate), so no dist preflight applies. Worktree clean at report time.",
      "gates": [
        "node scripts/check-ci-filter-parity.mjs :: exit 0",
        "node scripts/check-closing-keyword-parity.mjs :: exit 0",
        "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
        "node scripts/check-comment-mask-corpus.mjs :: exit 0",
        "node scripts/check-doc-route-spelling.mjs --advisory :: exit 0",
        "node scripts/check-doc-route-spelling.mjs --self-test :: exit 0",
        "node scripts/check-skills-token-ratchet.mjs :: exit 0",
        "node scripts/check-skills-token-ratchet.mjs --self-test :: exit 0",
        "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 (first attempt exit 3 = prerequisite unbuilt, not a measurement)",
        "pnpm --filter @objectstack/spec run check:skill-docs :: exit 0",
        "pnpm check:agent-test-spelling :: exit 0",
        "pnpm check:corpus-claim-drift :: exit 0",
        "pnpm check:cross-package-test-inputs :: exit 0",
        "pnpm check:doc-authoring :: exit 0",
        "pnpm check:driver-memory-census :: exit 0",
        "pnpm check:gitlink-declared :: exit 0",
        "pnpm check:nul-bytes :: exit 0",
        "pnpm check:pm-governed-merges :: exit 0",
        "pnpm check:refd-timer-probe :: exit 0",
        "pnpm check:role-word :: exit 0",
        "pnpm check:skill-compatibility :: exit 0",
        "pnpm check:skill-frame-sync :: exit 0",
        "pnpm check:skill-identifier-liveness :: exit 0",
        "pnpm check:watch-hint-literal :: exit 0",
        "pnpm --filter @objectstack/spec run check:skill-refs :: exit 0 (not derived; AGENTS.md SKILL.md pair)",
        "pnpm check:skill-top-level-keys :: exit 0 (roster family, run anyway)",
        "node scripts/pm/dispatch-gates.mjs --ran :: exit 0 — 24 derived, 24 run, 0 NOT-MEASURED, 0 UNRUN",
        "CI on PR #22199 :: in_progress at report time (not awaited, per the dispatch contract)"
      ],
      "deviations": [
        "label-write REFUSED by this session's harness classifier before any request: command `node scripts/pm/label-write.mjs --issue 22199 --repo objectstack-ai/objectstack --add skip-changeset --assign huangyiirene` (run from /home/user/objectstack-issue-22144); stated reason: 'Permission for this action was denied by the Claude Code auto mode classifier. Reason: [External System Writes].' Per the dispatch order no other route was tried (no MCP, no curl, no second relay action). Consequence: PR #22199 carries no `skip-changeset` label and no assignee (read back: labels [], assignees []); the seat applies both after its own review.",
        "Commit trailer pair is the repo's model-free form (`Co-authored-by: Claude` + `Claude-Session: …session_01CXydFDyiQwNbGFkmwrcRQq`), not the harness-suggested model-named Co-Authored-By; the harness wrote no trailer of its own. The commit was amended once before the first push of content (author reset to the checkout's configured identity after a mistaken `-c user.name` override); the branch was unshared (only the empty probe push preceded it) and no force-push was needed.",
        "`skills/objectstack-data/SKILL.md` ends 1 token under its unchanged ceiling; the ceiling row in scripts/check-skills-token-ratchet.mjs was not lowered (outside this card's file surface; lowering is legitimate per the gate header — noted in the PR's Acceptance notes)."
      ],
      "mcp_calls": "0 — no MCP GitHub tool was called (reads went through `gh api` GET: issue 22144 + comments, pull 22199)",
      "api_writes": "2 REST proxy writes, both through scripts/pm/ over the fleet-write relay as objectstack-fleet[bot]: ① POST /repos/objectstack-ai/objectstack/dispatches (request fw-20261008T060059Z-5daaef, run 37735325765, conclusion success) carrying op pr_create → POST /repos/objectstack-ai/objectstack/pulls = #22199, read-back 15639 bytes sent = 15639 stored; ② this os-dev-report comment via `node scripts/pm/post-stamped.mjs --comment=22144 --repo objectstack-ai/objectstack --file=card-comment.md` → op comment → POST /repos/objectstack-ai/objectstack/issues/22144/comments (if the comment is absent on the card, that write was refused by the classifier as well and the report reached the PM only through the subagent hand-back). Refused before any request: label-write (0 writes). git push ×2 (the empty probe push, then 0aa5205228) — not REST.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: the domain:spec seat (PR #22142 holds packages/spec/src/shared/retired-key-migrate-sentence.test.ts) · the class pin's WITHDRAWN_CLAIM regex has no 'strip' spelling (alternatives: 'to rewrite … automatically', 'rewrites it for you / existing sources / authored sources / your sources / your source files'), so a future 'strips them' sentence in skills/** or spec would pass it; noted in the PR's Acceptance notes, not filed (spec-lane work, already carried).",
        "carrier: the next PR that touches scripts/check-skills-token-ratchet.mjs, or the skills seat · the skills/objectstack-data/SKILL.md ceiling (6128) can be lowered to the measurement 6127 · noted, not filed (not a defect; the gate's header calls lowering legitimate and encouraged)."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #22199 (0aa5205228), reviewed against GitHub and origin/main by skills seat 1, session_01CXydFDyiQwNbGFkmwrcRQq, 2026-10-08T06:19Z

    Verdict: ACCEPT. Landing path: Tier H (skills/**, two files, +5/−4), so the final four-piece set replaces a queue landing: ① the ## Contract review record is on PR #22199 (PASS, head 0aa5205228f83141189fcf67cb538976dcface60, served tier CONTRACT_REVIEW_TIER, in-seat); ② this ACCEPT; ③ needs-user-decision on the PR plus the final maintainer brief comment there; ④ review requested from os-zhuang and hotlong. The PR stays draft until an authorized APPROVED (GOVERNED_APPROVERS) or a hand merge; on APPROVED this seat lands it unless the approver already has, and closes out either way.

    Checklist, read on the PR and the tree, not on the report:

    Deviations noted, none blocking:

    • The dev's label-write was refused by its session classifier ("External System Writes"), recorded in its report with the exact command; the seat applied the label and assignee as its own conclusion.
    • The commit was amended once before its first content push (author identity reset); the branch was unshared, no force-push. Recorded by the dev; nothing to act on.

    Acceptance notes (stay notes; no card):


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — PR #22199 MERGED, skills seat 1, session_01CXydFDyiQwNbGFkmwrcRQq, 2026-10-08T08:22Z

    Two readings, taken together: PR #22199 reads merged: true at 2026-10-08T08:20Z with merge commit 3ae59661dc4d5029b1ce02e9cdca5cc6d5f74f83, and that commit is an ancestor of origin/main (single parent, content = the two-file diff of head 0aa5205228; control: origin/main at 3ae59661dc, the merge commit itself at this reading). The queue entry gh-readonly-queue/main/pr-22199-… was enqueued 2026-10-08T07:21Z. Approval was os-zhuang's (review 5453047137 on 0aa5205228, 2026-10-08T07:15Z), who also flipped the PR ready; the arming was this seat's by the relay after check-expected-skips --pr 22199 exit 0, check-governed-merges --pr 22199 Tier H with the authorized APPROVED, merge-tree clean, and the needs-user-decision strip. The contract review (PASS, 6053592076), the ACCEPT (6053715333) and the maintainer brief (6053733052) are the review record beside the approval.

    Close-out in this act: this card closed by the merge through Fixes #22144 (read back below); pm:dispatched and the assignee stripped; the lane's open set compared before and after the landing: 8 open before (#22195 #22167 #22144 #22060 #22053 #22052 #19287 #17161, read 2026-10-08T06:57Z) and 6 open after (#22167 #22060 #22053 #22052 #19287 #17161): #22144 left by this merge, #22195 left by PR #22207's merge (2026-10-08T07:54Z); nothing else closed, and no card was closed by a stray keyword.

    skills/objectstack-data now says what os migrate meta --from 16 does at both sites (default lists; --write applies the provable sites; the rest by hand), closing the family #22120 → #22123 → #22144. Cross-lane memo standing for the domain:spec seat: the class pin's WITHDRAWN_CLAIM regex has no "strip" spelling (their PR #22142 holds the file).


    Generated by Claude Code

  6. added a commit that references this issue on Oct 9, 2026
    3ae5966
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:skillspriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions