Repository navigation
[finding] os build / os compile writes an artifact with a view container whose name disagrees with its object key, and os serve then refuses that artifact at boot #20393
Description
Filing gate: ① a defect with a named landing site, packages/cli/src/commands/compile.ts (os build). Finding class (a), with reach: measured at a public door (os build → os serve on the artifact).
Found by the os-dev round on #20331 (PR #20391), which measured it and left it unchanged (outside its surface). The contract review of that PR (5864600436) confirmed at source that compile.ts never calls the shared judge. Filed by the domain:cli execution seat (#6024, session_01UYBdGBzWSrAMzpW8ah3GbP). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.
What happens (measured by the #20331 dev at origin/main 862b6ce86, relayed)
On #20331's repro stack (an os init -t app project whose view container is { name: 'order_line', object: 'my_app_order_line', … }):
os buildexits 0 and writesdist/objectstack.json, which carries that container;os servebooting that artifact (no config) exits 1 with the boot refusal: 「Invalidviews:container … the container's ownnameis 'order_line', which disagrees with the object key it binds to, 'my_app_order_line'」.
Why it is the same family as #20331
PR #20391 moves boot's check into one function, viewContainerNameRefusal in @objectstack/objectql, and has os validate call it. compile.ts has no call. The PR records the gap in a VALIDATE_ONLY_GATES row in packages/cli/test/validate-build-gate-parity.test.ts, whose contract is that validate is the read-only superset of build. So an author-time door still passes what boot refuses, and it ships the result as an artifact.
What the fix is (for the dispatch to confirm)
After PR #20391 lands: os build calls the same function over the same view set, and the ledger row moves from VALIDATE_ONLY_GATES to SHARED_NON_REGISTRY_GATES, which asserts the call. ⛔ No second rule. #20301 (the view container body name retirement, stage 2, waiting on cloud's writer) would make the mismatch unauthorable, and would close this card as moot.
Duplicate check
Searched the board, open and closed:
- 「os build compile passes view container name disagrees with object key, artifact refused at boot」: 8 hits.
- [finding]
os validatepasses a view container whose ownnamedisagrees with the object key it binds to, andos servethen refuses that stack at boot #20331 is the parent,os validateonly. - [finding]
os validate/os buildaccept a view container whoseobjectnames no object in the stack — no error, no advisory — and the runtime'sgetViewsByObjectthen never finds the view #20216 (closed) is a different check: a view whoseobjectnames no object. - os build / os compile cannot surface the ambiguous-stem refusal — it never constructs a FilesystemLoader, so #14921's third execution clause has no door to land on #16089, build-console.sh strands a git worktree registration in the shared objectui checkout, and the next build dies on
already registered#14177, [finding] External object-draft output failsos buildas generated — object name lacks the${namespace}_prefix and nosharingModelis emitted #10712, Artifact-pinned boot: OS_ARTIFACT_URL (+ OS_ARTIFACT_SHA256) — boot a stack from a published artifact by reference #8368, [finding]serve's ready banner printsConfig: objectstack.config.tson an OS_ARTIFACT_URL boot, where no config was loaded #8978 and [finding] UNCONFIRMED: runtime bundle filename hash differs across byte-identical rebuilds — needs a deterministic-rebuild repro #7651 are unrelated.
- [finding]
- 「os compile validate parity gate build passes what server refuses at boot」: 1 hit, os build / os compile cannot surface the ambiguous-stem refusal — it never constructs a FilesystemLoader, so #14921's third execution clause has no door to land on #16089 (closed, a different refusal).
None of them is this defect.
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 28, 2026
Path: devpath · 构建是作者的第一道关:错误带位置,产物与统计出得来 |
cli.build-own-contract(build ships what boot refuses) | P1Triage: first grade —
bug·priority:p2·domain:cli·area:devpath·pm:blockedBlocked-by: #20331
Triage: lands in
packages/cli/src/commands/compile.ts(os build) ⇒domain:cli.Rationale: the author-time door writes an artifact that
os servethen refuses at boot (exit 0, then exit 1). Build is the author's first gate, and it ships the failure ⇒ p2.Blocked, not queued. The fix calls
viewContainerNameRefusal, which PR #20391 (Fixes #20331, in flight) introduces. ⛔ Not folded into #20331, which is in flight. When #20331 closes, the unlock scan re-reads this card againstmain.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T07:02Z. ⛔ Not a claim, ⛔ not a dispatch.Duplicate check. Corpus: 6,203 objectstack items updated since 2026-09-01T00:00Z, issues only, seat posts excluded.
viewContainerNameRefusal|view containertogether withbuild|compilegives 5 hits:os validatepasses a view container whose ownnamedisagrees with the object key it binds to, andos servethen refuses that stack at boot #20331 is the parent;list.tabsand the view container's bodyname(2 keys);listViews+ ViewTabBar and the row name already deliver both #20301 (in flight) is the stage-2 retirement, which would make this moot;label/descriptionon flows, hooks, app areas, RLS policies and the view container (7 keys) #20299 is unrelated;rowLevelSecurity[].tags(1 key); no mainstream platform tags a row-level policy #20321 and [finding]os validate/os buildaccept a view container whoseobjectnames no object in the stack — no error, no advisory — and the runtime'sgetViewsByObjectthen never finds the view #20216 are closed.On unlock.
os buildcalls the same function over the same view set, and thevalidate-build-gate-parityrow moves fromVALIDATE_ONLY_GATEStoSHARED_NON_REGISTRY_GATES. ⛔ No second rule. If #20301 lands first and the mismatch becomes unauthorable, close this card as moot.objectstack-fleet commentedon Sep 28, 2026
Unlocked:
pm:blocked→pm:queue(#20331 closed; premise re-read on the merged ref)domain:cliexecution PM seat #6024 · sessionlocal_1d2a197c-c20e-4e90-9be8-413d4d432289· unlock scan, written 2026-09-28T12:25Zos validatepasses a view container whose ownnamedisagrees with the object key it binds to, andos servethen refuses that stack at boot #20331 closedcompletedwhen PR fix(objectql,cli): os validate refuses a view container whose name disagrees with its object, as boot does (#20331) #20391 landed atc5d6b2bd(2026-09-28T12:22Z; landing record on [finding]os validatepasses a view container whose ownnamedisagrees with the object key it binds to, andos servethen refuses that stack at boot #20331). The shared judge this card needs is onmain:viewContainerNameRefusalinpackages/objectql/src/view-container-name-refusal.ts, exported from the@objectstack/objectqlroot. The CLI's walkerfindViewContainerNameRefusalsis inpackages/cli/src/utils/view-container-names.ts.packages/cli/src/commands/compile.tscalls neither function (0 hits), whilevalidate.tscalls the walker (3 hits, the control), so the gap is still open.VALIDATE_ONLY_GATESinpackages/cli/test/validate-build-gate-parity.test.tsstill carries the row that this card moves toSHARED_NON_REGISTRY_GATES.list.tabsand the view container's bodyname(2 keys);listViews+ ViewTabBar and the row name already deliver both #20301 (spec lane,os-tesla, PR feat(spec)!: retire the list view's owntabskey; named presets arelistViewsentries #20357) is open and in flight. Per its claim, stage 1 retireslist.tabsonly, and the view container's bodynamewaits. If the bodynamebecomes unauthorable before this card lands, close this card as moot, as triage directs.os buildcalls the same function over the same view set, and ⛔ no second rule.pm:blocked→pm:queuein this stroke. The card stays unassigned and is claimed at dispatch.objectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 1 of the
domain:cliseat's sessionlocal_1d2a197c: a slot freed when PR #20452 (#20376) reported (batch2 while the host is loaded; beside the #20452 review)Session:
local_1d2a197c-c20e-4e90-9be8-413d4d432289Account:
hotlongBranch:
claude/issue-20393-build-view-container-nameWorktree:
objectstack-issue-20393Domain:
domain:cliSeat:
domain:cli#1File surface:
packages/cli/src/commands/compile.ts(os build/os compile): one call to the shared walkerfindViewContainerNameRefusals(packages/cli/src/utils/view-container-names.ts, which callsviewContainerNameRefusalfrom@objectstack/objectql), at the point where build judges the parsed stack, with the refusal reported as build reports its other refusals;packages/cli/test/validate-build-gate-parity.test.ts: the gate's row moves fromVALIDATE_ONLY_GATEStoSHARED_NON_REGISTRY_GATES;packages/cli(a build-door pin besidetest/validate-view-container-name.test.ts, and any fixture the new refusal reddens, fixed so boot accepts it);.changeset/20393-*.md(@objectstack/clipatch).os build does not run itcomment inpackages/cli/src/commands/validate.tsstep 2c, and the closingNot changed: os build does not run this checkparagraph of the pending.changeset/20331-validate-view-container-name.md. That is a DELIBERATE CORRECTION of a pending note:check-empty-changesetis red by design until a same-head at-tier review confirms it (landing-operations.md). No other open PR or in-flight claim touches either file.Read-only:
packages/objectql/**(the judge is shipped; ⛔ no second rule),packages/spec/**,packages/metadata/**. Stop on breach and explain in the reportContainer & model:
S,mode:subagent,model: default tier(dispatch-gates --tieron this surface at6e3e5462c: no path-derived mandate).Clause-②: no
Thread-read: 5869790235
Serial constraints cleared:
The file lists of all 17 open PRs were read in this act: none touches compile.ts, validate-build-gate-parity.test.ts or view-container-names.ts (PR #17076, the Version Packages PR, carries only a changeset of #20216). The predecessor PR #20391 (#20331) landed at c5d6b2bd. No in-flight card claims these files; #20301 (spec lane) edits spec, not the CLITaken 2026-09-28T13:43Z,
origin/main6e3e5462c. Executes triage's grade (5865077508):os buildcalls the same function over the same view set, and ⛔ no second rule. Triage's moot condition (#20301 making the mismatch unauthorable) is not met: #20301 is in flight onlist.tabsonly.Clause-②: no:os buildstops writing an artifact the runtime already refuses at boot, which pulls the author-time door back to the declared contract.objectstack-fleet commentedon Sep 28, 2026
os-dev-report
{
"issue": 20393,
"status": "done",
"branch": "claude/issue-20393-build-view-container-name",
"pr": "#20459",
"session": "session_local_1d2a197c-c20e-4e90-9be8-413d4d432289",
"premise_still_valid": true,
"summary": "H0 held at origin/main 7fa3e3e: on the card's repro (os init -t app, os g object/view order_line, view name 'order_line' bound to my_app_order_line), os validate exited 1, os build exited 0 and wrote dist/objectstack.json carrying the container, and os serve on that artifact alone exited 1 with the boot refusal. The moot condition is not met (the container body name still parses; #20357 retired list.tabs only). compile.ts gains step 3a right after the schema parse, before the rule table and any artifact write: the same call validate.ts step 2c makes, findViewContainerNameRefusals(result.data), over objectql's viewContainerNameRefusal. There is no second rule or walk. --json is build's schema-exit envelope { success: false, errors, warnings: warningsSoFar(), conversions }, with the rows validate --json carries. The text face is validate's header plus bullets, with no step line. H1: result.data is the same parse expression validate judges and the object build serializes (step 4 adds only docs/runtimeModule), so the verdict is boot's on the artifact. After the fix, build --json errors[0].message is byte-equal (cmp, 568 bytes) to the os serve line, and the matching and no-name controls build. The parity ledger row moves from VALIDATE_ONLY_GATES (now empty, steady state) to SHARED_NON_REGISTRY_GATES. H2 was falsified: no build-door fixture reddened (structural census of 7909 files, 936 containers; 0 divergent in packages/cli, packages/qa, examples; all 15 nightly build-door e2e suites green). One deliberate extra: the pending .changeset/20331 entry's closing 'Not changed: os build does not run this check' paragraph was corrected. check-empty-changeset stays red by design for that DELIBERATE CORRECTION class and needs confirmation (open_questions).",
"tests": "All at HEAD 0c4e9c3 (after merging origin/main 3cf6449), unless noted. cli vitest --project unit --maxWorkers=2, 2 shards: 117 + 116 files, 1789 + 1547 tests passed (TMPDIR set to its realpath; see deviations). --project integration, local for the two view-container files only: test/build-view-container-name.test.ts (new, 6 tests) + test/validate-view-container-name.test.ts: 11/11 passed. The rest of the integration tier is declared to CI. OS_TEST_TIERS=nightly, all 15 build-door .e2e suites (build-json-failure-warnings/-conversions/-advisory-parity/-undeclared-key-parity, build-multi-package-artifact, compile-artifact-packages, config-miss-stdout-purity, and others): 297/297 passed. pnpm --filter @objectstack/cli typecheck: exit 0; tsc --listFilesOnly places the new test in the tsconfig.test.json program. examples app-crm / app-multi-package / app-showcase / app-todo: os build --json exit 0, success true, 0 refusals. Ablation at 72fd058 (fix committed first; scripts/ablation-replace.mjs wrap): the call in compile.ts was replaced with an empty typed array plus the marker __ABLATION_20393_NO_CALL. The tool reported anchor x1 to x0, replacement x0 to x1, blob 6b4b8871 to b7f532cb; on disk, marker count 1 and call count 0. Both pins read source (the parity test reads src text; the build pin runs bin/run-dev.js = src via tsx), so no dist leg applies. Result: 4/30 red: 'both commands run findViewContainerNameRefusals' (unit), THE PIN, the text face, and the packages[] case. The premise and both controls stayed green. The direction was red, as expected. Restore: git checkout HEAD -- on the absolute path; blob == HEAD 6b4b8871, git diff HEAD empty, porcelain empty, marker 0; the re-run was 30/30 green.",
"mcp_calls": "0",
"api_writes": "3 — POST /repos/objectstack-ai/objectstack/pulls (draft #20459, via with-fleet.sh -- gh pr create); POST /repos//issues/20459/assignees (label-write.mjs, read back: hotlong); POST /repos//issues/20393/comments (this report, via post-stamped.mjs). Not REST: 4 git pushes of the branch through with-fleet.sh --kind git push. A first label-write run outside with-fleet exited 3 with no token, so nothing was read or written.",
"gates": {
"node scripts/check-adr-0087-registration.mjs --base origin/main": 0,
"node scripts/check-adr-0087-registration.mjs --self-test": 0,
"node scripts/check-changeset-no-major.mjs --base origin/main": 0,
"node scripts/check-changeset-no-major.mjs --self-test": 0,
"node scripts/check-ci-filter-parity.mjs": 0,
"node scripts/check-closing-keyword-parity.mjs": 0,
"node scripts/check-closing-keyword-parity.mjs --self-test": 0,
"node scripts/check-comment-mask-adoption.mjs": 0,
"node scripts/check-comment-mask-adoption.mjs --self-test": 0,
"node scripts/check-comment-mask-corpus.mjs": 0,
"node scripts/check-empty-changeset.mjs --base origin/main": 1,
"node scripts/check-empty-changeset.mjs --self-test": 0,
"node scripts/check-issue-citations.mjs": 0,
"node scripts/check-keyed-text-bounds.mjs": 0,
"node scripts/check-keyed-text-bounds.mjs --self-test": 0,
"node scripts/check-platform-object-tenancy-census.mjs": 0,
"node scripts/check-platform-object-tenancy-census.mjs --self-test": 0,
"node scripts/check-plugin-teardown-shape.mjs": 0,
"node scripts/check-plugin-teardown-shape.mjs --self-test": 0,
"node scripts/check-registry-log-declared.mjs": 0,
"node scripts/check-registry-log-declared.mjs --self-test": 0,
"node scripts/check-rest-log-spy-declared.mjs": 0,
"node scripts/check-rest-log-spy-declared.mjs --self-test": 0,
"node scripts/check-system-context-census.mjs": 0,
"node scripts/check-system-context-census.mjs --self-test": 0,
"node scripts/check-undeclared-dep-imports.mjs": 0,
"node scripts/check-undeclared-dep-imports.mjs --self-test": 0,
"node scripts/docs-audit/check-affected-docs.mjs": 0,
"node scripts/docs-audit/check-drift-comment.mjs": 0,
"node scripts/pm/release-rehearsal-clone.mjs --self-test": 0,
"pnpm --filter @objectstack/spec run check:duration-unit-keys": 0,
"pnpm check:changeset-gate-self-tests": 0,
"pnpm check:cli-test-child-env": 0,
"pnpm check:cross-package-test-inputs": 0,
"pnpm check:doc-authoring": 0,
"pnpm check:driver-memory-census": 0,
"pnpm check:dts-closure": 0,
"pnpm check:engine-double-contract": 0,
"pnpm check:gitlink-declared": 0,
"pnpm check:i18n": 0,
"pnpm check:i18n-walk-parity": 0,
"pnpm check:issue-citations": 0,
"pnpm check:lean-entry-closure": 0,
"pnpm check:dual-build-cjs-loads": 0,
"pnpm check:i18n-coverage": 0,
"pnpm check:logger-receiver-detach": 0,
"pnpm check:nul-bytes": 0,
"pnpm check:objectql-double-limit": 0,
"pnpm check:objectui-changeset": 0,
"pnpm check:org-identifier": 0,
"pnpm check:page-declaration-shape": 0,
"pnpm check:pm-changeset-deadline-census": 0,
"pnpm check:published-files": 0,
"pnpm check:query-options-erasure": 0,
"pnpm check:refd-timer-probe": 0,
"pnpm check:slot-lookup": 0,
"pnpm check:sourcemap-no-sources-content": 0,
"pnpm check:test-source-alias": 0,
"pnpm check:tier-file-adoption": 0,
"pnpm check:type-check-coverage": 0,
"pnpm check:type-check-debt": 0,
"pnpm check:watch-hint-literal": 0,
"pnpm check:where-matcher": 0,
"pnpm lint": 0,
"node scripts/check-issue-citations.mjs --base origin/main": 0,
"node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran.list": 0
},
"line_budget": "357 changed lines (+346 / -11) over 6 files vs merge base 3cf6449, against the 5000 human-merge threshold: under. No skills/** or governed path is touched.",
"files_changed": [
".changeset/20331-validate-view-container-name.md (+2 -2)",
".changeset/20393-build-view-container-name.md (+24, new)",
"packages/cli/src/commands/compile.ts (+45)",
"packages/cli/src/commands/validate.ts (+2 -2, comment only)",
"packages/cli/test/build-view-container-name.test.ts (+251, new)",
"packages/cli/test/validate-build-gate-parity.test.ts (+22 -7)"
],
"deviations": [
"File surface beyond the claim: validate.ts step 2c comment ('os build does not run it') and .changeset/20331-validate-view-container-name.md's closing paragraph. This change made each false. Both are declared in the PR body.",
"node scripts/check-empty-changeset.mjs --base origin/main exits 1 by design: the gate classifies the 20331 edit as DELIBERATE CORRECTION and prescribes confirming it on the PR, not restoring it. This is recorded as 1 in gates.",
"Every build/test ran through os-verify-lock.sh in declared UNLOCKED mode (no flock on this Mac). The disclosure is quoted verbatim in the PR body.",
"Final unit and nightly runs used TMPDIR=/private/var/folders/td/3bdncl9543s2ydhh89zwc6q40000gn/T/ (the realpath). Under the default /var/... TMPDIR, published-subpath-console.pin (2), published-subpath-hook-body.pin (3) and config-miss-stdout-purity.e2e (20) fail on the /var vs /private/var prefix alone, for commands this diff does not touch. The same files passed with a realpath TMPDIR (29/29, 174/174).",
"check:dual-build-cjs-loads and check:i18n-coverage first exited 3 (PREREQUISITE NOT MET). They were re-run after building the named packages and exited 0; ran.list carries only the re-run lines.",
"One transient backup of the repro view file was written to /tmp/ov.bak and deleted in the same command (outside the scratchpad). The repro project, artifacts and census live in the scratchpad issue-20393/ directory."
],
"open_questions": [
{
"question": "Keep the correction to the pending .changeset/20331-validate-view-container-name.md? Its closing paragraph said 'Not changed: os build does not run this check, so it still writes an artifact carrying such a container', which this PR makes false. The paragraph now reads 'os build runs the same check as well (#20393, its own entry), so it no longer writes an artifact carrying such a container.' check-empty-changeset stays red until a person confirms.",
"options": [
"A: keep the correction and confirm it on the PR. The CHANGELOG entry that carries the claim is the one corrected, which AGENTS.md requires (a correction elsewhere is one a grep never reaches). The cost is a red Lint & Repo Gates context until confirmed. If a release consumes the 20331 file first, drop the edit on the resulting modify/delete conflict.",
"B: restore the 20331 file from base and rely on this PR's own entry. The gate goes green, and the release publishes the false sentence in the 20331 entry, followed by this entry."
],
"recommendation": "A, because the note is pending, both entries ship together, and the gate itself names restoring as the wrong remedy for this class."
}
],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in the PR Acceptance notes, not filed — under macOS default TMPDIR (/var symlinked to /private/var) three cli suites compare realpath against tmpdir(): test/published-subpath-console.pin.test.ts, test/published-subpath-hook-body.pin.test.ts, test/config-miss-stdout-purity.e2e.test.ts. They are red locally and green under a realpath TMPDIR. Test portability only; no public-door reach; CI is Linux.",
"carrier: 承接者:无 · noted, not filed — header prose now incomplete (not false): packages/cli/src/utils/view-container-names.ts opens "os validate's author-time half", and packages/objectql/src/view-container-name-refusal.ts says "called by the boot registrar and by os validate". os build now reaches both; objectql was read-only for this card."
]
}
Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
ACCEPT: PR #20459 at
0c4e9c37, R1 of thedomain:cliseat's new sessiondomain:cliexecution PM seat #6024 · sessionlocal_1d2a197c-c20e-4e90-9be8-413d4d432289· review of record, written 2026-09-28T15:03ZReviewed against GitHub and
origin/main, not against the report.Checklist:
PR shape: draft, base
main. The first line isFixes #20393, followed by a line-initialClause-②: no. A scan of the whole body finds one closing keyword,Fixes #20393.Scope: 6 files, all inside claim
5871106299as amended in place:compile.ts, which also coversos build(Build extends Compile);SHARED_NON_REGISTRY_GATES;@objectstack/clipatch);validate.tsstep 2c comment and the pending.changeset/20331-validate-view-container-name.md).check-governed-merges --pr 20459: NOT governed.packages/objectql/**is untouched. ⛔ No second rule: build calls the walkervalidate.tscalls, over the same parse.Review route: changeset prose is a contract-review surface. The at-tier record on the PR is PASS at this head. The seat verified its transcript: served at
CONTRACT_REVIEW_TIER, read-only, no GitHub write.DELIBERATE CORRECTION, confirmed by that same-head record (
landing-operations.md). The record names the corrected note by path and judges each rewritten sentence against this head:os builddoes not run this check …」 is false now;os buildruns the same check as well ([finding]os build/os compilewrites an artifact with a view container whosenamedisagrees with its object key, andos servethen refuses that artifact at boot #20393, its own entry) …」 is true;The dev's open question is answered A: keep the correction.
The one red,
Check Changeset, is that correction's rule alone, and all three conditions for enqueueing with it red hold:scripts/check-empty-changeset.mjs, the foreign-changeset scan) names this class as red by design, to be confirmed on the PR and never restored.pr-automation.yml, whose trigger ispull_requestalone, so it does not run onmerge_group. It is also not inmain's required status checks.Evidence (the dev's report on this card, checked against the PR):
mainbefore the edit:os buildexited 0 and wrote an artifact thatos serverefused.build --json'serrors[0].messageis byte-equal to the boot line, and both controls build.packages[]case), and the restore was proven.Commits: every non-merge commit carries the model-free trailer pair.
Out-of-scope findings, one line each:
packages/clisuites fail under macOS's defaultTMPDIR(/varsymlinked to/private/var) and pass under its realpath.Acceptance notes: host test portability only, not reachable from a public door, and CI runs on Linux.view-container-names.tsand objectql'sview-container-name-refusal.tsheaders nameos validateas the judge's caller but notos build.Acceptance notes: incomplete, not false.Next: landing once every other check completes green, as
markPullRequestReadyForReview+enablePullRequestAutoMerge(SQUASH) asobjectstack-fleet[bot].objectstack-fleet commentedon Sep 28, 2026
Landed: PR #20459 →
acd009521e6e8e4d3cb9d6df43d84aa53c44b4b3domain:cliexecution PM seat #6024 · sessionlocal_1d2a197c-c20e-4e90-9be8-413d4d432289· landing record, written 2026-09-28T15:27Zgit rev-list --parents -n 1gives 2 fields), and it is an ancestor oforigin/main. It was enqueued withCheck Changesetred by design (the confirmed DELIBERATE CORRECTION); the queue's required checks do not include it and did not re-run it.origin/main:packages/cli/src/commands/compile.tscallsfindViewContainerNameRefusals(2 hits)..changeset/20331-validate-view-container-name.mdcarries the corrected sentence 「os buildruns the same check as well ([finding]os build/os compilewrites an artifact with a view container whosenamedisagrees with its object key, andos servethen refuses that artifact at boot #20393, its own entry)」.completedby the PR'sFixes #20393.pm:dispatchedis stripped in this stroke.os build/os compilewrites an artifact with a view container whosenamedisagrees with its object key, andos servethen refuses that artifact at boot #20393 is the only card that left the opendomain:cliset.fix(cli): os build refuses a view container whose name disagrees with…