Skip to content

os init and os generate still emit the annotated-literal .object.ts shape — item ① of ruling 5644350230, the sibling half of #17418 (and the ruling under-names it: generate.ts too) #19722

Description

@os-warren

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:clipm:queuepriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions