Filed by domain:spec execution seat 2, session session_01UDXER3sdqfeVYpEWZs5mZx, 2026-09-22T11:1xZ. ⛔ Unlabelled and unrouted — an execution seat files, triage grades and routes. Suggested lane: domain:cli, because that is the lane the ruling itself names.
This is half of a ruled change, and the ruling drew the line
Ruling 5644350230 (director seat, decision batch #122 item 1, maintainer 「同意」 2026-09-12) makes ObjectSchema.create({ … }) the one authorised shape for a *.object.ts. Its item 4:
The taker declares the file surface; if it crosses packages/cli and packages/spec / scripts, the cli half is a sibling PR by the domain:cli seat, ⛔ not a rider across lanes.
The spec/scripts half — item ② (the gate refuses the non-factory shape by name) and item ③ (census and convert in-repo literal-shaped object files) — is card #17418 / PR #19720, which opens 「Part of #17418」 rather than Fixes precisely so the card stays open for this half. This card is item ①.
⚠️ The ruling UNDER-NAMES its own item ①
Item ① names only init.ts TEMPLATES. Measured: there is a second emitter, and it carries a declared coupling to the first.
| site |
what it emits |
packages/cli/src/commands/init.ts:649 and :744 |
the two TEMPLATES entries for src/objects/__name___item.object.ts, both emitting a Data.ServiceObject-annotated object literal |
packages/cli/src/commands/generate.ts:99 |
os generate object emits the SAME annotated literal — ⛔ named nowhere in the ruling |
generate.ts's own docblock declares the coupling, quoted:
「#9666 took it once for the os init templates, and this emits the SAME value with the same explanation, so the two doors an author can arrive through agree. If that template value ever moves, this one moves with it.」
⇒ converting init.ts alone breaks the parity that docblock asserts. Both move together or neither does.
Pins that move with them
packages/cli/test/generate-refuses-unparseable-name.test.ts:255 — asserts the emitted source contains a Data.ServiceObject binding line.
packages/cli/test/generate-emission-parses.test.ts:148 — same assertion, plus its docblock worked example at :14.
packages/cli/test/scaffold-emission-typechecks.test.ts:26 — its docblock states the repair is Data.ServiceObject.
packages/cli/test/init.test.ts:493 — reads the scaffolded my_app_item.object.ts; re-check its assertions against the new bytes.
packages/cli/test/init-template-comments-self-contained.test.ts — ⚠️ the templates carry a long authored org-wide-default comment block that must survive the rewrite.
Docblock only, ⛔ no behaviour change: packages/cli/src/utils/emitted-source-parses.ts:14 — the utility is shape-agnostic (it asks the TypeScript parser whether the emitted bytes parse); only its worked example names the literal shape.
Coupled, probably no edit: scripts/sync-scaffold-emission-policy.mjs (its POLICY_SOURCE is packages/cli/src/commands/init.ts) syncs pnpm/typescript version ranges, ⛔ not declaration shape — but re-run it, because create-objectstack's bundled note.object.ts is already the factory shape, so the two scaffolders would finally agree.
Docs: content/docs/deployment/cli.mdx:1323.
⭐ The changeset obligation is THIS card's, not the spec half's
The ruling asks the changeset to state the one mechanical user rewrite (wrap the literal). That rewrite is something a user experiences, and the user-facing change is item ① — os init and os generate emitting the factory shape from a published package. The spec half publishes nothing (scripts/ sits in no package directory; measured, 77 manifests censused for files[] escape hatches, zero found), so it carries skip-changeset. ⇒ the ruling's changeset obligation attaches here.
Ordering, measured rather than assumed
⛔ There is no blocking dependency in either direction, and this was measured rather than guessed. check:keyed-text-bounds selects its population by filename suffix (walkObjectFiles over *.object.ts, repo-wide minus SKIP_DIRS): 112 files on origin/main, ZERO under packages/cli. The TEMPLATES are string literals inside a .ts file, so the gate never reads them in any shape; and every cli scaffold test writes into os.tmpdir() via mkdtempSync, never the repo tree. os init emits into a user's project, which carries no scripts/ directory of this repo.
⇒ item ② can land first without turning anything red that only ① can fix, and it is landing first. But until this card lands, os init and os generate keep writing the shape the ruling refuses — which is the whole reason it is filed rather than left implied.
Duplicate-search words
ObjectSchema.create, Data.ServiceObject, os init templates, generate.ts scaffolder parity, ruling 5644350230 item 1
Generated by Claude Code
Filed by
domain:specexecution seat 2, sessionsession_01UDXER3sdqfeVYpEWZs5mZx, 2026-09-22T11:1xZ. ⛔ Unlabelled and unrouted — an execution seat files, triage grades and routes. Suggested lane:domain:cli, because that is the lane the ruling itself names.This is half of a ruled change, and the ruling drew the line
Ruling
5644350230(director seat, decision batch #122 item 1, maintainer 「同意」 2026-09-12) makesObjectSchema.create({ … })the one authorised shape for a*.object.ts. Its item 4:The spec/scripts half — item ② (the gate refuses the non-factory shape by name) and item ③ (census and convert in-repo literal-shaped object files) — is card #17418 / PR #19720, which opens 「Part of #17418」 rather than
Fixesprecisely so the card stays open for this half. This card is item ①.Item ① names only
init.tsTEMPLATES. Measured: there is a second emitter, and it carries a declared coupling to the first.packages/cli/src/commands/init.ts:649and:744src/objects/__name___item.object.ts, both emitting aData.ServiceObject-annotated object literalpackages/cli/src/commands/generate.ts:99os generate objectemits the SAME annotated literal — ⛔ named nowhere in the rulinggenerate.ts's own docblock declares the coupling, quoted:⇒ converting
init.tsalone breaks the parity that docblock asserts. Both move together or neither does.Pins that move with them
packages/cli/test/generate-refuses-unparseable-name.test.ts:255— asserts the emitted source contains aData.ServiceObjectbinding line.packages/cli/test/generate-emission-parses.test.ts:148— same assertion, plus its docblock worked example at:14.packages/cli/test/scaffold-emission-typechecks.test.ts:26— its docblock states the repair isData.ServiceObject.packages/cli/test/init.test.ts:493— reads the scaffoldedmy_app_item.object.ts; re-check its assertions against the new bytes.packages/cli/test/init-template-comments-self-contained.test.ts—Docblock only, ⛔ no behaviour change:
packages/cli/src/utils/emitted-source-parses.ts:14— the utility is shape-agnostic (it asks the TypeScript parser whether the emitted bytes parse); only its worked example names the literal shape.Coupled, probably no edit:
scripts/sync-scaffold-emission-policy.mjs(itsPOLICY_SOURCEispackages/cli/src/commands/init.ts) syncs pnpm/typescript version ranges, ⛔ not declaration shape — but re-run it, becausecreate-objectstack's bundlednote.object.tsis already the factory shape, so the two scaffolders would finally agree.Docs:
content/docs/deployment/cli.mdx:1323.⭐ The changeset obligation is THIS card's, not the spec half's
The ruling asks the changeset to state the one mechanical user rewrite (wrap the literal). That rewrite is something a user experiences, and the user-facing change is item ① —
os initandos generateemitting the factory shape from a published package. The spec half publishes nothing (scripts/sits in no package directory; measured, 77 manifests censused forfiles[]escape hatches, zero found), so it carriesskip-changeset. ⇒ the ruling's changeset obligation attaches here.Ordering, measured rather than assumed
⛔ There is no blocking dependency in either direction, and this was measured rather than guessed.
check:keyed-text-boundsselects its population by filename suffix (walkObjectFilesover*.object.ts, repo-wide minus SKIP_DIRS): 112 files onorigin/main, ZERO underpackages/cli. The TEMPLATES are string literals inside a.tsfile, so the gate never reads them in any shape; and every cli scaffold test writes intoos.tmpdir()viamkdtempSync, never the repo tree.os initemits into a user's project, which carries noscripts/directory of this repo.⇒ item ② can land first without turning anything red that only ① can fix, and it is landing first. But until this card lands,
os initandos generatekeep writing the shape the ruling refuses — which is the whole reason it is filed rather than left implied.Duplicate-search words
ObjectSchema.create,Data.ServiceObject,os init templates,generate.ts scaffolder parity,ruling 5644350230 item 1Generated by Claude Code