Skip to content

docs(skills): teach the stack's push block — direct transport, credentialRef only, relay not yet served - #30764

Draft
objectstack-fleet[bot] wants to merge 1 commit into
mainfrom
claude/project-thread-t2ftwd
Draft

objectstack-fleet[bot] wants to merge 1 commit into
mainfrom
claude/project-thread-t2ftwd

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

domain:skills#1 · os-elon-musk · session_016WV4d1hJHYMCXtCDZwGBLV

Fixes #30092

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:objectstack-platform 技能的运维参考页新增「Mobile push」一小节,讲清 stack 的 push 配置块怎么写;SKILL.md 里 requires 表的 push 那一格加了一个指向它的链接;skills(objectstack-platform): an eval case for the push capability and push stack key (follow-up of #29820) #29969 那条推送 eval 用例补上 transport: 'direct' 与 credentialRef 的断言。
  • 为什么改:技能原先只说有 push 这个键,没教怎么填。AI 要给 os serve 开推送时会去猜配置、可能把 APNs/FCM 密钥直接写进配置,或选一个尚未上线的中继通道。
  • 风险与回滚:纯技能文档 + eval,@objectstack/skills patch;token 棘轮靠同文件删除重复内容付账(SKILL.md −2、operations.md −3),未抬任何上限。回滚即撤这一个 commit。
  • 先看:① skills/objectstack-platform/references/operations.md 新增的 ## Mobile push 段;② 同文件里为付账删掉的两行「Common ops pitfalls」(与 Ports & networking 一节重复);③ evals/config-plugins-ops.json 第 12 条。
  • 两分钟验证:对照 packages/spec/src/system/push-config.zod.ts 与 packages/services/service-push/src/capability-arg.ts,确认今天只服务 direct、中继(含空 {})启动即拒、密钥只经 credentialRef。
  • 需要你做的:skills/** 属 Tier H,需一位受管审批人(os-zhuang 或 hotlong)批准后合并。

What changes

  • skills/objectstack-platform/references/operations.md gains ## Mobile push: requires: ['push'] reads the top-level push key (PushServiceConfigSchema); the served transport today is transport: 'direct' only, one block per vendor, at least one (apns: teamId, keyId, topic, environment, credentialRef; fcm: projectId, credentialRef); credentialRef names each secret and never holds it, and an inline privateKey / serviceAccount / PEM / JSON value is refused; the relay transport (also what {} or an absent key reads as) is refused at boot until its sender ships (service-push: send through the hosted relay transport (push-relay.zod.ts wire, cloud binding credential) #29920, open).
  • skills/objectstack-platform/SKILL.md: the requires table's service row points push at that section (one pointer, no new line).
  • skills/objectstack-platform/evals/config-plugins-ops.json case 12 (skills(objectstack-platform): an eval case for the push capability and push stack key (follow-up of #29820) #29969's): the expected output teaches the direct shape and the relay's status; must_contain gains transport: 'direct' and credentialRef, must_not_contain gains serviceAccount:. Case shape unchanged.
  • .changeset/30092-platform-skill-push-block.md: '@objectstack/skills': patch.

Facts read off origin/main 254f2ec1: packages/spec/src/system/push-config.zod.ts (the schema, its strictObject guidance maps for inline secrets, PushRelayTransportConfigSchema marked [PLANNED — not yet served]), packages/services/service-push/src/capability-arg.ts (resolvePushCapabilityArg throws when config.transport !== 'direct', absent and {} included) and src/credential.ts (open-tier resolver = environment variable named by the reference).

Token ratchet — paid by same-file deletion, no ceiling moved

File before after ceiling
skills/objectstack-platform/SKILL.md 6010 6009 6011
skills/objectstack-platform/references/operations.md 3119 3116 3119
bundle total (whole shipped tree) 226670 226666 —

Lines: SKILL.md 413 → 412; operations.md 199 → 212; all SKILL.md files summed 4523 → 4522.

Deleted restatement that paid for it:

  • operations.md: the os validate row's list of the three gates (the Verify-your-work section right below lists them); the "Use os validate as the fast inner-loop check…" sentence (the code block's comments say it); "run the same structural + semantic gates" → "Both run the same gates"; the os lint aside's example list; two Common-ops-pitfalls rows (Port N is already in use, better-auth Invalid origin 403) that restate the Ports & networking section's production row and sync list.
  • SKILL.md: the auth-callback example list in "auth implies email".

Tests

Docs and eval fixture only; no code behaviour changes, so no ablation.

Acceptance notes

Verification

Local runs on head a5d42984 (after pnpm install and a turbo run build of the @objectstack/spec / lint / formula / objectql closures under os-verify-lock).

node scripts/pm/dispatch-gates.mjs --ran → ✓ dispatch-gates --ran: 46 derived famil(ies) accounted for — 45 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3). pnpm lint exit 0.

NOT MEASURED: check:dual-build-cjs-loads, reason: PREREQUISITE NOT MET (needs every package's dist/, i.e. a whole-tree build); a skills/docs diff moves no build output, so it is left to CI.

Exit codes (45 + 1 + lint)
# head a5d42984
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-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-skills-token-ratchet.mjs :: exit 0
node scripts/check-skills-token-ratchet.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/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:changeset-gate-self-tests :: exit 0
pnpm check:ci-filter-parity :: 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 3
pnpm check:gitlink-declared :: exit 0
pnpm check:merge-driver :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:published-files :: 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:skill-top-level-keys :: exit 0
pnpm check:sourcemap-no-sources-content :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm lint :: exit 0
pnpm check:lean-entry-closure :: exit 0

@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#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

Contract-review-claim: session_016WV4d1mkgEris4MHHLjtnk · head a5d4298 · 2026-11-06T01:36Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: a5d429845d22aa0bff40f4f27daaabefeb498bcd
Local-runs: none
Scope: hits skills/objectstack-platform/SKILL.md, skills/objectstack-platform/references/operations.md, skills/objectstack-platform/evals/config-plugins-ops.json, .changeset/30092-platform-skill-push-block.md + cited on origin/main (adf6ee0; merge-base 254f2ec, no commit since touching the push sources) packages/spec/src/system/push-config.zod.ts, packages/spec/src/stack.zod.ts L1136-1150, packages/spec/src/shared/strict-object.ts, packages/services/service-push/src/{capability-arg.ts, capability-arg.test.ts, push-plugin.ts, push-plugin.test.ts, credential.ts}, scripts/check-skills-token-ratchet.mjs, AGENTS.md L1019-1026.

① Derived judgments

  • Accept set / public surface: unchanged. Diff touches only skills/** prose, one eval fixture and one changeset; no packages/**, no references/plugin-development.md (PR file list: 4 files). Clause-②: no and Metadata-protocol: none re-derived: correct.
  • "requires: ['push'] reads the top-level push key (PushServiceConfigSchema)": correct — stack.zod.ts L1145 (push: PushServiceConfigSchema.optional()), L1138-1140 read only under requires: ['push'].
  • "Served today: transport: 'direct' only, one block per vendor, at least one": correct — capability-arg.ts L66-71 throws when config.transport !== 'direct'; push-plugin.ts L96 same at init; push-config.zod.ts L257-262 (transport: z.literal('direct'), apns/fcm optional, .refine(requiredOneOf(['apns','fcm']))); relay schema marked [PLANNED — not yet served] L237-238.
  • Field names/enum: apns = teamId, keyId, topic, environment ('sandbox' | 'production'), credentialRef (L154-160); fcm = projectId, credentialRef (L183-185). Every name the skill and eval teach exists; no invented field; environment: 'production' is a valid enum value.
  • "credentialRef names each secret … an env-var name in the open tier": correct — credential.ts L16-21 (envPushCredentialResolver = process.env[ref]).
  • Never-inline rule, exactly what the schema does: it REFUSES, not merely documents. Both vendor blocks are strictObject (L139, L166), which is z.object(shape,{error}).strict() (strict-object.ts L110-111), so any undeclared key (privateKey, serviceAccount, key, p8, serverKey, …) fails parse, with the guidance entries (L144-151, L171-180) only shaping the message to prescribe credentialRef. A PEM/JSON value pasted into credentialRef itself is refused by regex /^[^\s{}]+$/ (L120-127). Both refusals fail the boot (capability-arg.ts L56-64) and are pinned in capability-arg.test.ts L60-82. The skill's sentence "privateKey, serviceAccount or a PEM/JSON value is refused" is accurate.
  • "The relay transport (also what {} or no key reads as) is refused at boot until its sender ships": correct — capability-arg.ts L54-55 (cfgPush = {}, raw = cfgPush ?? {}), L66-70; push-config.zod.ts L276-281 (absent transport tries relay first, so {} is relay); tests capability-arg.test.ts L43-56 (absent, null, {}, relay, staging endpoint all refused), push-plugin.test.ts L47-53. Relay sender = service-push: send through the hosted relay transport (push-relay.zod.ts wire, cloud binding credential) #29920, open (push-config.zod.ts L50; consistent with the card and dispatch).
  • Eval case 12: sibling shape held (keys id/prompt/expected_output/files/assertions{must_contain,must_not_contain} identical to cases 10, 11, 13). must_contain adds transport: 'direct' and credentialRef, both taught verbatim in the new ## Mobile push snippet; must_not_contain adds serviceAccount:, taught as refused. expected_output asserts only what the skill now teaches (field lists, env-var in open tier, relay refused at boot).
  • Token ratchet, hand-audited by the script's own convention (check-skills-token-ratchet.mjs L108-113; stamp line L20 of SKILL.md is 20 bytes): SKILL.md 24058→24056 bytes = 6010→6009 (ceiling 6011, L584); operations.md 12475→12464 bytes = 3119→3116 (ceiling 3119, L1017). Numbers in the PR body and dev report are exact; no ceiling moved.
  • Deleted sentences, each checked for another home: os validate row gate list → the three gates listed in Verify-your-work directly below (operations.md head L41-50); "fast inner-loop" sentence → the distinction survives in the code-block comments (L38-39: "no artifact" vs "emits dist/…") and the rule of thumb (L53-54) is kept; "same structural + semantic gates" → "Both run the same gates" (same meaning); os lint example list → the rule "separate pass, does not replace os validate" kept (L55-56), naming/namespace-prefix still taught in SKILL.md L121; pitfalls rows "Port N is already in use" and better-auth Invalid origin 403 → both restated in Ports & networking in the same file (L69-70 production fails loudly; L74-76 pin PORT; L78-83 Invalid origin 403 sync list); SKILL.md auth-callback examples → the rule (auth implies email, CLI appends it) kept, examples only; no eval in skills/** asserts those words. No rule dropped, no meaning change.
  • Pointer link ./references/operations.md#mobile-push matches the sibling form at SKILL.md L135, L293 (#ports--networking); anchor is the GitHub slug of ## Mobile push. No gate validates anchors (grep across scripts/check-skill*.mjs, packages/spec/scripts/build-skill-*.ts).

② Semver level

.changeset/30092-platform-skill-push-block.md: '@objectstack/skills': patch, body carries Clause-②: no and Metadata-protocol: none (AGENTS.md L1019-1023 requires both line-initial declarations). Docs + fixture only ⇒ patch is right; not skip-changeset.

③ Boundary flags

  • PR author user.login = objectstack-fleet[bot] (requested by os-elon-musk); no non-bot login to name.
  • Dev deviation 1 (pointer placed inside the existing requires table row, no new line): within the dispatch's "a pointer at most"; accepted.
  • Dev deviation 2 (Part-3 section list at SKILL.md L402 not extended, 2-token headroom): see should-fix 1; not a rule drop.
  • Dev deviation 3 (ratchet paid by deleting restatement): each deletion verified above; accepted.
  • open_questions: none. File surface held (⛔ references/plugin-development.md, ⛔ packages/** untouched). PR body Fixes #30092, Clause-②: no, Metadata-protocol: none present and correct.
  • Head check-runs at 2026-11-06T01:39Z: 16 success (incl. Check Changeset, Governed Surface Queue Guard, Lint · docs & code guards, Lint · ESLint, PR-body guards), 0 failed, 9 still in_progress (Build Core, Test Core 1/8 & 2/8, Type Check · consumer/debt/workspace, Lint · CI/release/engine, Lint · repo & tooling, Live E2E UI). Nothing red; landing still waits on all-green per contract-review.md ②.

④ Design judgment

  • references/operations.md: the ## Mobile push passage is the right home (sits beside the other stack-key ops sections; SKILL.md has 2 tokens headroom). Every taught claim is true against the schema and plugin (①). The snippet's teamId, keyId / projectId shorthand is illustrative and valid TS. Paid for by same-file deletion with no dropped rule. Holds.
  • SKILL.md: one-pointer change in the service row; the auth implies email rule intact. should-fix 1: the Part-3 nav line (L402) enumerates operations.md's sections and now omits Mobile push; add · Mobile push paid by 2-4 more tokens of same-file deletion (SKILL.md ceiling 6011, now 6009). Not blocking: no gate reads that list and the service-row pointer already routes the reader.
  • evals/config-plugins-ops.json: case 12 asserts exactly the taught shape, sibling shape unchanged, JSON valid. Holds.
  • .changeset: correct package, level and declarations. Holds.

Implemented-by: claude/project-thread-t2ftwd
Reviewed-by: session_016WV4d1mkgEris4MHHLjtnk

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

维护者速读

  • 改了什么:objectstack-platform 的 references/operations.md 新增 “Mobile push” 一节,讲清 push 配置块:目前只支持 transport: 'direct',每个厂商一块(apns / fcm,至少一个),密钥一律走 credentialRef(开源版是环境变量名),内联 privateKey、serviceAccount 或 PEM/JSON 会被拒;relay 传输(以及空 {})在其发送端上线前(service-push: send through the hosted relay transport (push-relay.zod.ts wire, cloud binding credential) #29920)会在启动时被拒。SKILL.md 只在服务表那一行加了指针,skills(objectstack-platform): an eval case for the push capability and push stack key (follow-up of #29820) #29969 的 eval 第 12 条同步断言新形状。
  • 为什么改:技能只说有 push 键,没说怎么填;AI 会猜配置、内联密钥,或选一个还没上线的 relay。
  • 风险与回滚:技能文档 + 一条 eval + changeset,不动代码;回滚即 revert 本 PR。
  • 先看:skills/objectstack-platform/references/operations.md 的 ## Mobile push 一节,以及为付 token 删掉的重复句(复核逐句核过,规则都另有归处)。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs | grep objectstack-platform,预期 SKILL.md 6009(上限 6011)、operations.md 3116(上限 3119),均未抬。
  • 需要你做的:批准并合并(skills/** 为 Tier H)。契约复核 PASS 评论 6674550414,Head-sha a5d429845d22aa0bff40f4f27daaabefeb498bcd。
  • 席位意见:可合。可选建议(SKILL.md L402 的章节导航补一个 “Mobile push”)没做,服务表指针已能导到,不值得再推一次。

席位核对 — ACCEPT · head a5d4298

  • 形态:4 文件(SKILL.md 一行、operations.md、evals/config-plugins-ops.json、根 changeset '@objectstack/skills': patch)。governed skills/**(Tier H)。Fixes #30092,draft,目标 main,作者 objectstack-fleet[bot]。
  • 契约:Clause-② no,Metadata-protocol none,与认领 6673997507 一致。
  • 前提实测:dev 报告 6674399992;每个字段、枚举和传输状态都对着 push-config.zod.ts、capability-arg.ts 及其测试核过。“禁止内联”是 schema 真的拒绝(strictObject + credentialRef 正则),不只是文档约定。
  • 门禁 check-runs:head a5d42984 上 41 个,28 success,13 skipped(UI/docs/opt-in 路径过滤预期 skip),0 红。
  • 接受的偏差:指针放在现有服务表行内,不新增行;token 由同文件删重复句付出。
  • 范围外去向:无。
  • 落地条款:Tier H,等 governed 审批人批准;批准后席位经中继 pr_ready + automerge_enable,合并后核 skills(objectstack-platform): the skill names the push key and capability but never teaches the push block's shape (transport, apns / fcm, credentialRef) #30092 已关、摘 pm:dispatched。

@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

1 participant