Repository navigation
docs(skills): the platform skill's operations reference says the official image refuses to start without its database and secrets - #30875
Conversation
…cial image refuses to start without its database and secrets The Docker / Kubernetes row and a Common ops pitfalls row teach what `os start` does under the image's `OS_DEPLOYMENT_DURABILITY_CHECK_ENABLED=true` preset (exit 1 naming the unset ones before any database file or secret is written; an explicit `file:` URL on a mounted volume passes) and how an upgrade keeps the values an old container generated under `/home/node/.objectstack`. Paid inside the file: the vitest block that plugin-development.md § Testing Plugins / § Using Plugins carries, the scaffolded-project spelling every domain skill's Verify section carries, the test-seed bullet the `os data` row and objectstack-data seeds.md carry, the cloud-connection plugin roster, and the intro sentence. The ratchet row moves down to the landed count. Eval 16 covers the upgrade path. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibyPEPCmwvSgLKLnUeg
|
domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u Contract reviewServed-tier: Inputs: card #30857 (body, triage 6679092587, Claim 6679846916, os-dev-report 6680471472), PR #30875 body and file list, the three-dot diff against ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS |
|
domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u 维护者速读
席位意见:契约复审 PASS,无必改、无建议修改。复审逐句对照了 席位核对ACCEPT · seat
|
Requested by Tesla · project thread
Fixes #30857
Clause-②: no
Metadata-protocol: none
Refs #30120 · PR #30720 (the
Skills-docs:follow-up it named as owed).维护者速读
OS_DATABASE_URL、OS_AUTH_SECRET、OS_SECRET_KEY三项,否则拒绝启动,显式指向挂载卷的file:地址可以过;「Common ops pitfalls」新增一行:镜像启动即退出并点名这三项时怎么办,升级时沿用旧容器/home/node/.objectstack下已生成的值(auth-secret、dev-crypto-key、data/objectstack.db),不要换新。另加评测用例 16 和 changeset。docker run;更糟的是升级时换上新密钥,所有已保存的凭据都读不出来、所有人被登出。skills/objectstack-platform/references/operations.md的 Docker / Kubernetes 行与「Common ops pitfalls」最后一行;其次被删的 Testing pattern 代码块(改为指向 plugin-development.md 的两节)。node scripts/check-skills-token-ratchet.mjs | grep operations.md应打印3108 / 3108;对照docker/README.md「What the image presets」与packages/cli/src/commands/start.ts的formatDurabilityRefusal,三个变量名与三个文件名应一致。skills/**需受管审批人 os-zhuang 或 hotlong 批准),之后席位落地。What changes
skills/objectstack-platform/references/operations.md(212 → 181 lines, 3116 → 3108 tokens, ceiling 3119 → 3108):ghcr.io/objectstack-ai/objectstack) refuses to start unlessOS_DATABASE_URL,OS_AUTH_SECRETandOS_SECRET_KEYare set at runtime, never baked in; an explicitOS_DATABASE_URL=file:/path/on/a/mounted/volume/app.dbpasses, so SQLite on a volume still works.OS_DEPLOYMENT_DURABILITY_CHECK_ENABLED=true, under whichos startexits 1 before it writes a database file or a secret when any of the three is unset; fix: set them on the run command, and on an upgrade keep the generated values from the old container's/home/node/.objectstack(docker exec CONTAINER cat FILE, or its volume):OS_AUTH_SECRETis the contents ofauth-secret,OS_SECRET_KEYthe contents ofdev-crypto-key, the data isdata/objectstack.db(OS_DATABASE_URL=file:…on the kept volume, or migrate it); fresh values leave every saved credential unreadable and sign everyone out.Every sentence is read off
main:docker/README.md("What the image presets"),content/docs/deployment/self-hosting.mdx("When the three are not set"), and the check itself inpackages/cli/src/commands/start.ts(readDurabilityCheckSignal,missingDurableVariables— an explicitfile:URL counts as chosen,isDefaultedDatabase;formatDurabilityRefusalprints the three file paths and exits 1 beforereadOrCreateAuthSecretruns).Paid inside the file (the headroom was 3 tokens). Each deletion, and where the content lives:
oscommand surface —npm installdoes not need to be re-run when commands are added"): no rule and no author action; the command tables under it are the content.npm run validate/npm run build" in Verify your work: the Verify section of every domain skill carries the scaffolded spelling (objectstack-ai, -api, -automation, -data, -formula, -query, -uiSKILL.md).CloudConnectionPlugin/createCloudConnectionPlugin,MarketplaceProxyPlugin,RuntimeConfigPlugin, "ship the Installed Apps page and marketplace Setup nav"): no author action; kept are the package, the ADRs and the one factos package installneeds —MarketplaceInstallLocalPluginserves the install-local endpoint (also on the docs pagedeployment/cli, underos package install);createCloudConnectionPluginstays inplugin-development.md§ Well-Known Plugin Names.describe/it, silent logger,bootstrap(),getService,shutdown()) isplugin-development.md§ Testing Plugins, and theObjectQLPlugin/DriverPlugin/InMemoryDriverimports are § Using Plugins. What was unique stays as prose: which three plugins a stack boot assembles, thatAppPluginis in@objectstack/runtimeandstackis the config's default export, with links to both sections.os datarow already says thedata:collection loads at boot, and objectstack-datareferences/seeds.mdcarries theenv: ['dev', 'test']scoping.No line was re-wrapped to win room. The section headings are unchanged, so
SKILL.mdL402's section list still holds and noSKILL.mdedit is needed.skills/objectstack-platform/evals/config-plugins-ops.json: case 16 (the platform evals cover deployment: case 6), spliced before the closing bracket so the file's formatting is untouched. Prompt: the official image on a kept volume, nothing set, exits after pulling the new tag; expected: set the three on the run command, carryauth-secret,dev-crypto-keyanddata/objectstack.dbover from/home/node/.objectstack, never fresh secrets.must_containthe three file names and the home path;must_not_containOS_DEV_CRYPTO_KEY(it does not count forOS_SECRET_KEY, PR #30720 acceptance notes).scripts/check-skills-token-ratchet.mjs: the operations.md row 3119 → 3108, pinned at the landed count (down only)..changeset/30857-image-secrets-refuse-start.md:'@objectstack/skills': patch, both declaration lines.Why
Since PR #30720 (ruling A3 on #30120) an agent that follows the skill as written produces a
docker runthe image refuses, and on an existing deployment may set fresh secrets, which makes every encrypted saved credential unreadable. The triage audit (6679092587) asks for the text to say keep the existing secrets on an upgrade; the pitfall row says it in bold.Tests
node scripts/check-skills-token-ratchet.mjs: exit 0;skills/objectstack-platform/references/operations.md 3108 / 3108 (+0);--self-test97 cases pass.skills/objectstack-platform/evals/config-plugins-ops.jsonparses; 16 cases, ids unique.--ranreconciliation: see Verification.Acceptance notes
os startrow ("It does not validate env or apply migrations") is unchanged: outside the image's preset that is still whatos startdoes; the Docker row and the pitfall carry the preset's refusal. Left as is, scope.nulland silently hides an action/validation", while the formula skill's Verify section says the engine throws at runtime and the rule fails loudly. One of the two is stale; not this card's surface, noted for the skills seat./home/node/.objectstackis the image's home for thenodeuser; the refusal prints the actual paths (and marks the ones present), so a customOS_HOMEis covered by reading the refusal.OS_DEPLOYMENT_DURABILITY_CHECK_ENABLED=falseescape is not taught; neitherdocker/README.mdnorself-hosting.mdxteaches it.skills/**): the sum of everySKILL.mdis 4523 lines before and after (noSKILL.mdtouched); the ratchet's shipped-bundle total is 227058 → 227374 tokens (+316: the eval fixture +324, operations.md −8).git push,pr_create, theos-dev-reportcomment. The harness's assignee / reviewer step is skipped (no MCP writes); the seat sets them at hand-over.Verification
Head
bc38b673(9db88a2 plus the merge ofmaincf478ea). Exit codes captured before any pipe, oneCOMMAND :: exit CODEline per command, then reconciled:bash scripts/pm/os-verify-lock.sh -c "pnpm build --filter='./packages/**' --concurrency=2":VERDICT command-exit 0, held the lock 402 s.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; the change set from the merge base): 62 commands, all 62:: exit 0— among themcheck:skills-token-ratchetand its--self-test(97 cases),check:skill-identifier-liveness,check:skill-frame-sync,check:skill-compatibility,check:skill-refs,check:pm-skill-id-lint,check:doc-authoring,check:empty-changeset,check:changeset-no-major,check:adr-0087-registration,check:doc-formula-expressions(after the packages build),check:comment-mask-corpus,check:pm-dispatch-gates,check:pm-governed-merges.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran LIST: "62 derived famil(ies) accounted for — 62 run, 0 NOT-MEASURED"; changed lines 78 (+36 / −42) against the 3000 threshold.pnpm lint,test:repoand the artifact-roster families are CI's run: the PR's check-runs.mainmoved by four commits after the push (to 18870c9); none touches the four files and agit merge-treeof the two is clean.Human Minimum
packages/specholds no runtime logic. (packages/specuntouched.)pnpm lintis CI's run.main, one pull request.packages/spectouched: its generated artifacts are regenerated and committed. (Not touched.)content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Generated by Claude Code