Skip to content

docs(skills): teach os deploy, the managed-package dev loop, in the platform skill - #31019

Draft
objectstack-fleet[bot] wants to merge 2 commits into
mainfrom
claude/project-thread-rh6ybb
Draft

objectstack-fleet[bot] wants to merge 2 commits into
mainfrom
claude/project-thread-rh6ybb

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Irene · project thread

Fixes #30968
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:objectstack-platform skill 现在教 os deploy:references/operations.md 的「Environments & deploy」表新增一行(何时用:在组织的开发环境上看到改动;入口 os deploy / npm run deploy / os dev 里按 d;如何选环境;--no-wait、--wait-timeout);表下一段讲 os deploy 退出码 1 的三种读法(写入前拒绝、环境自身构建失败、等待超时)及下一步。SKILL.md 的 Part 3 指针点名 os deploy。新增 eval 17。
  • 为什么改:PR feat(cli): os deploy — the managed-package dev loop in one command; installs pick the only environment, keep it across login, and refuse before any write #30933 已合入 os deploy,但 skill 里 0 处提到它,助手会继续教「先 os package publish 再手动安装」。
  • 风险与回滚:只改 skill 文本、一条 eval 和 operations.md 一行 token 天花板(+179,按裁决实测抬高);回滚即 revert,无运行时影响。
  • 先看:skills/objectstack-platform/references/operations.md 的 os deploy 行和其下的 exit 1 段落,对照 packages/cli/src/commands/deploy.ts 与 utils/install-target.ts。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs,预期 exit 0,两文件读数为 6011/6011 与 3287/3287。
  • 需要你做的:skills/** 属 Tier H,需要 os-zhuang 或 hotlong 批准。

What changes

Every flag, entry point and message the skill names was read from the landed CLI at 69e133ea0 (PR #30933, 780c6c34), not from the card:

Taught Source
os deploy builds, publishes <manifest.version>-dev.<timestamp>, installs, waits until served packages/cli/src/commands/deploy.ts header and steps 1–6; utils/dev-version.ts
npm run deploy packages/create-objectstack/src/templates/blank/package.json:13 and packages/cli/src/commands/init.ts:851 ("deploy": "objectstack deploy")
d in os dev packages/cli/src/utils/dev-deploy-key.ts (deployKeyHint: "Press d to deploy this app…")
Environment: --env <id>, else the one os environments switch recorded, else the organization's only one utils/install-target.ts resolveInstallTarget (flag → active → the only installable row)
Kept across os cloud login commands/cloud/login.ts mergeCloudLogin (same control plane and account)
--no-wait, --wait-timeout <seconds> (600) deploy.ts flags wait (allowNo) and wait-timeout (default 600)
A refusal before any write publishes nothing (not logged in, no / several / unreadable environments, local build, non-semver manifest.version) deploy.ts steps 1–4 ("write nothing anywhere") and their printError lines
With no environment at all, create one in the ObjectOS Cloud console install-target.ts refusal for zero candidates ("Create one in the ObjectOS Cloud console, then run this again.")
could not build …: <reason>, keeps serving the previous build reportVerdict case failed
Timed out after …; install recorded; a failing build reads as pending for minutes; --wait-timeout or the ObjectOS Cloud console reportVerdict case timeout

skills/objectstack-platform/evals/config-plugins-ops.json gains case 17: "I edited an object in my app locally. How do I see my change on my ObjectOS Cloud environment?" expects os deploy; its must_contain is os deploy alone (what any correct answer carries, and in its own expected_output); must_not_contain: os push (the name PR #30933 rejected). No existing eval in the skill teaches the old publish-then-install loop (grep -n -i "deploy\|package publish" skills/objectstack-platform/evals/).

Token budget

Readings from node scripts/check-skills-token-ratchet.mjs:

File Before (69e133ea0) After Ceiling before → after
skills/objectstack-platform/SKILL.md 5998 6011 6011 → 6011 (unchanged; the pointer fits the 13 headroom)
skills/objectstack-platform/references/operations.md 3108 3287 3108 → 3287
bundle total (whole shipped tree, eval included) 228186 228660 —

The order measured operations.md at 3116/3119; on 69e133ea0 it reads 3108/3108 (headroom 0), reported to the seat before editing.

Deleted in operations.md first (restatement, each with its surviving home in the same file):

  1. The os dev row's "The seeded admin is promoted to platform admin, so Setup/Studio work on first login." Home: Common ops pitfalls, "Login works but Setup / Studio missing" (auto-granted to the first registered human; "--seed-admin/--fresh does this").
  2. The os validate row's "the os build gates, no artifact emitted". Home: Verify your work, the code block (os validate … — no artifact; os build # the same three gates, plus emits dist/objectstack.json), which the row still links.
  3. "Both run the same gates:" before the numbered gate list. Home: the line above it, os build # the same three gates ….
  4. The Docker / Kubernetes row's "refuses to start unless OS_DATABASE_URL, OS_AUTH_SECRET and OS_SECRET_KEY are set" (review S5). Home: Common ops pitfalls, "The official image exits at start naming OS_DATABASE_URL / OS_AUTH_SECRET / OS_SECRET_KEY". The row keeps the image name, "at runtime, never baked in" and the SQLite-on-a-volume line.

Review round 1 (contract review PASS at 965b2d64, comment 6691650241): S1 eval must_contain trimmed to os deploy; S4 the os package publish row keeps main's "versioned package" (it publishes whatever manifest.version or --version says); S5 deletion 4 above saved 12 tokens, which S3 spent exactly (the zero-environment remedy), so the measurement stays 3287 and the row is unchanged. S2 (the post-write cases: another install replaced it, an unreadable installation, a publish that reported no install) does not fit inside that saving and is left out; the skill teaches the three cases the card names.

The remainder, +179 measured, raises only the operations.md row, pinned at the measurement, under the standing ruling quoted in scripts/check-skills-token-ratchet.mjs (ruling record 6513306068 on #27847), maintainer ruling 2026-10-27, tap A, verbatim: 「A:先削重复,余额按实测提高」.

Review tier

dispatch-gates mandates the contract-review tier for skills/** (clause ①); waived by the maintainer's standing order in this project (2026-11-03). The seat runs the contract review.

Gates

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 2586f5ac (5 paths vs merge base 69e133ea0): 65 commands, each run under timeout 900 with NODE_OPTIONS=--max-old-space-size=8192 after a full pnpm build (119/119 tasks), exit code captured before any pipe → 65 × exit 0 (the first round at 965b2d64 was also 65 × exit 0). --ran reconciliation: 65 derived famil(ies) accounted for — 65 run, 0 NOT-MEASURED. node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD → exit 0 before each push. origin/main is now 33bc8ae5f; since the branch point it touches skills/objectstack-ai, objectstack-api and objectstack-data but no objectstack-platform file and not scripts/check-skills-token-ratchet.mjs, and git merge-tree merges it cleanly, so the per-file readings above stand (the bundle total is this branch's own tree).

Ran list
node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0
node scripts/check-adr-0087-registration.mjs --self-test :: exit 0
node scripts/check-changeset-no-major.mjs --base origin/main :: 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-declaration-mirrors.mjs :: exit 0
node scripts/check-declaration-mirrors.mjs --self-test :: 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-dts-emitted.mjs --self-test :: exit 0
node scripts/check-empty-changeset.mjs --base origin/main :: exit 0
node scripts/check-empty-changeset.mjs --self-test :: exit 0
node scripts/check-self-test-wired.mjs :: exit 0
node scripts/check-self-test-wired.mjs --self-test :: exit 0
node scripts/check-self-test-workflow-commands.mjs :: exit 0
node scripts/check-self-test-workflow-commands.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
node scripts/check-whole-set-label-write.mjs :: exit 0
node scripts/check-whole-set-label-write.mjs --self-test :: exit 0
node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0
node scripts/ci/snapshot-next.mjs --self-test :: exit 0
node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0
node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0
node scripts/release-pending-publish.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm --filter @objectstack/spec run check:skill-docs :: exit 0
pnpm --filter @objectstack/spec run check:skill-refs :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:bash32-floor :: exit 0
pnpm check:changeset-gate-self-tests :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:cli-command-ids :: exit 0
pnpm check:closed-ceremony-text :: 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:dts-closure :: exit 0
pnpm check:dual-build-cjs-loads :: exit 0
pnpm check:entry-guard :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:lean-entry-closure :: exit 0
pnpm check:merge-driver :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:parse-guard :: exit 0
pnpm check:pm-dispatch-gates :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pnpm-filter-targets :: exit 0
pnpm check:pnpm-flag-spellings :: exit 0
pnpm check:published-files :: exit 0
pnpm check:ratchet-remedy-authority :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:role-word :: exit 0
pnpm check:scripts-symbol-anchors :: exit 0
pnpm check:skill-compatibility :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:skill-identifier-liveness :: exit 0
pnpm check:skill-top-level-keys :: exit 0
pnpm check:sourcemap-no-sources-content :: exit 0
pnpm check:watch-hint-literal :: exit 0

🤖 Generated with Claude Code

https://claude.ai/code/session_01J8VVAnbXbG1XBtvCznvwYJ

The operations reference gains an os deploy row and a paragraph on reading
its exit 1, the SKILL.md Part 3 pointer names it, and one eval case expects
it. Paid by deleting three restatements in operations.md; the remainder
raises that file's token ceiling by the measurement.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAnbXbG1XBtvCznvwYJ
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 6, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

Contract-review-claim: session_01J8VVAj7CvjkGXvgXzd6RZ7 · head 965b2d6 · 2026-11-06T17:48Z

The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent. No review seat (lanes/review.md) is seated.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 965b2d6406dac973f5c441678e69627df58ca078
Local-runs: none
Scope: skills/objectstack-platform/SKILL.md, skills/objectstack-platform/references/operations.md, skills/objectstack-platform/evals/config-plugins-ops.json, scripts/check-skills-token-ratchet.mjs + packages/cli/src/commands/deploy.ts, packages/cli/src/utils/install-target.ts, packages/cli/src/utils/dev-version.ts, packages/cli/src/utils/dev-deploy-key.ts, packages/cli/src/commands/dev.ts (the key's wiring), packages/cli/src/commands/cloud/login.ts (mergeCloudLogin), packages/cli/src/commands/package/publish.ts, packages/cli/src/commands/init.ts (app template scripts), packages/create-objectstack/src/templates/blank/package.json, packages/skills/package.json, .changeset/skills-platform-os-deploy.md, .github/workflows/lint.yml (which job runs the ratchet)

Read: card #30968 body and both comments (triage 6687827927, claim 6690835677); PR #31019 body and its 5-file list; the net diff 69e133ea0..965b2d64 (merge base of origin/main bcf8a37e0, whose 4 later commits touch only three unrelated .changeset/*.md files, nothing under skills/** or the ratchet script); the head's 39 check-runs.

① Derived judgments

  • Accept-set: the operations.md ceiling row, 3108 → 3287. Right. This is the only CEILINGS row the diff moves (one -/+ row pair in scripts/check-skills-token-ratchet.mjs). skills/objectstack-platform/SKILL.md keeps its row at 6011. The full judgment is under ④ (ratchet raise).
  • Public surface: @objectstack/skills ships skills/** (packages/skills/package.json: "the repository's skills/** tree"). The diff changes taught prose in operations.md, a pointer line in SKILL.md and one eval case. It changes no schema, no CLI behaviour and no exported symbol. Right: this is a docs patch to that package.
  • Not published: scripts/check-skills-token-ratchet.mjs is a repository gate script and does not ship. Right that the changeset does not name it.
  • Gate verdicts (check-runs on the head), at read time: 18 completed success, 13 skipped (UI, docs, opt-in and path-filtered jobs), 8 in_progress, 0 failed.
    • Succeeded: Type Check · source gates, the job that runs check-skills-token-ratchet.mjs and its --self-test plus check:skill-docs and check:skill-refs (lint.yml job typecheck-source-gates). Also Check Changeset, Governed Surface Queue Guard, PR-body guards, Lint · ESLint, Lint · repo & tooling gates, Build Core, Test Core (3/8), Type Check · workspace and Type Check · debt ledger.
    • Still running: Lint · docs & code guards (it carries check:skill-identifier-liveness), Lint · CI, release & engine gates, Lint · PM dispatch-gates, Lint · scoped · slot lookup & corpus, Lint · scoped · tooling self-tests, Type Check · consumer gates, Test Core (1/8) and Test Core (2/8).
    • What this means: this PASS judges the contract only. The merge still needs those 8 to finish green.

② Semver level

  • Changeset: '@objectstack/skills': patch. It matches what the diff publishes: taught text and an eval in the published skills tree, with no new or changed API. Patch is the right level. A minor would overstate a docs change, and skip-changeset would be wrong because the shipped tree changes.
  • Clause-②: no. Right. No published schema, protocol type or governed rules surface is touched.
  • Metadata-protocol: none. Right. No metadata kind, field or protocol shape changes.
  • Changeset prose: it describes the tree accurately, including the three deletions and the measured raise. One wording point: it calls the published version "release". That is the same nuance as should-fix S4 below.

③ Boundary flags

  • Review-tier "waiver". The PR body says the clause-① contract-review tier for skills/** was waived by the maintainer's standing order, and that the seat runs the review. This record is served at CONTRACT_REVIEW_TIER regardless, so nothing is actually waived for this head. Answered.
  • Order vs tree reading. The dispatch order measured operations.md at 3116/3119. The base tree reads 3108/3108. Measured here as ceil(12432 / 4) = 3108, with ceiling 3108 at 69e133ea0. The PR body's base figure is right and the order's was stale. Answered.
  • origin/main moved to bcf8a37e0. Verified: its 4 commits touch no skills/** file and not the ratchet script. The readings stand. Answered.
  • Tier H approval (os-zhuang or hotlong) for skills/** is outside this record and stays owed.
  • No other dev flag or open question in the body.

④ Design judgment

skills/objectstack-platform/references/operations.md: the os deploy row, the os package publish edit and the exit-1 paragraph. Each claim below was checked against packages/cli at the head. os deploy landed as 780c6c34, PR #30933.

Entry points

  • os deploy: exists (commands/deploy.ts).
  • npm run deploy: true for both scaffolds. The blank template has "deploy": "objectstack deploy", and it is create-objectstack's only bundled template. os init's app template has deploy: 'objectstack deploy' at init.ts:851.
  • d in os dev: true. startDevDeployKey is attached on first boot (dev.ts:961), and deployKeyHint reads "Press d to deploy this app…". Two unstated details, both harmless: the key is offered only on a TTY, and when not logged in it runs os cloud login first.

What it does: "build, publish manifest.version-dev.TIMESTAMP, install, wait until served"

  • True: steps 3, 5 and 6 of deploy.ts, and dev-version.ts.
  • Compressed edge cases, acceptable for a table row:
    • a manifest.version that is already a pre-release gains .dev.TS;
    • an absent version mints 0.0.0-dev.TS.

Environment selection: "--env, else the one os environments switch recorded, else your organization's only one"

  • Exactly resolveInstallTarget: flag, then active, then the only installable row.
  • Not taught, and nothing claimed wrongly:
    • --env is also filled from $OS_ENVIRONMENT_ID;
    • os environments create --activate also records the active environment.
  • "Kept across os cloud login" is true: mergeCloudLogin carries activeEnvironmentId. It holds only for the same control plane and the same account, which a table row can leave unsaid.
  • The skill correctly attaches "kept" to the switch-recorded choice and not to the only-environment pick. The card's paraphrase ("picks the only environment and keeps the choice") was loose, and the tree follows the code, not the card.

Flags

  • --no-wait: wait is allowNo, default true.
  • --wait-timeout, in seconds, default 600: Flags.integer, default: 600, min: 1. The stated default matches.
  • -s/--server and -t/--token exist and are not taught. They are uncommon overrides, so not a gap.

Exit-1 readings

  • "A refusal before any write publishes nothing": true. Steps 1–4 write nothing anywhere ("Steps 1–4 write nothing anywhere"), and their messages are:
    • "Not logged in to ObjectOS Cloud. Run os cloud login first…";
    • the resolveInstallTarget refusals for none, several or an unreadable list;
    • "The build failed — … Nothing was published.";
    • the devVersion semver refusal.
    • The remedies named fit all but one: see S3.
  • "could not build …: reason, keeps serving the previous one; fix and deploy again": matches reportVerdict's failed case word for word in substance.
  • "Timed out after …: install recorded, a failing build reads as pending for minutes; deploy again with a longer --wait-timeout, or see the build in the console": matches the timeout case.
    • The CLI says "wait longer with --wait-timeout". There is no wait-only command, so "deploy again with" is the only way to act on it. True.

Deploy vs os package publish

  • os deploy: always mints a -dev.TS pre-release, always installs it, and waits.
  • os package publish: publishes the version manifest.version or --version names. Install is optional (--install), and it never waits. deploy.ts's own header calls this "publish a RELEASE".
  • The contrast the skill draws holds. The bold "release" overstates one edge case: see S4.

Ratchet raise (must judge)

  • (a) Real deletion in the same file, each passage's facts kept at a named home in that file. Each was checked in the head blob:
    1. Deleted: the os dev row's "The seeded admin is promoted to platform admin, so Setup/Studio work on first login." (89 B). Home: the "Setup / Studio missing" pitfall. It keeps the rule: auto-granted to the first registered human, usr_system skipped, and "--seed-admin/--fresh does this". No rule lost.
    2. Deleted: the os validate row's ": the os build gates, no artifact emitted" (43 B). Home: the Verify-your-work block, which the row still links: "os validate … — no artifact", "os build # the same three gates, plus emits dist/objectstack.json". No rule lost.
    3. Deleted: "Both run the same gates:" (26 B). Home: the same block's "the same three gates". The numbered list still reads correctly after the code block, and "Both exit non-zero…" keeps its referent. No rule lost.
  • (b) Ruling quoted in the PR body. Yes, verbatim, with its record: 「A:先削重复,余额按实测提高」, record 6513306068 on [Decision] skills token ratchet: price evals/** out (they never enter a customer context), and make the standing 「先削重复,余额按实测提高」 ruling the gate-recognised path for teaching text — or keep the per-raise ruling round #27847. The new script comment cites it in the same form as the seeds.md row above it.
  • (c) Moved only by the measured remainder and pinned at the measurement.
    • Head blob is 13145 bytes, and ceil(13145 / 4) = 3287. This file is not a stamped SKILL.md, so the 20-byte release-stamp line rule does not apply.
    • The row is 3287, so it is pinned at the measurement. The raise is +179 = 3287 − 3108.
  • SKILL.md stays within its ceiling. Head 24064 B minus the 20-byte stamp line ( version: "18.3.0") gives ceil(24044 / 4) = 6011, against a 6011 ceiling. The pointer spends exactly the 13 tokens of headroom (5998 → 6011), and the row is unchanged.
  • No other row moved.
  • 10402 proportionality. About 815 B of new teaching (row ≈ 390 B, paragraph ≈ 425 B) covers a whole new command:
    • three entry points;
    • the selection rule;
    • two flags with a default;
    • three failure readings, each with a next step.
    • That is roughly 200 tokens of content, paid down by about 40 tokens of deleted restatement. Proportionate.
    • One same-file overlap could still have paid about 15–20 tokens. The Deployment-targets Docker row's "refuses to start unless OS_DATABASE_URL, OS_AUTH_SECRET and OS_SECRET_KEY are set" repeats the official-image pitfall row ("with any of the three unset, os start exits 1"). This is small next to +179 and not a reason to fail: S5.

skills/objectstack-platform/SKILL.md: the Part 3 pointer. It names os deploy "to see an edit on your Cloud environment". That is true and links the home that carries the detail. Nothing in the skills tree still teaches a publish-then-install loop: git grep "package publish\|--install" skills/ outside evals shows only the rewritten row.

skills/objectstack-platform/evals/config-plugins-ops.json, case 17.

  • The prompt fits the card's acceptance. It asks "how do I see my change on my ObjectOS Cloud environment" and expects os deploy.
  • Every must_contain term appears in the case's own expected_output. Checked for every case, 1–17: no term is missing, and must_not_contain (os push) does not appear.
  • expected_output is true to the CLI. Each statement in it was checked against the code above.
  • But a correct answer would not reliably carry three of the four terms: S1.

scripts/check-skills-token-ratchet.mjs.

  • One row and its comment changed.
  • The comment truthfully records what was deleted, where each fact now lives, the measured remainder and the ruling.
  • No counting logic changed.

Findings

  • Must-fix: none.
  • S1 (should-fix): eval 17 asks for more than a correct answer gives.
    • --no-wait, --wait-timeout and, for an organization with one environment, --env are not part of a correct answer to "how do I see my change". The right answer is "run os deploy" (or npm run deploy, or d).
    • So the case will fail a correct, concise answer and measure flag recall instead.
    • Fix: trim must_contain to os deploy, or widen the prompt so it asks about several environments, returning early and a slow build.
  • S2 (should-fix): the exit-1 paragraph reads as complete but leaves out three exit-1 verdicts that come after the write. Each has its own next step:
    • superseded: "no longer points at … another install replaced it". Next step: run os deploy again.
    • unreadable: installed, but the install cannot be read back.
    • "published … but did not report installing it". Next step: check the console.
    • Fix: name them in a clause, or present the three it covers as the common ones.
  • S3 (should-fix): one refusal has the wrong remedy. With zero installable environments the CLI says "Create one in the ObjectOS Cloud console". The skill's "pick an environment (--env)" fits only the several-environments and unreadable-list refusals. The CLI's remedy also names os environments switch and $OS_ENVIRONMENT_ID.
  • S4 (should-fix): "release" on the os package publish row overstates one case. That command publishes whatever manifest.version or --version says. It flags -alpha, -beta, -rc, -dev and --pre-release versions as pre-releases, and a versionless artifact mints 0.0.0-dev.TS. "The version manifest.version names" is exact. The contrast with os deploy holds either way.
  • S5 (should-fix, 10402): a restatement is left that could have paid more. The Docker row restates the official image's three required variables, which the image pitfall row also states. About 15–20 tokens could have been deleted before raising the ceiling.

Implemented-by: claude/project-thread-rh6ybb
Reviewed-by: session_01J8VVAj7CvjkGXvgXzd6RZ7

VERDICT: PASS

The eval case asks only for os deploy, the os package publish row keeps
"versioned package", the Docker row drops its restated list of the
official image's variables (the image pitfall row holds it), and the
refusal clause says to create an environment when there is none.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAnbXbG1XBtvCznvwYJ
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

Contract-review-claim: session_01J8VVAj7CvjkGXvgXzd6RZ7 · head 2586f5a · 2026-11-06T18:18Z

Delta review against the PASS at head 965b2d6 (comment 6691650241, should-fixes S1–S5). The delta is one commit answering S1, S3, S4 and S5, plus the PR body. The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 2586f5ac4187eea4c2119d03595a9e8a576dab87
Local-runs: none
Scope: skills/objectstack-platform/SKILL.md, skills/objectstack-platform/references/operations.md, skills/objectstack-platform/evals/config-plugins-ops.json, scripts/check-skills-token-ratchet.mjs + packages/cli/src/commands/deploy.ts, packages/cli/src/utils/install-target.ts, packages/cli/src/commands/package/publish.ts, packages/cli/src/utils/dev-version.ts, packages/cli/src/utils/dev-deploy-key.ts, packages/cli/src/commands/cloud/login.ts, packages/cli/src/commands/init.ts, packages/create-objectstack/src/templates/blank/package.json, .changeset/skills-platform-os-deploy.md

This is a delta review. 2586f5ac is one commit, "address the os deploy review findings", on top of 965b2d64, the head the round-1 PASS judged. The merge base with origin/main is still 69e133ea0.

What was read:

  • the commit's diff;
  • the net diff of the whole PR against the merge base;
  • the patched PR body (v2);
  • the head's check-runs.

Everything round 1 judged and this commit leaves byte-identical stands as judged. That covers:

  • the os deploy row;
  • the d key and npm run deploy claims;
  • the environment-selection rule;
  • the could not build and timeout readings;
  • deletions 1–3 and their homes;
  • the SKILL.md pointer.

① Derived judgments

  • Accept-set. The ratchet row is still ['skills/objectstack-platform/references/operations.md', 3287]. That is one row pair changed in the net diff, 3108 → 3287. The commit edits only that row's comment. SKILL.md stays at 6011, and no other row moves. Right.
  • Public surface. The net diff is unchanged in kind: taught prose and one eval in the skills/** tree that @objectstack/skills ships. No schema, CLI or export changes. Right.
  • Main drift. origin/main is now 33bc8ae5f, 12 commits past the merge base. Its skills/** changes are objectstack-ai/SKILL.md, objectstack-api/SKILL.md with its eval, and objectstack-data/SKILL.md. None is an objectstack-platform file, and it does not touch scripts/check-skills-token-ratchet.mjs. So this PR's per-file readings and its row stand. That matches the PR body's statement.
  • Check-runs on 2586f5ac, at read time. There are 43 runs, some duplicated by re-runs after the body edit. None has failed.
    • Succeeded: Check Changeset (one run), Governed Surface Queue Guard, PR-body guards (×2), Check PR Size, Auto Label, Dogfood Regression Gate, Plan Test Core shards, Test UI and filter.
    • Skipped: 15, all path-filtered or opt-in.
    • Still running: Type Check · source gates (the ratchet job, with check:skill-docs and check:skill-refs), Lint · docs & code guards (check:skill-identifier-liveness), Build Core, Check Changeset (re-run), Lint · ESLint, Lint · repo & tooling gates, Lint · CI, release & engine gates, Lint · PM dispatch-gates, the three Lint · scoped jobs, Live E2E UI, and Type Check workspace, debt ledger and consumer gates.
    • Queued: Test Core 1/8, 2/8 and 3/8.
    • For merge: this PASS judges the contract. The merge still needs every in-progress and queued run green.

② Semver level

  • Changeset: unchanged at '@objectstack/skills': patch, Clause-②: no, Metadata-protocol: none. It is still right for a docs and eval change to the shipped skills tree.
  • Changeset prose now matches the tree:
    • It drops the "release version" sentence, and the publish row is main's wording again.
    • It adds the zero-environment remedy.
    • It counts four restatements deleted, naming the Docker row's three-variable list as the fourth.
    • Each statement is true of the head blob.

③ Boundary flags

  • S1, S3, S4 and S5. The PR body says each is addressed. Each is verified against the tree in ④.
  • S2 is left out on purpose, and the body says so. The paragraph covers the post-write exit-1 cases it omits: superseded, unreadable, and "published … but did not report installing". The body's reason is budget, plus the card's scope of three cases.
    • Judged acceptable as a should-fix carried forward. Nothing the paragraph says is false. The card's "Expected" names exactly the three cases taught. The omitted verdicts each print their own next step on the terminal.
    • Carried forward as S2, not escalated.
  • Earlier flags. The review-tier "waiver" is moot, because this record is served at tier. Tier H approval from os-zhuang or hotlong is still owed. Both stand as in round 1.
  • Body claims not verified. The body cites "comment 6691650241" as the round-1 record and gives a bundle total of 228660. Neither was checked: the first is not a tree claim, and the bundle total is not ratcheted.

④ Design judgment

S1: evals/config-plugins-ops.json, case 17.

  • must_contain is now ["os deploy"]. It appears in the case's own expected_output, and must_not_contain (os push) does not.
  • A correct answer to "how do I see my change on my ObjectOS Cloud environment" carries os deploy.
  • expected_output is unchanged and still true to the CLI.
  • Fixed.

S4: the os package publish row.

  • The row is byte-identical across the merge base, origin/main and the head (same sha1 of the line). It reads "as a versioned package".
  • That is true of package/publish.ts: it publishes manifest.version or --version, or 0.0.0-dev.TS when the artifact has no version, as a versioned package.
  • The deploy-vs-publish contrast still holds through the os deploy row's own "publish … -dev.TIMESTAMP, install, wait". The card's "contrast it with os package publish" is met by the row pair.
  • Fixed.

S5: the Docker / Kubernetes row deletion. Do all its facts survive?

  • Deleted: "refuses to start unless OS_DATABASE_URL, OS_AUTH_SECRET and OS_SECRET_KEY are set at runtime, never baked in", replaced by "its required variables (pitfalls below) set at runtime, never baked in".
  • Home: the pitfall row "The official image exits at start naming OS_DATABASE_URL / OS_AUTH_SECRET / OS_SECRET_KEY" (operations.md line 182). It carries:
    • all three names;
    • the refusal: with any of the three unset, os start exits 1 before it writes a database file or a secret;
    • the why: the preset OS_DEPLOYMENT_DURABILITY_CHECK_ENABLED=true;
    • the remedy: set the named ones on the run command, which is at runtime.
  • The Docker row keeps three facts the pitfall row lacks:
    • "never baked in";
    • the image name;
    • "an explicit OS_DATABASE_URL=file:… on a mounted volume passes".
  • No rule is lost. This is a genuine same-file deletion.
  • Wording, should-fix N1. "The official image (…): its required variables (pitfalls below) set at runtime, never baked in" is a verbless fragment. "Pitfalls below" is plain text rather than an anchor link. "Passes" no longer has a refusal stated in the row for it to pass. A reader still recovers the meaning, so this is not a must-fix.

S3: the zero-environment remedy against install-target.ts.

  • The skill now reads "pick an environment (--env; none: create one in the ObjectOS Cloud console)".
  • The zero-candidate refusal in resolveInstallTarget reads: "… and your account has none on BASEURL. Create one in the ObjectOS Cloud console, then run this again." followed by the shared remedy (--env, $OS_ENVIRONMENT_ID, os environments switch).
  • The several-environment and unreadable-list refusals carry --env as the skill says.
  • os environments switch is taught in the os deploy row just above, so leaving it out of the paragraph is not a gap.
  • Fixed, and true to the code.

Ratchet: is the row still pinned at the measurement?

PR body (v2) against the tree.

  • These statements match the head:
    • the "What changes" table, including the new zero-environment row and its install-target.ts source;
    • the eval paragraph;
    • deletion 4 and its home;
    • the readings 6011/6011 and 3287/3287.
  • The body's quotation of deletion 4 shortens the deleted text: it ends at "are set" and moves "at runtime, never baked in" to what the row keeps. That is accurate, because the row keeps that clause.

Findings

  • Must-fix: none.
  • S2 (should-fix, carried forward from round 1): the exit-1 paragraph omits the post-write verdicts superseded, unreadable, and "published … but did not report installing". Acceptable as a follow-up, as judged in ③.
  • N1 (should-fix, new): the rewritten Docker row's fragment "its required variables (pitfalls below) set at runtime, never baked in".
    • Give it a verb, for example "needs its required variables (see the image pitfall) set at runtime".
    • Make "pitfalls below" a link to #common-ops-pitfalls.
    • This costs a few bytes inside the current token headroom of 0, so it would need another small deletion.

Implemented-by: claude/project-thread-rh6ybb
Reviewed-by: session_01J8VVAj7CvjkGXvgXzd6RZ7

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

维护者速读

  • 改了什么: objectstack-platform 技能教 os deploy:什么时候用(把改动装进组织的开发环境看效果)、与 os package publish 的区别、三个入口(os deploy、脚手架的 npm run deploy、os dev 里按 d)、环境怎么选与记住、--no-wait / --wait-timeout、三类失败怎么读。主教学在 references/operations.md,SKILL.md 加一行指针,eval 加第 17 例。5 个文件,+43/−7。
  • 为什么改: os deploy 已随 PR feat(cli): os deploy — the managed-package dev loop in one command; installs pick the only environment, keep it across login, and refuse before any write #30933 合入,技能里一处都没有,助手会继续教「先 publish 再手动装」(skills(objectstack-platform): teach os deploy, the managed-package dev loop (when to deploy, the command, reading a refusal or a failed build) #30968)。
  • 风险与回滚: 只改技能文字与一个 eval,无代码改动。SKILL.md 6011/6011 不动;operations.md 先删同文件四处重复说法,余量按维护者既有裁决(「A:先削重复,余额按实测提高」,记录 6513306068)把上限从 3108 提到实测 3287(+179)。可整 PR revert。
  • 先看: skills/objectstack-platform/references/operations.md 的 Environments & deploy 表与 scripts/check-skills-token-ratchet.mjs 中该行。
  • 两分钟验证: node scripts/check-skills-token-ratchet.mjs | grep operations.md 显示 3287 / 3287。
  • 需要你做的: skills/** 是受治理 Tier H 面,且本 PR 抬了一行棘轮上限,需 os-zhuang 或 hotlong 在 GitHub 上 Approve 一次。达档复核:全量 6691650241 PASS(S1–S5),增量 6692179454 PASS,Head-sha 2586f5ac4187eea4c2119d03595a9e8a576dab87。批准后本席落地。
  • 席位意见: ACCEPT。

席位核对 — ACCEPT · domain:skills#3 · head 2586f5ac4187eea4c2119d03595a9e8a576dab87

  1. 形态: draft → main,Fixes #30968;'@objectstack/skills': patch,Clause-②: no,Metadata-protocol: none;作者 objectstack-fleet[bot];5 个文件,在认领面之内。
  2. 前提实测: 复核逐项对照 packages/cli:入口、--env / 记录的环境 / 唯一环境的选取顺序、登录后保留、--no-wait、--wait-timeout 默认 600、写前拒绝、could not build、Timed out after、零环境时去 ObjectOS Cloud 控制台创建,均存在且措辞一致。删掉的四处说法在同文件各有落脚点,无规则丢失。
  3. 门禁(钉 head 2586f5ac): dev 派生门禁 65 条全部 exit 0;check-runs 46 条全部完成,31 success、15 skip、0 failure。check-governed-merges:Tier H(skills/**)。
  4. 接受的偏差: S2(exit 1 段未列写入后的三种失败:superseded、unreadable、已发布但未报告安装)未修,同文件无余量;所述皆真,每种失败自带下一步提示。N1:Docker 行改写后少一个动词,属措辞,不影响事实。
  5. 范围外去向: S2 与 N1 留给下一次碰 operations.md 的改动顺手补。Skills-docs: self。
  6. 落地条款: Tier H。保持 draft,挂 pm:awaiting-merge,请 os-zhuang、hotlong 审批;获批后本席过落地前检、清标、ready、auto-merge;维护者直合亦可。

@objectstack-fleet objectstack-fleet Bot added the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 6, 2026

This branch has not been deployed

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

Labels

documentation Improvements or additions to documentation pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue size/s tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

skills(objectstack-platform): teach os deploy, the managed-package dev loop (when to deploy, the command, reading a refusal or a failed build)

1 participant