docs(spec): JobSchema.body's describe says an enabled pull job installs when its pull binds and is refused when it does not - #21708
Conversation
…ls when its pull binds and is refused when it does not Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ
…changeset for the pull sentence Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ
📓 Docs Drift CheckThis PR changes 1 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
What this run could not see
Coarse fallback — 138 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin ffcd45ca25d317616fd803c28e6e86adc05895b4 && git checkout ffcd45ca25d317616fd803c28e6e86adc05895b4
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 7e0066af7a8e05709dc60096c69bc85e299d0331 c31367a1ecd24e9a7c52617875b1ac8acad026a7 && git checkout -B drift-repro 7e0066af7a8e05709dc60096c69bc85e299d0331 && git merge --no-ff c31367a1ecd24e9a7c52617875b1ac8acad026a7
node scripts/docs-audit/affected-docs.mjs --json 7e0066af7a8e05709dc60096c69bc85e299d0331
|
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 37192205626 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Fixes #21703
Clause-②: no
Built to triage
5977869121(direction: the card's own one-sentence fix), dispatched under claim5977933303. One sentence ofJobSchema.body's published describe, the reference page generated from it, and one@objectstack/specpatch changeset. No schema, key, export or behaviour change.Measured first: what install-local does with a
pulljob at the baseBase
16d241a6af(origin/mainwhen this branch was cut). Install-local is the door after PR #21683.packages/runtime/src/app-artifact-handlers.ts:389-412,collectJobsWithoutBody. A disabled job is skipped (:393,if (job.enabled === false) continue;). An enabled job that declarespullis judged byjudgeJobPull(job, bundle)(:397).if (judged.binds) continue;(:398) leaves a binding pull unnamed; otherwise the job is named withpullRefusal = judged.refusal;(:399). A job with nopulland abodyis named only whenjudgeJobBodyrefuses that body (:401-403). A job with neither is named with no refusal.:457-491,judgeJobPull, the one judge (the binder calls it too,:837). It binds only when nobodyorhandlersits beside thepull(:461), thepullparses (:468), and the artifact declares the named mapping (:475) with aconnectorSource(:483); thenreturn { binds: true, mapping };(:490).packages/cloud-connection/src/marketplace-install-local-plugin.ts:1006-1014. The install route answers422VALIDATION_ERROR(UNRUNNABLE_REFUSAL_CODEandUNRUNNABLE_REFUSAL_STATUS,:192-193) wheneverunrunnable.jobs.lengthis non-zero (:1007). A job carryingpullRefusalgetsdescribeUnrunnable's pull clause (:218,:242).So at the base, an enabled
pulljob installs when itspullbinds. It is refused with the same422when it does not, as is a job whosebodythe declaration refuses. A disabled one is not judged. The old sentence was "os package installtherefore refuses an enabled job with nobody(apulljob excepted: it is data too)". It reads as "apulljob is never refused", which those lines contradict.The change
In
packages/spec/src/system/job.zod.ts,JobSchema.body's describe, the old clause becomes:The parenthesis names the condition an author controls. Code beside a
pullstays with the describe's next sentence, "Refused besidepull."Neighbouring describes, read for any other sentence PR #21683 made false: none, so none is touched.
handler("When both are presentbodywins; refused besidepull. A job must declare one of …") says nothing about install.pull("Data likebody, so every door schedules it. Refused besidebodyorhandler.") andpull.mapping("refused atdefineStack/os validateotherwise"). PR fix(runtime,cloud-connection)!: install-local refuses an enabled job whose pull does not bind (#21672) #21683 did not change which doors schedule a binding pull, and the mapping sentence does not claim those are the only refusals.organization(JOB_ORGANIZATION_DESCRIPTION) is judged at bind by the posture rule. PR fix(runtime,cloud-connection)!: install-local refuses an enabled job whose pull does not bind (#21672) #21683 left that alone.pullandmappingTSDoc blocks ("binds on every door, as abodydoes"; "defineStack(and soos validate) refuses a name that resolves to neither") are true at the base too.Readers of the old wording
git grep -n -Fover tracked files at the base, for each of these substrings:Each has two hits:
packages/spec/src/system/job.zod.ts:322and the generatedcontent/docs/references/system/job.mdx:61. No test, gate, skill or hand-written doc matches the old sentence, so nothing else moves. The broader substringrefuses an enabled job with noalso hits a pending changeset and a testdescribetitle. Both are about the no-bodyrefusal, which is unchanged.Regenerated with the repo's tooling
pnpm --filter @objectstack/spec check:generatedran after the describe commitb58c6f819b. 14 of 15 artifacts were current, andcheck:docswas stale oncontent/docs/references/**.check:generated --fixrebuiltpackages/specfirst, regenerated only that artifact, and re-checked it green. The diff is the one table row injob.mdx.Changeset
.changeset/21703-job-body-describe-pull.mdnames'@objectstack/spec': patch, since the describe ships insrc/**/*.zod.tsand in the build. It carriesClause-②: noat line start. Text only.Verification at
c31367a1ec(the final commit)pnpm --filter @objectstack/spec build, underos-verify-lock: exit 0.pnpm --filter @objectstack/spec typecheck(tsc,check:scripts-typecheck,check:test-typecheck): exit 0.pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2: 612 files passed. 18185 tests passed, 1 todo.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, with no paths: 3 paths against merge base16d241a6a, 104 commands. All 104 exit 0.PREREQUISITE NOT MET), because packages outside this diff were unbuilt. They were lint'scheck:doc-formula-expressionsandcheck:doc-security-posture,check:skill-examples,check:docs-transcript-drift,check:dual-build-cjs-loadsandcheck:lean-entry-closure.turbo run build --filter=!@objectstack/docs --concurrency=2then ran under the lock (72 of 72 tasks). Each of the six exited 0 on rerun, and the record carries the reruns.--ran: 104 derived, 104 run, 0 NOT-MEASURED, 0 UNRUN.pnpm exec eslint --no-inline-config --format jsonover the three diff paths reports 3 files.job.zod.tshas 0 errors and 0 warnings.parserOptionsis{ ecmaVersion: 'latest', sourceType: 'module' }, andeslint.config.mjssays so at its query-options note. So a string edit in one file moves no untouched file's verdict. The fullpnpm lintis left to CI.origin/mainhas moved one commit since the base (7e0066af7a, tracker citations in spec test files). It touches none of this PR's paths, so the branch was not merged again.Acceptance notes
pull's describe says "Data likebody, so every door schedules it", andbody's says "Every door that brings an artifact in schedules a job'sbody". Both describe a run form that binds; one that does not bind is scheduled on no door. That was as true before PR fix(runtime,cloud-connection)!: install-local refuses an enabled job whose pull does not bind (#21672) #21683 as after it, so it is outside this card. Not filed.Generated by Claude Code