Uh oh!
There was an error while loading. Please reload this page.
fix(spec): rewrite skill.zod.ts's two @example blocks off the retired triggerPhrases - #11402
Conversation
… triggerPhrases Both TSDoc examples in packages/spec/src/ai/skill.zod.ts passed `triggerPhrases`, removed in @objectstack/spec 17.0.0 (#3896 audit close-out) and carried as a retiredKey() tombstone ~120 lines below the first of them. defineSkill calls SkillSchema.parse(), so both documented blocks threw when run: invalid_type at path triggerPhrases, expected never. Measured against the built dist before the repair: 2 of 2 blocks threw; after it, 2 of 2 parse. The blocks now demonstrate the tombstone's own prescription instead of contradicting it. That prescription is a SPLIT, not a rename: routing intent to triggerConditions, natural-language intent to description/instructions. The defineSkill block shows both halves with each named. `tools` is required with no default, so both blocks carry it, and each block opens with its own import so it is self-contained the way a consumer resolves it. The retiredKey() tombstone and every line of its guidance prose are unchanged, verbatim. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T9cDbY2NBiVJWYx3BpWfH2
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 126 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Uh oh!
There was an error while loading. Please reload this page.
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32650876652 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
os-steve
commented
Aug 23, 2026
Merge-queue ejection disposition (spec seat, Signature: Re-queuing once now. ⛔ If this signature reds a second time, this PR stays out of the queue, the second occurrence goes to the auto-opened aggregate, and the seat stops re-queuing — a repeat is treated as real until the ledger says otherwise. Generated by Claude Code |
Fixes#11026
Sub-issue of #10924. Both TSDoc
@exampleblocks inpackages/spec/src/ai/skill.zod.tspassedtriggerPhrases— removed in@objectstack/spec17.0.0 (#3896 audit close-out) and carried as aretiredKey()tombstone ~120 lines below the first of them.defineSkillcallsSkillSchema.parse(), so both documented blocks threw when run.Measured, before and after
Premise re-verified on
origin/main@735f5c7(the card said ~250/~436; the PM's re-check said :256/:442 @b863f01— both blocks are where the PM placed them). Both blocks executed verbatim against the freshly builtpackages/spec/dist:Before —
FAILING_BLOCKS=2, exit 1:After —
FAILING_BLOCKS=0, exit 0:What the blocks say now
The tombstone's prescription is a split, not a rename — routing intent to
triggerConditions, natural-language intent todescription/instructions, the strings actually put in front of the model. The blocks now demonstrate that instead of contradicting it:SkillSchema— the minimal skill. The intent the three deleted phrases were carrying moves intoinstructions, where the model actually reads it.defineSkill— shows both halves, each named in a comment: natural language ininstructions, programmatic routing intriggerConditions.toolsis required with no default, so both blocks carry it. Each block now opens with its ownimport { defineSkill } from '@objectstack/spec';, matching the convention the marked SDK examples inpackages/client-react/srcalready use — the block is self-contained the way a consumer resolves it.The
retiredKey()tombstone and every line of its guidance prose are unchanged, verbatim — they were always correct, and they are what the repaired examples now agree with. Verified mechanically:git diffagainst the base commit matches zero lines touchingretiredKey, theREMOVEDcomment,#3896, or theos migrate metaline. The four survivingtriggerPhrasesmentions in the file are exactly the guidance prose (:276), the tombstone comment (:380), the declaration (:385) and its message (:386) — zero in@examplecontent, so the card's own re-check command now reads clean.Reverse verification — would #10924's gate have caught this?
Yes, and this is the useful half for the parent card. Extracting the blocks the way
check-skill-examples.tsdoes (JSDoc gutter stripped) and runningtsc --noEmitagainst the builtdist:TS2322: Type 'string[]' is not assignable to type 'undefined'— both, at exactly thetriggerPhraseslineSo a compile-only gate does red on this defect class (the retired key surfaces as
undefinedinz.input), and the harness can produce red — the green on the repaired blocks is a real measurement, not a vacuous one.Verification
Union re-run after the final commit, at
63bc7746b2:node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(22 families), pluscheck:nul-bytesandcheck:skill-examples.check:dev-prereqs, on its scan half: "The workspace is not built — 34 of 67 workspace packages declare an entry point under dist/ that is not on disk". It names none of this PR's paths.lint.ymlruns onlynode scripts/check-dev-prereqs.mjs --self-test— "self-test half only, never the scan" — and that half is green here (exit 0, 16 cases).pnpm --filter @objectstack/spec exec tsc --noEmit— exit 0, no output.pnpm --filter @objectstack/spec test— 419 test files, 11136 tests, all passed.pnpm --filter @objectstack/spec build && pnpm --filter @objectstack/spec check:generated— "All 14 generated artifacts are up to date."Nothing moved, confirming the card's reading that the generated reference page carries neither example.check:skill-examples— green over all 246 marked blocks across 2 surfaces.Changeset
Graded
patch, notskip-changeset. The docblock ships to consumers: the rewritten blocks are present in the builtpackages/spec/dist/skill.zod-CFjrFQj9.d.ts(lines 442 and 525), which is what an editor surfaces on hover, and@objectstack/spec'sfileslist publishessrc/**/*.zod.tsso the text also travels in the npm tarball as source. Same reasoning the repo already applies to docblock-prose changesets.Scope
packages/spec/src/ai/skill.zod.ts(the two@exampleblocks) plus the changeset — nothing else. No schema shape, no.describe()text, no runtime behaviour, no authorable-surface movement.scripts/check-skill-examples.tsis deliberately untouched: the gate extension is #10924's work, held behind this card, and #11355 has an open finding on that script's extraction loop.Clause-② content limb is
no(docblock prose; accept/reject behaviour unchanged). The path limb fires mechanically onpackages/spec/src/**, so this is held for contract review — expected, not an error.Out-of-scope finding
While verifying,
check:skill-examplesrefused the client SDK surface with "packages/spec/dist holds no .d.ts declarations" at a moment whenpackages/spec/distheld 44 of them — the unbuilt packages wereclient/client-react. That is already filed as #11250; rather than open a duplicate I added the live confirmation plus one addition that card had not recorded — the printed remedy is hardcoded to spec at the call site too, so following it verbatim does not clear the red. Not fixed here: #11250 is out of this card's scope and needs its pinned test assertions updated.Generated by Claude Code