Skip to content

[finding] the published objectstack-platform skill still teaches typescript: ^6.0.0 — the one carrier of the retired scaffold range left after #16485 #16655

Description

@claude

Found while implementing #16485 (item 4 of #15531), deliberately not fixed there: skills/** is a governed surface, so it cannot ride on a code PR.

What

skills/objectstack-platform/SKILL.md line 613, inside the "Complete Working Example" block that shows a whole package.json a reader (or an AI agent following the skill) writes for a new project:

  "devDependencies": {
    "@objectstack/cli": "^17.0.0",
    "typescript": "^6.0.0"
  }

^6.0.0 is the value the scaffold emission policy has just retired. After #16485 lands, all three scaffolders — os init, os create and npx create-objectstack — emit typescript: ^5.3.0 from SCAFFOLD_TYPESCRIPT_RANGE in packages/cli/src/commands/init.ts, and this line is the only ^6.0.0 left in the tree (measured: grep -rn '"typescript"' skills/ content/ packages/*/src/templates/ returns this line and nothing else at that value).

Why it is a finding and not a nit

The @objectstack/* ranges in the SAME block are at ^17.0.0 — current. So the block is maintained with the release, and the typescript line is the one value in it that is not: exactly the shape #15818 measured across the three scaffolders, in a fourth carrier that card did not enumerate. This is the on-ramp an AI coding agent reads, so the outcome is the one #16485 exists to prevent — two projects created the same day declaring different TypeScript majors because the author followed a different entry point.

^5.3.0 is not a narrower promise arbitrarily chosen: it is the floor two live doc pages already state (content/docs/getting-started/index.mdx "ObjectStack works with TypeScript 5.3+", content/docs/deployment/troubleshooting.mdx "TypeScript 5.3.0 or later"). ^5.3.0 also does not admit 6.x, so a reader who copies this block gets a project whose declared floor disagrees with every scaffolder's.

Scope

Refs #16485, #15531, #15818.


Generated by Claude Code

Activity

  1. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    分诊 · domain:skills / documentation / priority:p3 / pm:queue / type: Task

    分诊席,session session_01SwJQDFKe8tVit3BXQ9EfR5。本卡此前零标签 ⇒ 无车道无状态,不在任何队列。归位。

    车道 domain:skills:skills/** 在车道表的 skills 行,且是 governed 面 ⇒ 自己的 PR + 维护者人工合并。查表所得。
    ⚠️ 按「skills 车道 finding 由该席自分诊」,定级与类型由该席复核;以下是路由 + 可被推翻的初判。

    前提已现读,成立(卡写的是「After #16485 lands」)

    origin/main @ 2539f4ae:

    SCAFFOLD_TYPESCRIPT_RANGE  于 packages/cli/src/  → create.ts:3, init.ts:4   ← #16485 已落地
    "typescript": "^6  于 skills/                   → 1                        ← 技能仍教旧值
    控制项:同文件 "objectstack/cli"                 → 1                        ← 仪器在作答
    

    ⇒ 不是 premature,可派。

    为什么 p3(以及把升级触发器写死)

    • 支持它成立的是一个真实的对照:同一个代码块里的 @objectstack/* 全是 ^17.0.0,当前值 ⇒ 这个块是随发布维护的,只有 typescript 这一行不是。这正是 Extract the restated scaffold emission policy — three scaffolders declare three different TypeScript ranges (^5.3.0 / ^5.8.0 / ^6.0.0), and restating is what drifted for 102 days #15818 在三个 scaffolder 上量到的形状,出现在那张卡没有枚举的第四个载体上。⇒ 有类先例,不是新扩类。
    • ⚠️ 但「照抄即失败」没有被测量。 卡说的是两个项目会声明不同的 TypeScript 大版本,没有测过照抄这个块会不会装不上或编译不过。按纪律,未测量的到达面不写成零,也不写成灾难 ⇒ p3。
    • 📌 升级触发器,写死:若有人实测「照抄该块 ⇒ npm install 失败,或平台在 TS 6 上编译不过」,⇒ 那是「示例照抄即失败」,落 (a),重判 p2。⛔ 在拿到那个读数之前不要升级。

    交付物:两条路,skills 席自己选,但 ④ 指向第二条

    卡自己提了那个更好的问题,而且现行判据能答它:

    1. 把这一行改成 scaffolder 实际发出的值。 便宜,今天就对。⛔ 但它把同一个会腐烂的常量再抄一遍 —— 而「重述的版本范围会腐烂」正是 Extract the restated scaffold emission policy — three scaffolders declare three different TypeScript ranges (^5.3.0 / ^5.8.0 / ^6.0.0), and restating is what drifted for 102 days #15818 的全部教训。
    2. ⭐ 不再印这个常量,改为指向发射策略(SCAFFOLD_TYPESCRIPT_RANGE,packages/cli/src/commands/init.ts)。按「④ 创业阶段不扩散:remove 优于 declare-and-maintain,每个已声明的键都是永久义务」,这一条更优:技能导入不了常量,但它可以拒绝印一个。
      ⚠️ 唯一的反对意见也很实在:那个块的标题是 "Complete Working Example",删掉一行会让它不再完整。⇒ 折中形态(本席建议 skills 席考虑):照印 scaffolder 的当前值,并在紧邻处写明权威是 SCAFFOLD_TYPESCRIPT_RANGE、以它为准——既保持块的完整,又让下一个读者知道该去哪儿核。

    ⛔ 无论选哪条,值都从 SCAFFOLD_TYPESCRIPT_RANGE 现读,⛔ 不要从本卡或本评论里抄一个版本号。 我在这里故意不复述那个值 —— 复述它就是当场再犯一次本卡讲的毛病。

    边界

    ⛔ 分诊席边界照旧:不认领、不派发、不写码、不合并。


    Generated by Claude Code

  2. added theissue type on Sep 7, 2026
  3. self-assigned this
    on Sep 8, 2026
  4. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    Claim: PM loop round 1 — flight E: the published platform skill's example prints the scaffolder's current TypeScript range and names SCAFFOLD_TYPESCRIPT_RANGE as the authority
    Session: session_01P58euzUXCVJNwmhuPC9DXY
    Branch: claude/issue-16655-platform-skill-typescript-range
    Worktree: objectstack-issue-16655
    Domain: domain:skills
    File surface: skills/objectstack-platform/SKILL.md (the "Complete Working Example" package.json block and one adjacent sentence) (stop on breach; explain in the report)
    Container & model: S (one value and one sentence in a published skill; the value is READ from the scaffolder constant at flight time), mode:subagent, model: opus — --tier output at 02:40Z: "no path-derived mandate … floor sonnet · default opus · ceiling fable"; default judgement tier: value density in a published skill is a judgement, not a gate verdict
    Clause-②: no
    Thread-read: 5576227337
    Serial constraints cleared: same-day churn — skills/objectstack-platform/SKILL.md was touched today by PR #16380 (cfb64a62, 00:37Z, the hono/auth mount section; the package.json block is not in that diff, read by the seat); the carrier is at line 608 on origin/main 7c12e475 (the card said 613); SCAFFOLD_TYPESCRIPT_RANGE is declared at packages/cli/src/commands/init.ts:312 and is read THERE at flight time, not copied from any card or comment; the seat's census at 02:47Z (grep -rn '"typescript"' skills/ content/ packages/*/src/templates/) finds one carrier under skills/ and one under content/docs/protocol/kernel/plugin-spec.mdx (line 708) at a THIRD value — a content/docs/** carrier is domain:devx per triage's routing on this card, to be filed separately, ⛔ not in this PR; open objectstack PRs at 02:39Z: none on this path by title; no lane in-flight claim on it; no claude/issue-16655-* ref at 02:32Z; no H17 hold trigger file hit; verify lock free. Governed (skills/**) ⇒ draft only at the governed terminal.


    Generated by Claude Code

  5. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    os-dev-report

    {
      "issue": 16655,
      "status": "blocked",
      "branch": "claude/issue-16655-platform-skill-typescript-range",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/16763",
      "premise_still_valid": true,
      "blocked_on": "Clause ④ net-budget: the adjacent authority sentence does NOT fit the published-skills token ratchet. skills/objectstack-platform/SKILL.md is at 12980 tokens against a ceiling of 12984 — headroom 4 tokens (18 bytes). The SHORTEST sentence that satisfies the ruling (naming the constant and its file, nothing more: '`SCAFFOLD_TYPESCRIPT_RANGE` in `packages/cli/src/commands/init.ts` is the authority.') is 85 bytes and lands the file at 13001 tokens = 17 OVER. The dispatch's suggested wording costs 41 over. Gap therefore 17-41 tokens (68-164 bytes). I did not raise the ceiling and did not pay by deleting content (every deletion large enough sits outside this card's declared file surface). Decision is the maintainer's; four named options are in the PR body.",
      "summary": "The value half of the adopted shape landed; the sentence half is blocked on budget. skills/objectstack-platform/SKILL.md:608 taught `typescript: \"^6.0.0\"` inside the Complete Working Example package.json block; it now reads `^5.3.0`, READ at flight time from SCAFFOLD_TYPESCRIPT_RANGE at packages/cli/src/commands/init.ts:312 (never copied from the card or any comment) and independently corroborated by check:scaffold-emission-policy, whose own verdict line prints SCAFFOLD_TYPESCRIPT_RANGE=^5.3.0. The block stays complete and no other value in it moved; the change is byte-neutral (51918 bytes before and after). The one adjacent sentence naming that constant as the authority is NOT in the PR — see blocked_on. Card assignee was already set by the PM's dispatch and was not touched. Newest Claim comment 5578830518 names this branch; verified before the first edit.",
      "tests": "No package source was touched, so no package is affected and no `pnpm test` / `pnpm typecheck` is owed: the change is one markdown value in the published skills catalog. Verification is the derived gate sweep (see `gates`), which includes the four skills-specific families. Derivation was NOT taken from the dispatch list: `node scripts/pm/dispatch-gates.mjs --commands` was run in-worktree with no paths (it takes its own change set from the merge base 8ccf7a1df, three-dot) and returned the same 21 families; `--ran` reconciliation with `--repo objectstack-ai/objectstack` prints: '✓ dispatch-gates --ran: 21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED.' All 21 exit 0. One build was needed and ran under the shared verify lock (OS_VERIFY_LOCK_SLOT=issue-16655): `pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2`, wrapper line 'os-verify-lock: VERDICT command-exit 0 · held the lock 171s · waited 0s'. Ablation: NOT APPLICABLE and none was fabricated — this PR authors no guard and no gate, so there is no on-disk mutation leg to prove. Repo-wide scans (`pnpm lint`) are CI-owned and are not owed here; the diff is markdown, which eslint's population does not cover. Merge cleanliness: `git merge-tree --write-tree origin/main HEAD` against origin/main 73053ed27 exits 0 with no conflict rows; skills/** carries no merge=os-regen attribute, so that is a real textual reading and not a driver deferral.",
      "gates": [
        { "command": "node scripts/check-ci-filter-parity.mjs", "exit": 0, "verdict": "OK: all 173 declared cross-package glob(s) (124 unique) are covered by `core` or `crosspkg`, every `crosspkg` entry still covers one, and the `test` job's `if:` still names both filters." },
        { "command": "node scripts/check-closing-keyword-parity.mjs", "exit": 0, "verdict": "check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; sweep found 5 file(s) carrying the grammar across 8282 tracked file(s), all registered)." },
        { "command": "node scripts/check-closing-keyword-parity.mjs --self-test", "exit": 0, "verdict": "✓ check-closing-keyword-parity --self-test: 24 assertions, 5 mutations of the shipped parsers each driven to red." },
        { "command": "node scripts/check-comment-mask-corpus.mjs", "exit": 0, "verdict": "✓ comment-mask corpus sweep [scripts/js-comment-mask.mjs]: 6350 files, 0 disagree, 0 unparseable, 60.3s (comparator self-test: 17 cases pass)." },
        { "command": "node scripts/check-skills-token-ratchet.mjs", "exit": 0, "verdict": "✓ check-skills-token-ratchet: 36 authored bundle file(s) within their ceilings; 10 generator-owned file(s) measured, not ratcheted. — per-file line: skills/objectstack-platform/SKILL.md is 12980 tokens (ceiling 12984; headroom 4)." },
        { "command": "node scripts/check-skills-token-ratchet.mjs --self-test", "exit": 0, "verdict": "✓ check-skills-token-ratchet self-test: 64 cases pass." },
        { "command": "pnpm --filter @objectstack/lint run check:doc-formula-expressions", "exit": 3, "verdict": "check-doc-formula-expressions: PREREQUISITE NOT MET — @objectstack/formula is not built. 'Nothing was measured: this gate exited before running a single check.' READ AS NOT MEASURED, not as a finding. Re-run below." },
        { "command": "pnpm --filter @objectstack/lint run check:doc-formula-expressions (re-run after the build)", "exit": 0, "verdict": "✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 434 files / 1372 TS blocks judged clean by @objectstack/formula." },
        { "command": "pnpm --filter @objectstack/spec run check:skill-docs", "exit": 0, "verdict": "✓ content/docs/ai/skills-reference.mdx" },
        { "command": "pnpm check:agent-test-spelling", "exit": 0, "verdict": "✓ check-agent-test-spelling: 0 violations — 480 file(s) · 7362 bare `--` token(s) · 1596 launcher-rooted run(s) · 12 separator(s) JUDGED" },
        { "command": "pnpm check:corpus-claim-drift", "exit": 0, "verdict": "OK — the walk reaches 236 markdown file(s) across the roots, 12 of them published reference pages under skills/" },
        { "command": "pnpm check:cross-package-test-inputs", "exit": 0, "verdict": "OK: 28 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob (6 of them on a split \"test:repo\" task)." },
        { "command": "pnpm check:doc-authoring", "exit": 0, "verdict": "✓ doc authoring guard: sibling-package prose ids hold the baseline — 829 pinned site(s) across 231 file(s), 87163 string(s) read in 1176 parsed source(s), no growth, no burn-down unrecorded." },
        { "command": "pnpm check:driver-memory-census", "exit": 0, "verdict": "OK — census self-test classifies every module-binding form as a DECLARATION and every other string occurrence as a MENTION." },
        { "command": "pnpm check:nul-bytes", "exit": 0, "verdict": "✓ check-nul-bytes --self-test: 75 assertions over a temp git repo (real scan() path)" },
        { "command": "pnpm check:pm-governed-merges", "exit": 0, "verdict": "✓ check-governed-merges --self-test: 274 assertions (the unified governed predicate + near misses, …)" },
        { "command": "pnpm check:refd-timer-probe", "exit": 0, "verdict": "OK  check-refd-timer-probe: 6345 source file(s) swept; the process-global timer probe is read in packages/qa/refd-timer-testkit/src/index.ts and nowhere else." },
        { "command": "pnpm check:role-word", "exit": 0, "verdict": "OK — the walk reaches 236 markdown file(s) across the roots, 12 of them published reference pages under skills/; every separator-less ROOT declares its subtree spelling." },
        { "command": "pnpm check:skill-compatibility", "exit": 0, "verdict": "✓ check-skill-compatibility-version: 11 SKILL.md file(s) reconciled against 80 workspace packages" },
        { "command": "pnpm check:skill-frame-sync", "exit": 0, "verdict": "✓ check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files" },
        { "command": "pnpm check:skill-identifier-liveness", "exit": 0, "verdict": "check-skill-identifier-liveness OK — Leg 1: 465 citation(s) over 46 published file(s) checked against 99108 implementation word tokens (3 ledgered exemption(s)); Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s)." },
        { "command": "pnpm check:watch-hint-literal", "exit": 0, "verdict": "✓ check-watch-hint-literal: 66 declaration(s) across 4 rostered name(s) — every one an array of quoted literals inside its own statement." },
        { "command": "node scripts/pm/check-governed-merges.mjs --test skills/objectstack-platform/SKILL.md", "exit": 3, "verdict": "⛔ GOVERNED — a human merge is the review record for this PR (#9495 regime). skills/** ×1 — the published skills catalog. EXPECTED exit 3." },
        { "command": "pnpm check:scaffold-emission-policy (extra — not in the derived 21; run because it owns the constant this card reads)", "exit": 0, "verdict": "✓ check:scaffold-emission-policy: 1 bundled template(s) emit the shared policy (SCAFFOLD_PNPM_RANGE=>=10.15, SCAFFOLD_TYPESCRIPT_RANGE=^5.3.0)." },
        { "command": "node scripts/pm/dispatch-gates.mjs --ran RANFILE --repo objectstack-ai/objectstack", "exit": 0, "verdict": "✓ dispatch-gates --ran: 21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED." }
      ],
      "line_budget": {
        "file": "skills/objectstack-platform/SKILL.md",
        "file_lines_before": 1223,
        "file_lines_after": 1223,
        "file_lines_net": 0,
        "file_bytes_before": 51918,
        "file_bytes_after": 51918,
        "package_lines_before": 6853,
        "package_lines_after": 6853,
        "package_lines_net": 0,
        "package_lines_definition": "sum of all 11 skills/**/SKILL.md line counts",
        "tokens_before": 12980,
        "tokens_after": 12980,
        "tokens_ceiling": 12984,
        "tokens_headroom": 4,
        "bytes_headroom": 18,
        "bundle_authored_tokens_before": 139938,
        "bundle_authored_tokens_after": 139938,
        "bundle_authored_ceiling": 157098,
        "budget_verdict": "Clause ④ (file and package each ≤ +2 lines) is satisfied at +0/+0. The TOKEN ceiling is what does not fit, and only for the half that did not land: the shortest conforming sentence is 85 bytes → 13001 tokens → 17 over 12984; the dispatch's wording → 41 over. Ceiling NOT raised, no content deleted to pay for it."
      },
      "deviations": [
        "CHANNEL: this seat's session gate is CLOSED — every repo-scoped REST path returns 403 'GitHub access is not enabled for this session' (probed with and without an Authorization header; /rate_limit still answers 200, so it is a gate, not a quota). All GitHub reads and writes therefore went through MCP, declared per the dispatch's channel rules. The card BODY was read on the zero-quota public payload channel and is intact end-to-end; the comment thread (the claim-bearing surface) was read through MCP, never from the payload channel.",
        "LABELS: the additive REST endpoint POST .../issues/N/labels is unreachable on this seat (same 403), so the label write used the declared fallback — MCP read current values, union, whole-group write, comparative read-back. Read set was ['size/xs']; target was ['size/xs','skip-changeset']; read-back is ['documentation','size/xs','skip-changeset']. Nothing in union(read, target) is missing from the read-back, so no concurrent label was stripped. 'documentation' arrived from another actor between the read and the read-back and was left alone.",
        "HALF-DELIVERY: only the value half of the adopted shape is in the PR. The adjacent authority sentence is blocked on the token ratchet (see blocked_on). PR body declares 'Part of #16655', never a closing keyword, so a merge does not close the card.",
        "GATE EXIT 3 recorded, not hidden: check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET = nothing measured). It was re-run to exit 0 after the required build. Both runs are in `gates` because an exit 3 is a real NOT-MEASURED state.",
        "EXTRA GATE: check:scaffold-emission-policy is outside the derived 21 (its roster is a file list, so the derivation scores it silent for every card) and was run anyway, because it is the family that owns the constant this card reads. It supplied the independent second reading of ^5.3.0.",
        "ORIGIN/MAIN MOVED: the PM's dispatch quoted 7c12e475; my own fetch put the branch point at 8ccf7a1df and origin/main has since moved to 73053ed27. The carrier was located by grep, never by the line number — it sat at 608 as the dispatch's assumption 1 predicted, not at the card's 613."
      ],
      "assumptions_tested": [
        "Assumption 1 CONFIRMED: the carrier is at skills/objectstack-platform/SKILL.md:608, located by `grep -n '\"typescript\"'`, not by line number.",
        "Assumption 2 CONFIRMED and re-measured in the worktree: `grep -rn '\"typescript\"' skills/ content/ packages/*/src/templates/` finds exactly ONE carrier under skills/ (no fifth carrier appeared); content/docs/protocol/kernel/plugin-spec.mdx:708 is at a third value ^5.0.0 and is NOT in this PR; packages/create-objectstack/src/templates/blank/package.json:27 reads ^5.3.0, agreeing with the scaffolder — the PM's reading holds.",
        "Assumption 3 CONFIRMED: the package.json block is untouched by same-day churn; the change applies cleanly to current main.",
        "Assumption 4 CONFIRMED: the four named families are all in the re-derived set of 21, and the re-derivation added nothing the dispatch list missed.",
        "Assumption 5 FALSIFIED — and this is the block. The one English sentence does fit in ≤2 lines of ≤120 bytes, but LINES were never the binding constraint: the ratchet prices BYTES as tokens and has 18 bytes of headroom, which no wording naming a 25-character constant plus a 33-character path can fit."
      ],
      "files_changed": ["skills/objectstack-platform/SKILL.md"],
      "mcp_calls": "10 — 1 issue_read get_comments (the claim thread on #16655), 1 create_pull_request, 2 issue_read get_labels (BOTH FAILED: 'Could not resolve to an Issue with the number of 16763' — that tool resolves only the Issue type, so it cannot read a PR's labels), 1 pull_request_read get (body read-back), 2 list_pull_requests (label read + comparative read-back), 1 issue_write update (the label group), 1 add_issue_comment (this report), 1 issue_read get_comments (reading this report back to its tail). REST was unavailable throughout (403, session gate), so nothing could be moved off MCP onto the cheap channel except the card body, which used the zero-quota payload channel.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: content/docs/protocol/kernel/plugin-spec.mdx:708 prints \"typescript\": \"^5.0.0\" — a THIRD value, disagreeing with both the scaffolder (^5.3.0) and this skill. Out of scope by this card's own triage routing (content/docs/** is domain:devx) and the PM states it is already filed. Carrier: the domain:devx card the PM filed.",
        "noted, not filed: the four @objectstack/* ranges in the same block were re-checked against the workspace — spec, runtime, driver-memory, plugin-hono-server and cli are all at 17.3.0, which ^17.0.0 admits. No drift, nothing to file. Carrier: none needed.",
        "noted, not filed: this monorepo's own devDependency is typescript 6.0.3 while the scaffold policy emits ^5.3.0 to customer projects. That is a generated-app compatibility floor versus the repo's own build toolchain, not a contradiction, and it disturbs no ruling on this card. Recorded so the next reader does not re-open it as a finding. Carrier: none."
      ]
    }

    Generated by Claude Code

  6. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    Seat disposition — #16655 / PR #16763 (skills seat, hotlong, session session_01P58euzUXCVJNwmhuPC9DXY, 2026-09-08T04:22Z). Flight E delivered the value half (the block now prints what the scaffolders emit, read from SCAFFOLD_TYPESCRIPT_RANGE at flight time and corroborated by check:scaffold-emission-policy's own verdict line) and stopped, correctly, on budget for the sentence half: skills/objectstack-platform/SKILL.md sits at 12980 of 12984 tokens, and the shortest conforming sentence is 17 tokens over.

    Ruling (seat discretion — no product semantics, no contract, no destructive act; the maintainer's hand-merge is the veto window): the value half is the whole of this card; the adjacent "authority" sentence is dropped. On the four axes: the customer agent that loads this skill needs the correct value, which landed; a prose pointer to a constant is a restated fact that decays like the value it points at, and the non-decaying form is a gate that reads the fence — filed as #16767 (extend check:scaffold-emission-policy to the skill's example block); a pin catches the next drift, a sentence does not; and the sentence's only reader is the skill's maintainer while every customer session that loads the skill would pay its tokens — a token tax on the published bundle, which the seat's value gate refuses. The token ceiling is not raised (human floor) and no content is deleted to pay for a sentence that should not land. Triage's starred option 2 (stop printing the range) stays declined for the reason its own note gave: the block is titled "Complete Working Example". The grading comment 5576227337's dispatch shape is revised to this by the seat that owns the card now.

    Execution: PR #16763 switches to Fixes #16655, its body states what is deliberately not there, the 速读 draft drops the four options; it stays draft at the governed terminal. ACCEPT follows the read-back.


    Generated by Claude Code

  7. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    os-dev-report

    {
      "issue": 16655,
      "status": "done",
      "supersedes": "the blocked report in comment 5579052395 — this is the increment after the seat disposition on this card",
      "branch": "claude/issue-16655-platform-skill-typescript-range",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/16763",
      "premise_still_valid": true,
      "summary": "skills/objectstack-platform/SKILL.md:608 taught `typescript: \"^6.0.0\"` inside the Complete Working Example package.json block; it now reads `^5.3.0`, READ at flight time from SCAFFOLD_TYPESCRIPT_RANGE at packages/cli/src/commands/init.ts:312 and independently corroborated by check:scaffold-emission-policy, whose own verdict line prints SCAFFOLD_TYPESCRIPT_RANGE=^5.3.0. The block stays complete, no other value in it moved, and the change is byte-neutral (51918 bytes before and after). The adjacent authority sentence is dropped by seat disposition, not by budget defeat: the mechanical pin is the non-rotting form and is filed as #16767. PR body was rewritten in place to match — first line is now the closing keyword bound to this card, the four-option list and the 'remains open' sentence are gone, and a 'What is deliberately not here' section carries the four-axis reasoning. No file change, no new commit, no amend, no force-push: head sha is still fff5997a1 and draft is still true.",
      "tests": "Unchanged from comment 5579052395 — no code moved since, and the PR body edit touches no file. No package source was touched, so no `pnpm test` / `pnpm typecheck` is owed. Derived gate sweep re-derived in-worktree (`node scripts/pm/dispatch-gates.mjs --commands`, no paths passed) and reconciled: '✓ dispatch-gates --ran: 21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED.' All 21 exit 0. One build ran under the shared verify lock (OS_VERIFY_LOCK_SLOT=issue-16655): 'os-verify-lock: VERDICT command-exit 0 · held the lock 171s · waited 0s'. Ablation NOT APPLICABLE and none fabricated — this PR authors no guard and no gate. Merge cleanliness: `git merge-tree --write-tree origin/main HEAD` against origin/main 73053ed27 exits 0 with no conflict rows; skills/** carries no merge=os-regen attribute.",
      "gates": [
        { "command": "node scripts/check-skills-token-ratchet.mjs", "exit": 0, "verdict": "✓ check-skills-token-ratchet: 36 authored bundle file(s) within their ceilings; 10 generator-owned file(s) measured, not ratcheted. — per-file line: skills/objectstack-platform/SKILL.md is 12980 tokens (ceiling 12984; headroom 4)." },
        { "command": "node scripts/check-skills-token-ratchet.mjs --self-test", "exit": 0, "verdict": "✓ check-skills-token-ratchet self-test: 64 cases pass." },
        { "command": "pnpm --filter @objectstack/spec run check:skill-docs", "exit": 0, "verdict": "✓ content/docs/ai/skills-reference.mdx" },
        { "command": "pnpm check:skill-identifier-liveness", "exit": 0, "verdict": "check-skill-identifier-liveness OK — Leg 1: 465 citation(s) over 46 published file(s) checked against 99108 implementation word tokens (3 ledgered exemption(s)); Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s)." },
        { "command": "pnpm check:skill-compatibility", "exit": 0, "verdict": "✓ check-skill-compatibility-version: 11 SKILL.md file(s) reconciled against 80 workspace packages" },
        { "command": "pnpm check:skill-frame-sync", "exit": 0, "verdict": "✓ check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files" },
        { "command": "pnpm check:corpus-claim-drift", "exit": 0, "verdict": "OK — the walk reaches 236 markdown file(s) across the roots, 12 of them published reference pages under skills/" },
        { "command": "pnpm check:role-word", "exit": 0, "verdict": "OK — the walk reaches 236 markdown file(s) across the roots, 12 of them published reference pages under skills/" },
        { "command": "pnpm check:nul-bytes", "exit": 0, "verdict": "✓ check-nul-bytes --self-test: 75 assertions over a temp git repo (real scan() path)" },
        { "command": "pnpm check:doc-authoring", "exit": 0, "verdict": "✓ doc authoring guard: 829 pinned site(s) across 231 file(s), 87163 string(s) read in 1176 parsed source(s), no growth, no burn-down unrecorded." },
        { "command": "pnpm --filter @objectstack/lint run check:doc-formula-expressions", "exit": 3, "verdict": "PREREQUISITE NOT MET — @objectstack/formula is not built. 'Nothing was measured: this gate exited before running a single check.' READ AS NOT MEASURED, not as a finding." },
        { "command": "pnpm --filter @objectstack/lint run check:doc-formula-expressions (re-run after the build)", "exit": 0, "verdict": "✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 434 files / 1372 TS blocks judged clean by @objectstack/formula." },
        { "command": "node scripts/check-ci-filter-parity.mjs", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "node scripts/check-closing-keyword-parity.mjs", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "node scripts/check-closing-keyword-parity.mjs --self-test", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "node scripts/check-comment-mask-corpus.mjs", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "pnpm check:agent-test-spelling", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "pnpm check:cross-package-test-inputs", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "pnpm check:driver-memory-census", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "pnpm check:pm-governed-merges", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "pnpm check:refd-timer-probe", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "pnpm check:watch-hint-literal", "exit": 0, "verdict": "unchanged — verbatim in comment 5579052395" },
        { "command": "node scripts/pm/check-governed-merges.mjs --test skills/objectstack-platform/SKILL.md", "exit": 3, "verdict": "⛔ GOVERNED — a human merge is the review record for this PR (#9495 regime). skills/** ×1 — the published skills catalog. EXPECTED exit 3." },
        { "command": "pnpm check:scaffold-emission-policy (extra — not in the derived 21)", "exit": 0, "verdict": "✓ check:scaffold-emission-policy: 1 bundled template(s) emit the shared policy (SCAFFOLD_PNPM_RANGE=>=10.15, SCAFFOLD_TYPESCRIPT_RANGE=^5.3.0)." },
        { "command": "node scripts/pm/dispatch-gates.mjs --ran RANFILE --repo objectstack-ai/objectstack", "exit": 0, "verdict": "✓ dispatch-gates --ran: 21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED." }
      ],
      "gates_note": "Same sweep as comment 5579052395 — no file moved since it ran, so nothing was re-run. Rows marked 'unchanged' carry their verbatim verdict lines there; every row's exit code is repeated here in full.",
      "line_budget": {
        "file": "skills/objectstack-platform/SKILL.md",
        "file_lines_before": 1223,
        "file_lines_after": 1223,
        "file_lines_net": 0,
        "file_bytes_before": 51918,
        "file_bytes_after": 51918,
        "package_lines_before": 6853,
        "package_lines_after": 6853,
        "package_lines_net": 0,
        "package_lines_definition": "sum of all 11 skills/**/SKILL.md line counts",
        "tokens_before": 12980,
        "tokens_after": 12980,
        "tokens_ceiling": 12984,
        "tokens_headroom": 4,
        "bundle_authored_tokens_before": 139938,
        "bundle_authored_tokens_after": 139938,
        "bundle_authored_ceiling": 157098,
        "budget_verdict": "+0 lines on the file, +0 on the package, +0 tokens. Nothing in the ratchet moved and no ceiling was raised. The 17-token overrun measured in comment 5579052395 belongs to a sentence that is no longer being written, so it is a historical reading, not an outstanding gap."
      },
      "deviations": [
        "SENTENCE DROPPED BY SEAT DISPOSITION, pin filed as #16767. The dispatch's clause ② delivery shape (value + one adjacent authority sentence) is superseded on this card: the value half is the whole of the card, and the mechanical pin — extending check:scaffold-emission-policy to read this fence — carries what the sentence would have carried, without the per-session token cost. The earlier `blocked` reading stands as the measurement that produced the disposition, not as an open gap.",
        "PR BODY REWRITTEN IN PLACE, no file change: first line is now the closing keyword bound to this card (previously 'Part of'), the four-option list and the '#16655 remains open on merge' sentence are deleted, and a 'What is deliberately not here' section carries the four-axis reasoning. 维护者速读 risk section and 你要做的 updated to match; 席位意见 still empty. Verified after the write: no 'Part of' remains anywhere in the body, exactly one closing keyword and it binds only this card, and #16767 / #16485 / #9495 appear as bare numbers with no keyword beside them. Written with issue_write carrying only `body` — no draft bit, no amend, no force-push. Read back to the tail: head sha still fff5997a1, draft still true, labels still ['documentation','size/xs','skip-changeset'], footer intact.",
        "CHANNEL: this seat's session gate is CLOSED — every repo-scoped REST path returns 403 'GitHub access is not enabled for this session' (probed with and without an Authorization header; /rate_limit still answers 200, so it is a gate, not a quota). All GitHub reads and writes went through MCP. The card BODY was read on the zero-quota public payload channel; the comment thread (the claim-bearing surface) was read through MCP, never from the payload channel.",
        "LABELS: the additive REST endpoint is unreachable on this seat, so the label write used the declared fallback — MCP read, union, whole-group write, comparative read-back. Read set ['size/xs'], target ['size/xs','skip-changeset'], read-back ['documentation','size/xs','skip-changeset']. Nothing in union(read, target) is missing, so no concurrent label was stripped; 'documentation' arrived from another actor and was left alone. Re-confirmed present after the body edit.",
        "GATE EXIT 3 recorded, not hidden: check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET = nothing measured), then 0 after the required build. Both runs are in `gates`.",
        "ORIGIN/MAIN MOVED: dispatch quoted 7c12e475; the branch point is 8ccf7a1df and origin/main is 73053ed27. The carrier was located by grep, never by line number — it sat at 608 as assumption 1 predicted, not at the card's 613."
      ],
      "files_changed": ["skills/objectstack-platform/SKILL.md"],
      "mcp_calls": "14 cumulative for the whole run (10 through the first report, 4 since) — 2 issue_read get_comments for card threads, 1 create_pull_request, 2 issue_read get_labels (BOTH FAILED: 'Could not resolve to an Issue with the number of 16763' — that tool resolves only the Issue type and cannot read a PR's labels), 2 pull_request_read get (body read-back before and after the rewrite), 2 list_pull_requests (label read + comparative read-back), 2 issue_write update (label group, then the rewritten body), 2 add_issue_comment (this report and the earlier one), 1 issue_read get_comments reading a posted report back to its tail. REST was unavailable throughout, so only the card body could be moved off MCP, onto the zero-quota payload channel.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: content/docs/protocol/kernel/plugin-spec.mdx:708 prints \"typescript\": \"^5.0.0\" — a THIRD value, disagreeing with both the scaffolder (^5.3.0) and this skill. Out of scope by this card's own triage routing (content/docs/** is domain:devx) and the PM states it is already filed. Carrier: the domain:devx card the PM filed.",
        "noted, not filed: the four @objectstack/* ranges in the same block were re-checked against the workspace — spec, runtime, driver-memory, plugin-hono-server and cli are all at 17.3.0, which ^17.0.0 admits. No drift, nothing to file. Carrier: none needed.",
        "noted, not filed: this monorepo's own devDependency is typescript 6.0.3 while the scaffold policy emits ^5.3.0 to customer projects. That is a generated-app compatibility floor versus the repo's own build toolchain, not a contradiction, and it disturbs no ruling on this card. Recorded so the next reader does not re-open it as a finding. Carrier: none."
      ]
    }

    Generated by Claude Code

  8. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    ACCEPT — flight E, PR #16763 at head fff5997a1 (skills seat, hotlong, session session_01P58euzUXCVJNwmhuPC9DXY, contract-tier review in seat, 2026-09-08T04:27Z; the dev's two os-dev-report comments read, the seat disposition 5579125900 applied, the diff, body and check runs read on GitHub rather than the reports' narrative).

    Checklist: draft ✓, base main ✓, first line Fixes #16655 ✓ (the body's other card numbers carry no closing keyword); changed files 1 = the claim's declared surface ✓; diff is one value, ^6.0.0 → the range the seat itself read from packages/cli/src/commands/init.ts:312 at 02:47Z and the gate's own verdict line prints — read, not copied ✓; skip-changeset ✓ (skills/** publishes through no changeset, measured by the dev with a positive control); the block stays complete and its @objectstack/* ranges were re-checked current ✓; census re-run in the worktree: one carrier under skills/, the content/docs/** carrier is #16756, the template agrees with the scaffolder ✓; 21/21 derived gates exit 0 with --ran reconciled, the PREREQUISITE NOT MET exit 3 recorded and cleared by the build ✓; token ratchet flat at 12980/12984, lines and bytes unchanged ✓; governed predicate exit 3 ✓. The authority sentence is absent by the seat's disposition, not by budget defeat; the mechanical pin is #16767. CI on fff5997a1 at 04:23Z: Lint & Repo Gates in progress, the rest green or filter-skipped.

    Terminal: governed (skills/**) ⇒ the PR stays draft; needs-user-decision + the seat's 速读终稿 go on the PR; review requested from os-zhuang (MCP call with draft: true, read back), PR assigned to hotlong (author-identity fallback). This card stays pm:dispatched with its assignee until the merge closes it.


    Generated by Claude Code

  9. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    Landed (skills seat, 2026-09-08T06:25Z). PR #16763 merged through the merge queue at 06:24:16Z under os-zhuang's APPROVED review (review 5137957466 on head 5f9e16d7d…'s predecessor — the approval, ready flip and enqueue were all os-zhuang's own acts at 06:02Z; the seat touched neither the draft bit nor the queue). Landing reading: origin/main tip 47f751d5d = "docs(skills): platform skill's Complete Working Example prints the scaffolder's TypeScript range (#16763)", and git log -1 origin/main -- skills/objectstack-platform/SKILL.md names that commit. pm:dispatched and the assignee cleared in this same minute; domain:skills, documentation, priority:p3 stay (ownership, not state). skills/objectstack-platform/SKILL.md is free; #16767 (the gate pin on the published example block) is next on it, at the devx/cli seat's call.


    Generated by Claude Code

  10. removed their assignment
    on Sep 8, 2026
  11. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    Correction to the landing record above (seat error, 06:26Z): os-zhuang's APPROVED review 5137957466 (06:02:33Z) sits on the PR's head commit fff5997a1, not on "5f9e16d7d's predecessor" — 5f9e16d7d was the queue base at build time and has nothing to do with the review. The rest of the record stands: merged 06:24:16Z, origin/main tip 47f751d5d, labels and assignee read back clean (closed as completed by the merge).


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions