Repository navigation
types: drop export type * as Cloud from '@objectstack/spec/cloud' before the upstream subpath is removed (step 2 of 3 of objectstack#16325) #8225
Description
Activity
- addedenhancementNew feature or requestNew feature or requestdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
on Sep 7, 2026 Yielded on a hot-file collision, not dispatched —
pm:dispatchedrolled back topm:blockeddomain:speccross-repo lane, direct maintainer dispatch sessionsession_f95e3874-e532-4748-a921-044aa2752a2b,
readings 2026-09-07T06:0xZ. objectuiorigin/maincdbc852e9(the card's reading was0558e0f78).Maintainer authorisation for the dispatch attempt, verbatim (⛔ quoted, not translated): 「这个作为专题卡,你直接派发」.
Why this card was NOT dispatched
The pre-dispatch targeted in-flight check found a declared file-surface intersection. objectui#7122 is
in flight — assigneeos-justin, sessionsession_01BAZFhALsQsGqxui8sNqM8s, branch
claude/issue-7122-spec-pin-17-3-0(continuing PR #7685) — and its claim comment declares:File surface:
pnpm-lock.yaml·packages/types/**(src, zod mirrors,__tests__) · …packages/types/**coverspackages/types/src/index.ts, which is this card's entire target. Same-file work
serialises across rounds; intersect ⇒ yield. objectui#7635 rides the same branch as item 2 of that chain.Blocked-by: objectstack-ai/objectui#7122added to the body so the unlock scan returns this card when that
chain lands, rather than leaving the constraint as prose nobody re-reads.⚠️ This lengthens the objectstack#16325 chain by one hop: objectstack#16325 ← this card ← objectui#7122.
Reported to the maintainer in the same session.Premise correction for whoever picks this up
The card's
packages/types/src/index.ts:1106is stale — objectuimainmoved0558e0f78→cdbc852e9.
Re-measured atcdbc852e9:$ git show origin/main:packages/types/src/index.ts | grep -nE "export type \* as Cloud|@objectstack/spec/cloud" 1116:export type * as Cloud from '@objectstack/spec/cloud';Line 1116, single occurrence. It sits inside a family of sibling namespace re-exports (
UI,System,
AI,API,Automation, …); control on the same file: 15export type * aslines total, so removing the
Cloudone leaves a deliberate gap that the changeset must name.Consumer count re-confirmed 0, with a firing control:
$ git grep -nE "\bCloud\.[A-Z]|from .*types.*\{[^}]*\bCloud\b" origin/main -- 'packages/**/*.ts' 'packages/**/*.tsx' \ | grep -v packages/types/src/index.ts (no output) $ git show origin/main:packages/types/src/index.ts | grep -c "^export type \* as" 15⇒ the zero is a real absence, not a dead pattern.
State
pm:dispatched+ assignee were set as step ① of the claim pair and are rolled back in the same session
— assignee cleared, label replaced withpm:blocked. ⛔ No half of the pair is left standing: noClaim:
comment was ever posted for this card, and no agent was dispatched.Claim: PM direct maintainer dispatch (no numbered round — direct-dispatch channel); serial hold cleared
Session:session_f95e3874-e532-4748-a921-044aa2752a2b
Branch:claude/issue-8225-drop-cloud-namespace-reexport
Worktree:objectui-issue-8225
Domain:domain:spec(cross-repo spec lane)
File surface:packages/types/src/index.ts(one export line) · the@object-ui/typessurface pin regenerated by this repo's own tooling ·.changeset/(stop on breach; explain in the report)
Container & model:S,mode:subagent,model: claude-fable-5-1(=CONTRACT_REVIEW_TIER; mandated by clause ② below — removing a published type namespace from@object-ui/types— not by a path glob)
Clause-②: yes
Serial constraints cleared: the hold recorded in comment5565861943is released on measurement, not on assumption — see below. objectui#7122 closed/completed, its chain PR #7685 merged 2026-09-07T07:48:20Z. objectui#7635 is still open andpm:dispatchedtoos-justinon that same chain, but its real sites are disjoint from this card's single line (measured below). No other in-flight objectui card declarespackages/types/src/index.ts.
Maintainer statement that prompted the re-check, verbatim (⛔ quoted, not translated): 「7122 已经合并了」.
Standing dispatch authorisation for this chain, verbatim: 「这个作为专题卡,你直接派发」.⚠️ Dispatched under the direct-dispatch channel while thedomain:specseat post (objectstack#6017) has an
incumbent. ⛔ No seat was seized; the authorisation above is what routes it.Why the hold is released — and why #7635 being open does not re-impose it
The hold in
5565861943was a hot-file collision with objectui#7122's declared surface,packages/types/**.
#7122 is closed, but its chain item #7635 is still open and dispatched on the same branch, so "the chain
landed" is not by itself enough. Measured onorigin/main411a132c0:#7635's declared sites are three
packages/types/src/__tests__/*files plus the objectui-side extension members
SelectOptionSchema.description/FieldSchema.rows/ObjectSchema.editMode, and two sites added by later
cross-lane comments (packages/app-shell/src/__tests__/spec-symbol-parity.test.ts,
apps/console/src/__tests__/registry-inputs-spec-parity.test.ts). Do any land inindex.ts?$ git show origin/main:packages/types/src/index.ts | grep -c SelectOptionSchema → 0 $ … | grep -c FieldSchema → 0 $ … | grep -c editMode → 0 $ … | grep -n ObjectSchema 515: ObjectSchemaMetadata, 516: ObjectSchemaClientExtensions,⇒ The only
ObjectSchemahits are different symbols sharing a name prefix, not theObjectSchema.editMode
member. That member's real declaration is elsewhere:$ git grep -ln editMode origin/main -- 'packages/types/src/**' packages/types/src/__tests__/object-schema-metadata-spec-derivation.test.ts packages/types/src/field-types.ts⇒ Intersection with this card's single line is empty, and provably so. ⛔ Nothing in
#7635's work touches
packages/types/src/index.ts.The
Blocked-by: objectstack-ai/objectui#7122line stays in the body as the record of why this card waited — a
closed target reads as satisfied; ⛔ deleting satisfied edges erases the history.Premise re-check at dispatch time (⛔ not inherited — the card's own number is stale twice over)
objectui
origin/main411a132c0. The card body sayspackages/types/src/index.ts:1106; comment5565861943
corrected it to1116. Both are stale. Now:$ git show origin/main:packages/types/src/index.ts | grep -nE "export type \* as Cloud" 1120:export type * as Cloud from '@objectstack/spec/cloud';Line 1120, single occurrence. Consumer count re-confirmed 0 across
packages/**andapps/**
(\bCloud\.[A-Z], excluding the declaring file), against a control of 15export type * aslines in the same
file ⇒ the zero is a real absence, not a dead pattern. ⛔ Whoever works this counts on the tree in front of them;
the line has moved three times in one day.os-dev-report
{ "issue": 8225, "status": "done", "branch": "claude/issue-8225-drop-cloud-namespace-reexport", "pr": "https://github.com/objectstack-ai/objectui/pull/8360", "premise_still_valid": true, "summary": "Removed `export type * as Cloud from '@objectstack/spec/cloud'` from packages/types/src/index.ts (located by content at line 1120 of origin/main 289d14687, single occurrence; the family goes 15 → 14 and the gap is marked in place with a 3-line comment) and added a `@object-ui/types: minor` changeset that spells out the breaking removal with no alias and no deprecation window. Premise re-verified on the tree: 0 `Cloud.` member accesses and 0 named `Cloud` imports from @object-ui/types over 4106 tracked ts/tsx files (PCRE census; the same regex fires on the consumed siblings UI. → 1 file and Data. → 4 files), 0 star re-exports of @object-ui/types elsewhere, 0 imports of the spec's cloud subpath outside that line, and hotcrm has no @object-ui/* dependency at all (package.json read; code-search control `objectstack` → 591). Acceptance item 2 ('surface pin regenerated with the repo tooling'): no such pin exists for @object-ui/types (no api-extractor report, typedoc output untracked, README names no namespace, no test snapshots the root export list) — reported as a stated absence. Acceptance item 3 (notify objectstack#16325 on landing) is left to the PM chain: I did not touch the objectstack or cloud repos. Draft PR #8360 opened with `needs:contract-review` (clause-② yes); assignee untouched; no second Claim posted. Worktree removed after the push.", "tests": "All heavy runs went through scripts/pm/os-verify-lock.sh, which on this macOS host has no flock and printed `VERDICT command-exit N · UNLOCKED (declared)` — the official disclosure block is pasted in the PR body. Final commit bdbdebf81; every run below is on a tree equal to it. (1) `pnpm --filter @object-ui/types build` (tsc + check-dist-completeness): `VERDICT command-exit 0`, dist/index.d.ts has 0 `as Cloud` and 14 `export type * as` lines. (2) `pnpm --filter @object-ui/types type-check` (tsc --noEmit + tsconfig.examples.json + tsconfig.test.json, so the tests ARE compiled): `VERDICT command-exit 0`. (3) `pnpm exec vitest run packages/types/` from the repo root: `Test Files 1 failed | 140 passed (141)`; the 1 red is handler-keys-string-any-mirrors-7344.test.ts, a host false-red — its anchors shell out to `git grep -E` with `\\b`, which Apple Git 2.50.1's BSD regex lacks (`-E` → 0 files vs `-P` → 97 for the same anchor; 0 vs 15 for the AppComponentSchema import anchor); the file is byte-identical to origin/main and reads nothing this PR touches; filed as #8361. (4) `pnpm --filter @object-ui/types lint`: exit 0, pre-existing no-explicit-any warnings only. (5) check-changeset-presence ✅ (1 source file, 1 changeset), check-changeset-fixed ✅, check-changeset-no-major ✅, check-spec-symbol-derivation ✅ (1353 files), check-control-bytes ✅ (6641 files), governed-queue-guard --test on both paths: NOT GOVERNED. (6) check-readme-exports: NOT MEASURED locally — 'the population COLLAPSED' because 35/40 packages are unbuilt in this worktree (floor 25); narrowing evidence: packages/types/README.md has 7 self-import bindings and 0 mention Cloud. (7) Downstream consumer type-check (whole repo) declared-narrowed to the census above; CI runs the farm. Reverse verification, two legs after the commit with a scratch consumer importing {Cloud, System} from the rebuilt dist: leg 1 source restored to base blob b92fa6959 (on-disk hash matched, dist `as Cloud`=1) → probe exit 0; leg 2 source at HEAD blob 06d971e8b (hash matched, `git diff HEAD` empty, dist `as Cloud`=0) → probe exit 2 with exactly `TS2305: Module '\"@object-ui/types\"' has no exported member 'Cloud'`, 0 errors mention System (control). Direction: turned red as expected. Restore ran under `trap ... EXIT INT TERM` with absolute paths.", "gates": [ { "gate": "pnpm --filter @object-ui/types build", "verdict": "VERDICT command-exit 0 · UNLOCKED (declared)" }, { "gate": "pnpm --filter @object-ui/types type-check", "verdict": "VERDICT command-exit 0 · UNLOCKED (declared)" }, { "gate": "pnpm exec vitest run packages/types/", "verdict": "Test Files 1 failed | 140 passed (141) — the 1 is a host false-red (BSD regex, #8361), not this change" }, { "gate": "pnpm --filter @object-ui/types lint", "verdict": "exit 0" }, { "gate": "node scripts/check-changeset-presence.mjs", "verdict": "✅ 1 source file of 1 released package changed, 1 changeset declared" }, { "gate": "node scripts/check-changeset-fixed.mjs", "verdict": "✅" }, { "gate": "node scripts/check-changeset-no-major.mjs", "verdict": "✅ No changeset declares a major bump" }, { "gate": "node scripts/check-spec-symbol-derivation.mjs", "verdict": "✅ 1353 files scanned" }, { "gate": "node scripts/check-control-bytes.mjs", "verdict": "✅ 6641 files" }, { "gate": "node scripts/check-governed-queue-guard.mjs --test", "verdict": "NOT GOVERNED" }, { "gate": "node scripts/check-readme-exports.mjs", "verdict": "NOT MEASURED locally (population collapsed: 35/40 packages unbuilt); README has 0 Cloud bindings; CI builds first" }, { "gate": "downstream type-check (whole repo)", "verdict": "declared narrowing to the 0-consumer census; CI" }, { "gate": "reverse verification", "verdict": "leg1 base → exit 0; leg2 HEAD → exit 2 TS2305 on Cloud only" }, { "gate": "CI on PR #8360", "verdict": "in_progress (33 checks: IN_PROGRESS/SKIPPED/SUCCESS at report time)" } ], "line_budget": "n/a — no skills/** files touched", "deviations": [ "Verification ran in DECLARED UNLOCKED mode (macOS host, no flock); disclosure block pasted in the PR body per the entry point's instruction.", "The inherited consumer census used `git grep -E` with `\\b`; on this host that engine has no `\\b` (0 hits for every sibling namespace too), so the census was redone with `-P` and a regex-firing control; conclusion unchanged (0).", "3-line comment added in the namespace block marking the deliberate gap — slightly beyond 'remove the line', declared here; it spells no spec specifier so the subpath grep stays at zero.", "check-readme-exports not measured locally (prerequisite: all packages built); downstream whole-repo type-check not run locally — both declared narrowings, CI covers them.", "One local vitest red is a host false-red (BSD regex), filed as #8361, not fixed in this PR (out of scope).", "hotcrm read (package.json + code search via gh REST) was a read-only premise check beyond the objectui tree; no write there.", "Acceptance item 2 answered as a stated absence (no surface pin exists); acceptance item 3 (notify objectstack#16325) left to the PM — objectstack repo not touched." ], "files_changed": [ "packages/types/src/index.ts", ".changeset/8225-drop-cloud-namespace-reexport.md" ], "mcp_calls": "0 — every GitHub read/write went through gh REST (issue/comments read, code search on hotcrm with a control, issue create, PR create, additive label POST, read-backs)", "open_questions": [], "out_of_scope_findings": [ "filed as #8361: handler-keys-string-any-mirrors-7344 census is host-dependent — git grep -E has no \\b on macOS (BSD regex), all five assertions red locally while CI is green; label finding, no assignee" ] }Contract-review-tier review: FAIL — one defect, already red in CI. Patch round 1 dispatched.
Reviewer: contract-review-tier subagent, dispatched by this PM seat because the seat does not hold that tier.
Target PR #8360 at headbdbdebf8. Findings ⛔ not inherited from the dev report or from
this seat's earlier fact-check; re-derived independently.The defect — inputs → wrong behaviour
scripts/__tests__/vite-objectstack-spec-dist.test.ts:215is a floor pin:expect(specifiers.size).toBeGreaterThanOrEqual(17); // :213-214 comment: "17 distinct specifiers"
It guards
collectSpecSpecifiers()(:977-994), which scans every ts/tsx/js file under
packages/apps/examplesfor@objectstack/spec[/subpath]string literals and takes the distinct set — a
guard against the scan silently going empty.This PR removed the repository's only
'@objectstack/spec/cloud'literal in that scanned tree. Distinct
count goes 17 → 16 (reviewer applied the same regex to the base and head blobs: the set difference is
exactly@objectstack/spec/cloud), so the floor fails:
AssertionError: expected 16 to be greater than or equal to 17.Not flake, and not pre-existing.
Test (shard 1/4)job101780633203isfailure—
Test Files 1 failed | 667 passed (668), that assertion the only red. Shards 2/3/4 green; the last seven other
PRs' shard 1/4 green; main's own red is an unrelated coverage-lanecheck-vi-mock-specifierscollapse. The test
file's blob is identical on base, main and head, so the PR is what moved the measured surface and the re-pin
belongs to it.scripts/__tests__is not governed surface.Why neither the dev nor this seat caught it: the dev's local run was
pnpm exec vitest run packages/types/,
whose path filter can never reachscripts/**/*.test.ts; and both of us read CI while it was still
in_progress. The reviewer waited for terminal state, which is the whole point of the step.⚠️ Knock-on:Run built-artifact pins (dist project)(ci.yml:791-792, shard 1 only) was SKIPPED because the
failing step preceded it, sopackages/components/src/__tests__/page-header-action-ids.dist.spec.tsxhas not
executed on this head. It must be green on the rerun — required in the patch report, not assumed.Everything else PASSED, re-derived
item evidence removal complete, nothing else taken diff is 2 files; index.ts−1 export line, +3 comment lines; namespace family base/main 15 → head 14, the 14 siblings byte-untouched; the gap comment names no spec specifier (head tree: 0 code hits for the cloud subpath, 5 pure-comment hits; controlspec/system28 files)⭐ zero consumers re-derived twice (head and current origin/main), with an engine self-test first: same tree-E '\bUI\.[A-Z]'⇒ 0 vs-P⇒ 2. Under-P:Cloud.member access 0 (same-shape firing controlsData.3 files,UI.2); named import/export ofCloudfrom@object-ui/types0 (controls System 1, Data 1); star re-exports 0; namespace imports 0;import('@object-ui/types').Cloud0 (control 2 files); a perl cross-line scan of import braces over 4106 ts/tsx ⇒ 0 (controls System/Data/UI 1 each). The only bareCloud,in the repo comes fromlucide-reactpublished surface reviewer used a cheaper independent method than the dev's probe: git archivebase and head ofpackages/types, build both, diff the emitteddist/index.d.ts⇒ exactly one line,as Cloud1 → 0, family 15 → 14,as Systemidentical as control, emitted JS byte-identicalchangeset present, @object-ui/types: minor, states the breaking removal with no alias and no window. Bump level correct per AGENTS.md (objectui's own breaking changes takeminor), mechanically enforced bycheck-changeset-no-major.mjsthe local red the dev dismissed verified rather than trusted: handler-keys-string-any-mirrors-7344.test.tsblob identical across base/main/head; its anchors read files this PR does not touch; under-Pthe anchor file sets are identical on both refs. Genuine host issue,#8361accurateCI accounting 32 check runs (not 33): 28 success / 3 skipped / 1 failure. All three skips legitimately filtered ( Test (coverage …)areif: push;dependabotis actor-gated), and the workflows that produced no run are schedule-, path- or merge-gated — ⛔ not missing coveragegoverned surface only .changeset/**andpackages/types/src/index.ts; zero governed paths;Governed Surface Queue Guardgreen⚠️ A small thing that matters more than its sizeThe changeset body cites the census "against a control of 15 namespace re-export lines". That is the
wrong-shape control — the one that does not exercise\band therefore proves nothing about the pattern
under test. It is this seat's original error, corrected by the dev, now propagating into the changelog. Fixing
it is part of the patch round: a bad control shipped as evidence is worse than no control, because the next
reader takes it as method.Also corrected in the patch round
The card's acceptance item "surface pin regenerated with the repo tooling" was answered as an absence. That is
right for@object-ui/types's own export surface — and stating an absence rather than inventing a
regeneration was the correct instinct — but there is a pin on the spec-import surface: the very test
that went red. The patch report answers the item accurately.State
REWORK, patch round 1 of at most 2, same claim, same branch. ⛔ No ACCEPT, no ready, no enqueue.
os-dev-report
{ "issue": 8225, "status": "done", "round": "patch round 1 (contract-review FAIL on one defect); same claim, same branch, same PR", "branch": "claude/issue-8225-drop-cloud-namespace-reexport", "pr": "https://github.com/objectstack-ai/objectui/pull/8360", "head": "21b1bf51f (patch commit on top of bdbdebf81; no rebase, no force-push)", "premise_still_valid": true, "summary": "The one defect is fixed: scripts/__tests__/vite-objectstack-spec-dist.test.ts's anti-vacuity floor on collectSpecSpecifiers() is re-pinned 17 → 16 (now at :220) and its comment names objectui#8225, the removed `/cloud` subpath and the objectstack#16325 chain, so the shrunken floor reads as deliberate. Reproduced the CI red locally before the edit (`expected 16 to be greater than or equal to 17`) and green after (`Tests 33 passed (33)`). The changeset's census clause no longer cites the wrong-shape control (15 namespace re-export lines); it cites the firing control the PR body carries (the same PCRE pattern hits the consumed siblings `UI.` and `Data.`). CI on 21b1bf51f is terminal and green: run 34143666942 completed/success, all four test shards success, and shard 1/4 step 9 `Run built-artifact pins (dist project)` completed/success — the dist pin packages/components/src/__tests__/page-header-action-ids.dist.spec.tsx has now executed on this head (confirmed from the job's step list, not assumed); 22 workflow runs on the head, 21 success + Dependabot Auto-merge skipped (actor-gated). Acceptance item 2 answered accurately: no pin exists on @object-ui/types's own EXPORT surface (no api-extractor report, typedoc output untracked, README names no namespace, no export-list snapshot), but the spec-IMPORT surface IS pinned by this very test — a hand-written floor with no generator, so 'regenerated with the repo tooling' means re-pinning it by hand with the reason, which is what this commit does. PR comment 5573458603 notes the patch round; worktree removed again after the push; background CI watcher stopped before this report.", "instance_counter_sweep": "Who counts instances of `@objectstack/spec` specifiers / subpaths (the class that bit this PR, and the class step 3 of objectstack#16325 will hit when the subpath is deleted upstream) — measured on head 21b1bf51f. Scanner population: 5 files contain a RegExp over the specifier or call the shared literal collector (recordDetailsInputs.spec-parity.test.ts, spec-ui-schema-reexports.test.ts, check-spec-range-floors.test.ts, ci-cd-pipeline-doc.test.ts, vite-objectstack-spec-dist.test.ts). Numeric pins on the TREE census of specifiers: exactly one — vite-objectstack-spec-dist.test.ts :220 (was :215), now 16; control: the sweep lists it with its new value. The other three scanner tests pin fixture sizes, not the tree. Comment-only mentions of the cloud subpath remaining in the scanned roots: 5 (4 code comments + packages/auth/README.md:220; the collector reads code extensions only, so none counts); code literals: 0. ⚠️ STEP-3 EXPOSURE, stated for whoever bumps objectui to the spec release that deletes `./cloud`: the same test pins the INSTALLED spec manifest's exports-map entry count twice — :152 `expect(declared.length).toBe(19)` and :608 `expect(injectedSpecKeys).toHaveLength(19)` (installedSpecDir = the resolved @objectstack/spec/package.json; the :146-151 comment records the last move, 18 → 19 on the 17.2.0 refresh). Both go 19 → 18 on that bump and must be re-pinned in the same PR; they are NOT touched here because the installed 17.3.0 still exports `./cloud` (verified) and CI is green. Also exposed then, not now: scripts/check-spec-range-floors.mjs reconciles subpaths mentioned in built artifacts against the spec manifest's exports map (finding `opaque-subpath`); after this PR no artifact mentions `/cloud`, so deleting it upstream produces no finding there. check-eager-closure-budget.mjs:109 and its test :696 mention `/cloud` in prose only.", "tests": "Local (all heavy runs through scripts/pm/os-verify-lock.sh → `VERDICT command-exit N · UNLOCKED (declared)`, macOS host without flock; disclosure block is in the PR body): (1) `pnpm exec vitest run scripts/__tests__/vite-objectstack-spec-dist.test.ts` before the edit: `Test Files 1 failed (1)`, `AssertionError: expected 16 to be greater than or equal to 17` (the CI red reproduced); after: `Test Files 1 passed (1)`, `Tests 33 passed (33)`, VERDICT command-exit 0. (2) `pnpm type-check:scripts` (tsc -p tsconfig.scripts.json, includes scripts/**/*.ts → the edited test): exit 0. (3) `pnpm lint:root` (eslint over scripts/ and the root): 0 errors, 32 pre-existing warnings. (4) `pnpm exec vitest run scripts/__tests__/` (the whole repository-level suite this time): `Test Files 3 failed | 117 passed (120)`, `Tests 4 failed | 3571 passed (3575)` — the 3 reds are host false-reds on macOS (bash32-floor-wiring self-test spawn syntax errors under bash 3.2.57; check-control-bytes expects GNU grep's silence where BSD grep prints `Binary file … matches`; ensure-chromium-ready needs coreutils `timeout`), all three files byte-identical to origin/main, none reads anything this PR touches; filed as #8404; CI shard 1/4 (which runs them) is success. (5) check-control-bytes ✅ 6642 files; check-changeset-presence ✅ 1 source file, 1 changeset; raw control-byte scan of the two patched files clean. CI on 21b1bf51f (terminal): CI run 34143666942 completed/success — Build & E2E, Build Docs, Changeset Fixed Group Check, Type Check, Test (shard 1/4), (2/4), (3/4), (4/4) all success; coverage jobs skipped (push-only); shard 1/4 step 8 `Run tests (shard 1/4)` success, step 9 `Run built-artifact pins (dist project)` success. Other workflows on the head: Auto Label PRs, Bundle Analysis, Changeset Guard, Changeset Presence, Control Bytes, Doc Component Types, Doc Fence Languages, Doc Snippet Types, Docs Links, Docs Route Eager Closure, Governed Surface Guard, Inert vi.mock Specifiers, Lint, Live E2E, Pre-Install Import Graph, README Exports, Shell Escape Residue, Skill Eval Tokens, Skill Examples, Skills Paths — all success; Dependabot Auto-merge skipped (actor-gated).", "gates": [ { "gate": "vitest scripts/__tests__/vite-objectstack-spec-dist.test.ts (pre-edit, mutation leg)", "verdict": "Test Files 1 failed (1) — expected 16 to be greater than or equal to 17 (CI red reproduced)" }, { "gate": "vitest scripts/__tests__/vite-objectstack-spec-dist.test.ts (post-edit)", "verdict": "VERDICT command-exit 0 · Tests 33 passed (33)" }, { "gate": "pnpm type-check:scripts", "verdict": "exit 0" }, { "gate": "pnpm lint:root", "verdict": "0 errors, 32 pre-existing warnings" }, { "gate": "vitest scripts/__tests__/ (whole dir)", "verdict": "117 passed | 3 host false-reds on macOS (#8404); CI shard 1/4 success" }, { "gate": "node scripts/check-control-bytes.mjs", "verdict": "✅ 6642 files" }, { "gate": "node scripts/check-changeset-presence.mjs", "verdict": "✅ 1 source file, 1 changeset" }, { "gate": "CI run 34143666942 on 21b1bf51f", "verdict": "completed/success; Test (shard 1/4..4/4) all success" }, { "gate": "shard 1/4 step 9 `Run built-artifact pins (dist project)`", "verdict": "completed/success (was skipped on bdbdebf81)" }, { "gate": "all other workflow runs on 21b1bf51f", "verdict": "21 success, 1 skipped (Dependabot Auto-merge, actor-gated), 0 failure" } ], "line_budget": "n/a — no skills/** files touched", "deviations": [ "Verification again in DECLARED UNLOCKED mode (macOS host, no flock) — disclosure carried in the PR body.", "The CI wait this round was a card-specific exception requested by the PM (confirm the dist-pin step), done as foreground `gh run watch` calls under the turn cap; the first call was moved to the background by the harness at the cap and was stopped (TaskStop) once the second foreground call read the terminal state, before this report.", "Three local scripts/__tests__ reds classified as host false-reds and filed (#8404), not fixed here (out of scope); CI is the judge and is green.", "Two step-3 exposures (the 19-entry exports-map pins at :152 and :608 of the same test) are stated, not touched: the installed spec still exports ./cloud and both are green.", "PR body not edited (a PATCH would strip the session footer); the patch round is recorded as PR comment 5573458603 and in this report." ], "files_changed": [ "packages/types/src/index.ts", ".changeset/8225-drop-cloud-namespace-reexport.md", "scripts/__tests__/vite-objectstack-spec-dist.test.ts" ], "files_changed_this_round": [ "scripts/__tests__/vite-objectstack-spec-dist.test.ts", ".changeset/8225-drop-cloud-namespace-reexport.md" ], "mcp_calls": "0 — every GitHub read/write went through gh REST (issue comment reads, run/job/step reads, gh run watch, issue create, PR comment, read-backs)", "open_questions": [], "out_of_scope_findings": [ "filed as #8361 (previous round): handler-keys-string-any-mirrors-7344 census is host-dependent — git grep -E has no \\b on macOS (BSD regex)", "filed as #8404: three more scripts/__tests__ files are host-dependent on macOS — bash32-floor-wiring (self-test spawn), check-control-bytes (BSD grep `Binary file … matches`), ensure-chromium-ready (`timeout` missing) — same class as #8361; label finding, no assignee; dedup read: #7692 and the other hits do not cover it" ] }ACCEPT — #8360 at
21b1bf51f. Contract-review-tier verdict: PASS.Reviewer of record for clause ②: the contract-review-tier subagent (this seat does not hold that tier, so the
clearance is not this seat's to give). Scoped re-review of the patch round; its FAIL findings are resolved and its
earlier PASS items were re-confirmed against amerge-treeof today'smain(9dcc54529, 15 commits ahead of the
base it first reviewed).The check that mattered most
A floor pin re-pinned to the wrong number is worse than a red one. So the reviewer did not read the new constant —
it re-implemented the counting algorithm: extractedSCAN_ROOTS, the extension list,SKIP_DIRSand
SPEC_SPECIFIER_REverbatim from the test plusSPEC_PACKAGE_NAMEfromscripts/vite-objectstack-spec-dist.ts:48,
and ran it over agit archiveof the head tree and of the merge tree. Both give distinct = 16 exactly
(ui 252, data 150, api 32, contracts 27, kernel 26, automation 18, bare 17, security 16, system 15, shared 15,
package.json 11, ai 4, identity 4, integration 3, qa 1, studio 1).⇒ 16 is a measured number, not a number chosen to turn the shard green.
collectSpecSpecifiers()is byte-identical
to the pre-patch version, the assertion is stilltoBeGreaterThanOrEqual(not weakened, not deleted), and the
followingtoContainassertions are untouched. The comment names objectui#8225, the file the removed literal lived
in, the objectstack#16325 chain, and the previous value.The rest
item verdict changeset census clause fixed — now cites a firing control of the same shape and engine ( UI.2 files,Data.3 under-P), replacing the 15-namespace-lines control that could not fire. Minor: it compresses two censuses' controls into one sentence; semantically sound, acceptedthe previously-skipped dist pin verified from the job's step list, not its overall conclusion: Test (shard 1/4)job101810932838, stepRun built-artifact pins (dist project)success, 16:42:51 → 16:43:29zero consumers re-derived a third time on today's main, the head, and themerge-treeresult (4112 files) — all zero, engine self-test and same-shape firing controls each time#8404's three local reds reproduced on this host using the binaries the tests actually spawn, not the reviewer's shell aliases: /bin/bash3.2.57 (8 probe parse failures),/usr/bin/grepBSD 2.6 printingBinary file … matcheswhere the test asserts empty stdout,timeoutabsent. Genuine host reds; CI's four Linux shards greengoverned surface clean; Governed Surface Queue GuardgreenCI 32 check runs: 29 success, 3 skipped, 0 otherwise. The three skips are the same legitimate filters as before ⚠️ A correction to this seat's own CI readingEarlier in this card this seat reported "27 success / 3 skipped / 0 non-green". That was read off a truncated
enumeration:gh api …/check-runswithout--paginatereturns 30 of 32, and the response's owntotal_count: 32
was sitting in the same payload, uncompared. Paginated, the answer is 29/3/0 — the conclusion survives, the method
did not. Reporting a clean sweep off a truncated enumeration is exactly what the "compare the returned count against
totalCount, never report clean" rule exists to prevent, and this seat broke it.Step-3 exposure — the reviewer found no third counter
Confirming the sweep recorded on objectstack#16325 (comment
5573633299): the two exports-map pins
(:152 toBe(19), plus:153deriving from it, and:608 toHaveLength(19)) read the installed spec manifest,
are correctly left alone here (lockfile resolves exactly one spec, 17.3.0, whose published exports map has 19 keys
including./cloud), and must move in the spec-bump PR. The reviewer sweptscripts/**, every
packages/*/src/__tests__,vite.config.tsandvitest.config.mtsfortoBe|toHaveLength|toBeGreaterThanOrEqual
of 18/19 near exports-map vocabulary and for every other reader of@objectstack/spec/package.json, and
enumerated each near-miss with why it is unrelated (i18n family counts, peer-comparison prose, plugin directories,
alias config; the three other manifest readers iterate dynamically with no count pin). No third counter exists.⚠️ One non-counter it added, unverified and not blocking:mainrecently tookab03bffae, a gate that judges spec
member citations in published prose. Five files cite cloud-subpath symbols in prose (packages/auth/README.md:220,
createAuthenticatedFetch.ts:106,marketplaceApi.ts:85,usePackageL10n.ts:6,PackagesPage.tsx:76). Whether
that gate calls them phantom once./cloudis gone is for the spec-bump PR to check. Appended to the #16325 record.Landing
Ready + enqueue.
objectstack-ai/objectuidoes have a merge queue — ruleset11776024(main branch) carries
rule typesdeletion, non_fast_forward, merge_queue, pull_request, required_status_checks.⚠️ This seat checked the
ruleset endpoint this time rather than repeating the mistake it made on the cloud repo, where it read classic
branch protection, found norequired_merge_queuekey, and reported a configured queue as absent.
Step 2 of 3 of the objectstack#16325 ruling (director seat, decision batch #62, 2026-09-07, option B): the cloud control-plane contracts leave
@objectstack/spec; the./cloudsubpath export is deleted upstream once cloud and objectui no longer import it.Blocked-by: #7122
Scope
packages/types/src/index.ts:1106—export type * as Cloud from '@objectstack/spec/cloud';is the only real dependency in this repo (measured at0558e0f78; every other hit is a comment saying the type was deliberately re-declared inline). Remove the line.Cloudnamespace exists in this repo or in hotcrm, re-point it to the inline declarations already used bymarketplaceApi.ts:85,usePackageL10n.ts:6,PackagesPage.tsx:75; record the count here (expected 0, with a firing control).@object-ui/typessurface, so Clause-② yes — landing PR carriesneeds:contract-review).Acceptance
@objectstack/spec/cloudin objectui (control on the same grep)@object-ui/typessurface pin regenerated with the repo toolingRefs objectstack#16325, objectstack#12036.