fix(create-objectstack): the blank starter wires every generator barrel, so os g scaffolds reach the stack (#20333) - #20363
Conversation
`npm create objectstack`'s blank config imported ./src/objects alone, so
every `os g view|action|flow|dashboard|app|skill` scaffold was written and
never loaded, and `os validate` counted 0 of them. The config now wires
the seven barrels `os init` wires, in the lines `os init` renders
(`exportsOf` over `export {};` barrels), and `requires` gains `triggers`
beside the `automation` its connectors already needed.
Claude-Session: https://claude.ai/code/session_01UYBdGBzWSrAMzpW8ah3GbP
Co-authored-by: Claude <noreply@anthropic.com>
A unit parity pin reads every expected line off the CLI's own render (TEMPLATES.app, SCAFFOLD_WIRED_BARRELS, SCAFFOLD_WIRED_REQUIRES) and holds create-objectstack's blank config and barrels to it. A per-PR integration pin drives `npm create objectstack` -> `os g object` (control) -> `os g flow` -> `os validate` and reads `Logic: 1 Flows`. The blank config imports three connector packages; they become CLI devDependencies so the scaffolded project resolves them and CI builds them in this suite's closure. Claude-Session: https://claude.ai/code/session_01UYBdGBzWSrAMzpW8ah3GbP Co-authored-by: Claude <noreply@anthropic.com>
Both new pins measure create-objectstack's blank config and src/ tree, so @objectstack/cli#test declares them (with a witness for the barrel glob the scan cannot name) and turbo.json hashes them. Claude-Session: https://claude.ai/code/session_01UYBdGBzWSrAMzpW8ah3GbP Co-authored-by: Claude <noreply@anthropic.com>
…a chain that composes The starter's tree, config and agent guide, the package README, the Your First Project page and the CLI page described an objects-only starter. They now name the seven wired barrels, `exportsOf` and the `triggers` requirement. The CLI page's first-app walkthrough generated an action bound to an object nobody declared; on the wired starter that is refused, so the walkthrough now binds the flow and the action to the object it creates. Claude-Session: https://claude.ai/code/session_01UYBdGBzWSrAMzpW8ah3GbP Co-authored-by: Claude <noreply@anthropic.com>
…eate-objectstack-wire-barrels
📓 Docs Drift CheckThis PR changes 2 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 — 10 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 eff30fa2412644f9cd7e917ccd8f34c2d92223b0 && git checkout eff30fa2412644f9cd7e917ccd8f34c2d92223b0
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 5a6267f4862556fd7422cd161cd931b03aa17b72 702a27775dfda9c4bd3dc96f2fb775ba026c8de1 && git checkout -B drift-repro 5a6267f4862556fd7422cd161cd931b03aa17b72 && git merge --no-ff 702a27775dfda9c4bd3dc96f2fb775ba026c8de1
node scripts/docs-audit/affected-docs.mjs --json 5a6267f4862556fd7422cd161cd931b03aa17b72
|
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: Independence: INDEPENDENT AGENT (fed the card, the triage direction and the PR only; not the dispatch order or the seat's conclusions) VERDICT: FAIL
|
…eate-objectstack-wire-barrels
…t by stack keys Build with Claude Code said the agent wires the action, view and app through `actions:` / `views:` / `apps:` arrays in defineStack(). On the wired starter those keys already read the barrels through exportsOf(), so a second key duplicates it (tsc TS1117) and replaces the barrel's wiring (a later `os g view` reports Not wired). The page now says each file is exported from its directory's index.ts, which is the whole wiring. Claude-Session: https://claude.ai/code/session_01UYBdGBzWSrAMzpW8ah3GbP Co-authored-by: Claude <noreply@anthropic.com>
Contract review (delta, patch round 1)Served-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: Independence: INDEPENDENT AGENT (fed the card, the triage direction and the PR only; not the dispatch order or the seat's conclusions) VERDICT: PASS Generated by Claude Code |
… requires automation+triggers, seven barrels via exportsOf (objectstack-ai#20410) Fixes objectstack-ai#20385 Clause-②: no ## What was false, and what the skill now says `skills/objectstack-platform/SKILL.md` 〈The Template〉 said the blank starter declares `requires: ['automation']` and said nothing about the barrel wiring. Read on the branch base `df3ba164` (`origin/main` at claim time), `packages/create-objectstack/src/templates/blank/objectstack.config.ts` declares `requires: ['automation', 'triggers']` (line 51), keeps the three generic connector executors in `plugins:` (lines 61–65: `ConnectorRestPlugin`, `ConnectorOpenApiPlugin`, `ConnectorMcpPlugin`), and hands all seven generator barrels (`objects`, `views`, `actions`, `flows`, `dashboards`, `apps`, `skills`) to the stack key of the same name through `exportsOf` (lines 73–79; six of the barrels are `export {};`). objectstack-ai#20363 landed the template change; the card behind it, objectstack-ai#20333, is not addressed here. The bullet now states those facts and points at the scaffolded `AGENTS.md` for how to add to the barrels — one pointer, not a second spelling of its rule (the claim's judgement). The pointer names the file without a rule number so a later renumbering of that list cannot make the skill stale again. ## Sentence-by-sentence audit of the starter's description (the execution note) | Where (line on the base) | Sentence | Verdict | |:--|:--|:--| | 192–194, 〈The Template〉 | `requires: ['automation']` plus the three connector executors | FALSE on `requires` (no `triggers`) and SILENT on the seven barrels → rewritten | | same bullet | "the three generic connector executors in `plugins:`" | TRUE (lines 61–65 of the template) → kept | | same bullet | "The memory driver and the Hono server are NOT in the file — the CLI auto-registers both at boot" | TRUE (no driver or server plugin in the file) → kept | | 357–366, `requires:` table | `triggers` row | already present (`@objectstack/trigger-record-change`, plus `trigger-schedule` and `trigger-api`) → no row added; its bold "Pair it with `job`" clause restated rule 5 under the same table → dropped from the row, rule 5 keeps it in full | | 399, the five rules | "Keep `automation` whenever `plugins:` lists a connector" | TRUE for the starter → unchanged | | 401, the five rules | "Pair `triggers` with `job`" | TRUE → unchanged, now the one spelling | | 225, the directory tree | `flows/ # Optional: automation flows` | a project convention, not the starter → unchanged | | 245, naming table | `Object.values(imported)` | still true — `exportsOf` is a typed `Object.values` → unchanged | | `references/bootstrap.md` § Scaffolding Command | "blank is the default, and the only, template" | TRUE → unchanged | ## Paying the skills token ratchet (headroom 2 → 4) Net content added by the rewritten bullet is paid by deleting redundancy in the same file, nothing moved elsewhere and the ceiling untouched: - The retired-templates paragraph (four lines) is one sentence. The CLI already prints `Template "NAME" has been retired and is no longer available.` when one is asked for by name (`packages/create-objectstack/src/index.ts`, line 414), so the skill needs the fact, not the marketplace history. - The `triggers` table row drops the "Pair it with `job` — schedule and time-relative triggers run on the job service" clause; rule 5 directly under the table says the same thing with its consequence, and every other row in that table lists providers only. - "works offline, no network fetch" → "no network fetch" (one claim, said once). ## Readings ### line_budget | Scope | before | after | |:--|--:|--:| | file lines (`skills/objectstack-platform/SKILL.md`) | 487 | 489 | | file bytes | 23321 | 23313 | | file tokens (ratchet, ceil bytes/4) — ceiling 5833 | 5831 (headroom 2) | 5829 (headroom 4) | | package: lines over every `skills/**/SKILL.md` (10 files) | 4402 | 4404 | | package: authored bundle tokens (ratchet total / ceiling) | 143456 / 154938 | 143454 / 154938 | | package: bundle total tokens (whole shipped tree) | 153970 | 153968 | ### gates Derived with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` at `7ac5e9f4` (1 path vs merge base `df3ba164`; 25 commands). Every exit code captured before any pipe (`cmd > log 2>&1; EXIT=$?`). `--ran` reconciliation with exit codes: 25 derived, 25 run, 0 NOT-MEASURED, 0 UNRUN. | Command | exit | verdict line | |:--|--:|:--| | `node scripts/check-ci-filter-parity.mjs` | 0 | pass | | `node scripts/check-closing-keyword-parity.mjs` | 0 | pass | | `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | pass | | `node scripts/check-comment-mask-corpus.mjs` | 0 | pass | | `node scripts/check-doc-route-spelling.mjs --advisory` | 0 | pass | | `node scripts/check-doc-route-spelling.mjs --self-test` | 0 | pass | | `node scripts/check-skills-token-ratchet.mjs` | 0 | `skills/objectstack-platform/SKILL.md is 5829 tokens (ceiling 5833; headroom 4)` · `54 authored bundle file(s) within their ceilings` | | `node scripts/check-skills-token-ratchet.mjs --self-test` | 0 | pass | | `pnpm --filter @objectstack/lint run check:doc-formula-expressions` | 3 then 0 | first run: PREREQUISITE NOT MET (`@objectstack/formula` and `@objectstack/lint` not built — nothing measured); built both under the verify lock (`turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2`, VERDICT command-exit 0); re-run: `22 record-scoped formula example(s) across 456 files / 1383 TS blocks judged clean` | | `pnpm --filter @objectstack/spec run check:skill-docs` | 0 | `Skill docs in sync` | | `pnpm check:agent-test-spelling` | 0 | pass | | `pnpm check:corpus-claim-drift` | 0 | pass | | `pnpm check:cross-package-test-inputs` | 0 | pass | | `pnpm check:doc-authoring` | 0 | `53 published skill files clean — no internal issue-id references` | | `pnpm check:driver-memory-census` | 0 | pass | | `pnpm check:gitlink-declared` | 0 | pass | | `pnpm check:nul-bytes` | 0 | `OK (scanned 9892 text file(s) … no raw ASCII control bytes)` | | `pnpm check:pm-governed-merges` | 0 | self-test, 454 assertions (what CI runs for this family) | | `pnpm check:refd-timer-probe` | 0 | pass | | `pnpm check:role-word` | 0 | pass | | `pnpm check:skill-compatibility` | 0 | pass | | `pnpm check:skill-frame-sync` | 0 | pass | | `pnpm check:skill-identifier-liveness` | 0 | pass | | `pnpm check:skill-top-level-keys` | 0 | pass | | `pnpm check:watch-hint-literal` | 0 | pass | Also run outside the derivation: `grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' skills/objectstack-platform/SKILL.md` → no match. ### tests `Test Core` is path-scheduled by `skills/**`. The diff touches no package, so no dependency closure (①) and no package suite (②) is owed; run locally instead are the test files whose code reads the `skills/` root (the only tests a prose change here can move), under the verify lock (VERDICT command-exit 0, held 33s, waited 0s), each invocation checked for a non-zero file count: | Command | exit | result | |:--|--:|:--| | `pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/template-consistency.test.ts` | 0 | 1 file, 37 tests passed | | `pnpm --filter @objectstack/formula exec vitest run --maxWorkers=2 src/skill-catalog-sync.test.ts` | 0 | 1 file, 1 test passed | | `pnpm --filter @objectstack/rest exec vitest run --maxWorkers=2 src/meta-state-route-doc-spelling.test.ts` | 0 | 1 file, 8 tests passed | | `pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 scripts/dist-freshness-adoption.test.ts scripts/export-list.test.ts scripts/query-pointer-row.test.ts scripts/solution-blueprint-header-row.test.ts` | 0 | 4 files, 26 tests passed | NOT MEASURED, declared to CI: the full `Test Core` shards; `packages/cli/test/generate-skill.e2e.test.ts` (integration tier — it spawns the CLI; the diff touches no spawn entry); the four type-check lanes (no TypeScript touched); shard attestation and test-completeness (values exist only in a CI run); the 55 artifact-roster, 11 wide-population and 14 pending-changeset families the derivation lists outside its runnable total. ### changeset `skip-changeset`. No published package's `files[]` names `skills/**` (read over every `packages/**/package.json`: zero); the catalog reaches customers by `npx skills add objectstack-ai/objectstack/skills` from this repository (`packages/create-objectstack/src/skills-install.ts`, line 62), not from an npm tarball. Measured after building `create-objectstack` (the only package that names the catalog at all): the edited sentence's phrase `generic connector executors in` hits 0 files across its `files[]` paths (`dist`, `README.md`, `CHANGELOG.md`) and 0 files across the 5 `dist/` trees present on disk; positive control `exportsOf` hits 2 files in that same `dist`. ### deviations - None of the derived families was narrowed or skipped. The one exit 3 (`check:doc-formula-expressions`) was a declared prerequisite, cleared by building and re-running; recorded above as 3 then 0. - The commit's attribution trailer is the model-free pair AGENTS.md prescribes (`Claude-Session:` + `Co-authored-by: Claude`), not the harness-suggested model-named form. ### files_changed - `skills/objectstack-platform/SKILL.md` (+11 / −9) ## Acceptance notes (observed, not filed) - `## Project Structure Conventions` (lines 209–232) lists no `src/skills/` directory, while the starter now ships one with its own barrel. That section describes a project convention, not the starter; class: none of a/b/c; carrier: none. - Line 245's naming row spells the barrel hand-off as `Object.values(imported)`; the starter spells it `exportsOf(barrel)`, a typed `Object.values`. Both true; carrier: none. - "Bundled with `create-objectstack` — no network fetch" describes the template itself; the scaffold's separate skills-install step (`npx -y skills add …`) does fetch. Pre-existing claim, shortened here without changing its substance; carrier: none. ## 维护者速读(草稿) **改了什么**:平台技能(`skills/objectstack-platform/SKILL.md`)里描述 `blank` 起步模板的那一段,改成与实际发出的模板一致:`requires` 现在是 `['automation', 'triggers']`,并说明七个目录 barrel(objects/views/actions/flows/dashboards/apps/skills)都已经通过 `exportsOf` 接到同名 stack 键,加一句指向脚手架生成的 `AGENTS.md` 说明怎么往里加东西。为了不超过技能包的 token 上限,同一文件里删了三处重复表述(退役模板段落压成一句、`triggers` 表格行不再重复规则 5、"works offline / no network fetch" 只说一次)。 **为什么改**:技能是 AI 写应用时读的说明书;这句话过时后,AI 按它描述起步项目会漏掉 `triggers`(`objectstack generate flow` 生成的 flow 装不上),也不知道 barrel 已经接好,可能手加 stack 键而不是从 barrel 导出。 **风险与代价(含回滚)**:纯文档改动,不动代码、不动发布包(`skills/**` 不在任何已发布包的 `files[]` 里,已实测);风险只在措辞被误读,已逐句对照模板文件核过并列在上表。回滚:revert 本 PR 的一个 commit 即可,无其它依赖。 **席位意见**: **你要做的**:审阅并 APPROVE 本 PR(`skills/**` 属 Tier H,需要维护者的批准),之后由席位落地。 --- _Generated by [Claude Code](https://claude.ai/code/session_01MjvgiFAmjHqsxy1XLiVYfH)_ Co-authored-by: os-steve <steve@objectstack.ai> Co-authored-by: Claude <noreply@anthropic.com>
Fixes #20333
Clause-②: no
Summary
npm create objectstack's blank starter imported./src/objectsalone, so everythingos g view|action|flow|dashboard|app|skillwrote was never loaded andos validatecounted 0 of it. The starter now wires the seven generator barrelsos initwires since PR #20329, in the linesos initrenders:exportsOfoverexport {};barrels, andrequires: ['automation', 'triggers']. The copy is bound to the CLI's single source (SCAFFOLD_WIRED_BARRELS/SCAFFOLD_WIRED_REQUIRES, derived fromGENERATOR_SCAFFOLD_TARGETS) by a parity pin, so it is not a second wiring rule. A per-PR pin drivesnpm create objectstack→os g object(control) →os g flow→os validateand readsLogic: 1 Flows.What changed
packages/create-objectstack/src/templates/blank/objectstack.config.ts: imports every wired barrel, declares theexportsOfhelper, and hands each barrel to its stack key. The objects import changes from'./src/objects/index.js'to'./src/objects', the extensionless formos initrenders, which the parity pin compares verbatim; the template'smoduleResolution: bundlerresolves the directory index, and a fresh scaffold type-checks. It carriesrequires: ['automation', 'triggers'].automationwas already there for the three connector plugins, and its comment keeps that reason.src/{views,actions,flows,dashboards,apps,skills}/index.tsbarrels, byte-identical to whatos initwrites.packages/cli/test/(below). The CLI is the only package that can call the renderer, and it already depends oncreate-objectstack.packages/cli/package.jsongains@objectstack/connector-{rest,openapi,mcp}as devDependencies (lockfile +9 lines, one importer block). They exist only so the scaffolded project the chain pin builds under the CLI'snode_modulescan resolve the blank config's connector imports, and so CI builds them in@objectstack/cli#test's closure.scripts/cross-package-test-inputs.mjsandturbo.jsondeclare the blank config andsrc/**as inputs of@objectstack/cli#test, with a witness for the barrel glob the scan cannot name.create-objectstackpatch changeset.Why a static copy, and what binds it
create-objectstackcannot import the roster. The dependency edge runs the other way, and the npx entry must not pull the CLI's closure: the boundaryscripts/sync-scaffold-emission-policy.mjsalready documents. Measured options:GENERATORSliteral ingenerate.ts. Reading it atcreate-objectstack's build would need either text-parsing that literal, or evaluating the CLI's source before the CLI's own dependencies are built, which is a build-order cycle.create-objectstack-wiring-parity.test.tsreads every expected line off the CLI: the barrel import lines, theexportsOfline and the stack-key lines ofTEMPLATES.app.configContent, therequirestokens as a superset ofSCAFFOLD_WIRED_REQUIRES, and each empty barrel byte for byte fromTEMPLATES.app.srcFiles. A generator added to the roster, a renderer change or a hand edit of the template reddens it (ablations A1 to A3).Measured before and after, through the real commands
The on-ramp's real
bin/scaffoldedmy-app --skip-install --skip-skillsinto a directory where the config's imports resolve, then this repo's CLI ran.origin/mainc74de10a9os g object order_line(control)os g flow order_lineos validateData: 2 Objects,Logic: 0 FlowsData: 2 Objects,Logic: 1 FlowsexportsOfis required here too. A fresh starter type-checks (tsc --noEmit, 6.0.3, exit 0). The same starter withObject.valueson the empty barrels fails with 4 x TS2322 (actions, flows, dashboards, apps). After generating the object and the flow it still type-checks.requiresboots.os dev --freshon a random port: the flow-less fresh starter was healthy after about 22s,/api/v1/readyanswered 200, andAutomationServicePluginand the record-change, schedule, time-relative and api trigger plugins loaded, resolved through the CLI's own dependencies. With the generated flow it was healthy after about 24s and reportedFlows: 1 flow(s) 1 bound to triggers. Neither boot printed "not enabled" or "NOT installed".src/templates/holds one starter,blank, which is also the registry's only entry.Pins
packages/cli/test/create-objectstack-wiring-parity.test.ts(unit, per-PR): 20 cases, described above.packages/cli/test/create-objectstack-stack-reach.test.ts(integration, per-PR, not.e2e): the chain above, with item names read off the generator roster. It asserts the exit codes, the named subjects, the absence of the wiring lines and of arequiresline fromos g flow, and theData: 2 Objects/Logic: 1 Flowscounts. No prose is pinned.Ablations
Each ran after the fix was committed. Mutations went through
scripts/ablation-replace.mjsin wrap mode, which verified the anchor count and the blob change and restored with blob equal to HEAD and an emptygit diff HEAD.flows: exportsOf(flows),line deleted, thencreate-objectstackrebuilt).ablation-dist-preflight --absentconfirmed the line was gone fromdist/. Chain pin: 2 failed, 2 passed. The control and the scaffold stayed green, andos g flowprinted the wiring lines while validate read noLogic: 1 Flows. Parity pin: 1 failed, 19 passed, on the stack-key comparison. Direction: red.ablation-dist-preflightfound the marker present indist/templates/blank/objectstack.config.ts, and the whole tree was clean. Chain pin 4/4, parity pin 20/20.skillskey deleted): parity 1 failed, 19 passed. Red.os initwrites (views/index.tsreworded): parity 1 failed, 19 passed. Red.Verification
Patch round 1, at HEAD
702a27775(origin/maina88a1bb39merged atdf0c0c846): the 124 derived gates,check-issue-citations --base origin/mainandcheck:scaffold-emission-policyall exited 0 on the first pass (--ran: 124 derived, 124 run, 0 NOT-MEASURED, 0 UNRUN), includingcheck:doc-anchors,check:docs-audit-scopeandcheck-affected-docs;pnpm lintexited 0; the parity pin 20/20, the chain pin 4/4, andcreate-objectstack16 files, 232 passed.Round 0: all of the following ran at HEAD
d50d46fe0(origin/main26daf0b03merged).pnpm --filter create-objectstack test: 16 files, 232 passed.typecheck: exit 0.pnpm --filter @objectstack/cli typecheck: exit 0, includingcheck:test-typecheck, whose ledger is unchanged.unitproject: 231 files, 3316 passed.integration: this chain pin plusgenerate-stack-reach.test.ts, 2 files, 11 passed.pnpm lint: exit 0 over the whole repo, not narrowed.node scripts/check-issue-citations.mjs --base origin/main: exit 0.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran: 124 derived, 124 run, 0 NOT-MEASURED, 0 UNRUN. Three gates first exited 3 with PREREQUISITE NOT MET (check:skill-examples,check:dual-build-cjs-loads,check:i18n-coverage) and exited 0 after a full build.pnpm check:scaffold-emission-policy: exit 0.Docs this change made false, and a surface note
These published lines described an objects-only starter and are corrected in place:
README.mdLayout, plus its app remedy, which now says to export the file fromsrc/apps/index.ts;AGENTS.mdrule 3, which prescribedObject.values()(measured TS2322 on the now-empty barrels);README.mdtree;content/docs/getting-started/your-first-project.mdx: its section-2 tree and config block;content/docs/getting-started/build-with-claude-code.mdx(patch round 1): step 3 said the agent wires the action, view and app throughactions:/views:/apps:keys indefineStack(). It now says each file is exported from its directory's barrel (src/actions/index.ts,src/views/index.ts,src/apps/index.ts), which the starter's config already hands todefineStack(), matching the shippedAGENTS.mdrule 3. A sweep ofcontent/docs/found no other sentence telling a starter author to add a collection key;content/docs/deployment/cli.mdx.In
cli.mdx, theos generatesection's "Not wired" example named "thenpm create objectstackstarter", and its first-app walkthrough ranos generate action approve. On the wired starter that action is refused with exit 1: "Action 'approve' references object 'my_app_approve' which is not defined in objects". The walkthrough now runsobject customer, thenflow customer, thenaction customer, measuredUI: 1 ActionsandLogic: 1 Flows. Its fixture callout now names the extra action.content/docs/**andpackages/create-objectstack/README.mdwere outside the claim's first file surface; the seat amended the claim in place to name them. They are edited under the agent contract's rule that a published line this change makes false is repaired in the same PR. PR #20341 editscli.mdxaround lines 1619 to 1690, disjoint from these hunks; PR #20258 edited lines 1 to 7 ofyour-first-project.mdxandbuild-with-claude-code.mdx, has since landed, and merged into this branch without conflict.skills/objectstack-platform/SKILL.mdline 192 says the template declaresrequires: ['automation']. That is now stale, butskills/**is a governed Tier H surface, so it is not edited here; the seat files it for the skills lane once this PR lands.Acceptance notes
init.ts'srenderEmptyWiredBarrel("a action", "a app").init.tsis read-only here. Whoever next edits that renderer carries it, and the parity pin will then require the starter to follow.os generate flow onboardingalso bound its flow to an undeclared object. That was not silent:os devwarned "the flow will never fire". The new walkthrough binds to the object it creates.os validateexit 0 withData: 2 Objects 6 FieldsandUI: 1 Apps 1 Views 1 Actions, the page's step-4 counts. Addingactions:/views:/apps:keys beside the wired ones instead still validates (the later key wins), but the starter'stsc --noEmitfails with 3 x TS1117, and a lateros g view customerthen reports Not wired, while the barrel-wired project reports it reaches the stack.requirespair is PR fix(cli): generated scaffolds reach the stack, or os g says they do not (#20215) #20329's shape. The standing family cards for the rest of that seam are [finding]os validatepasses a view container whose ownnamedisagrees with the object key it binds to, andos servethen refuses that stack at boot #20331 and [finding]requires: ['triggers']withoutautomationvalidates, but at boot the record-change trigger is not installed and every flow "will never run" #20332, both named on [finding]os generate's non-object scaffolds never reach anos initproject's stack (the config imports only./src/objects), soos validatepasses with 0 flows and 0 apps; once wired, the flow scaffold is refused #20215.Generated by Claude Code