Skip to content

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

@os-zhuang

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 ./cloud subpath 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 at 0558e0f78; every other hit is a comment saying the type was deliberately re-declared inline). Remove the line.
  • If any consumer of the Cloud namespace exists in this repo or in hotcrm, re-point it to the inline declarations already used by marketplaceApi.ts:85, usePackageL10n.ts:6, PackagesPage.tsx:75; record the count here (expected 0, with a firing control).
  • No behaviour change; changeset states the removed type namespace (public @object-ui/types surface, so Clause-② yes — landing PR carries needs:contract-review).

Acceptance

  • zero imports of @objectstack/spec/cloud in objectui (control on the same grep)
  • @object-ui/types surface pin regenerated with the repo tooling
  • objectstack#16325 notified when landed

Refs objectstack#16325, objectstack#12036.

Activity

  1. added
    enhancementNew feature or request
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    on Sep 7, 2026
  2. self-assigned this
    on Sep 7, 2026
  3. removed their assignment
    on Sep 7, 2026
  4. hotlong commented on Sep 7, 2026

    @hotlong
    Contributor

    Yielded on a hot-file collision, not dispatched — pm:dispatched rolled back to pm:blocked

    domain:spec cross-repo lane, direct maintainer dispatch session session_f95e3874-e532-4748-a921-044aa2752a2b,
    readings 2026-09-07T06:0xZ. objectui origin/main cdbc852e9 (the card's reading was 0558e0f78).

    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 — assignee os-justin, session session_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/** covers packages/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#7122 added 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:1106 is stale — objectui main moved 0558e0f78 → cdbc852e9.
    Re-measured at cdbc852e9:

    $ 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: 15 export type * as lines total, so removing the
    Cloud one 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 with pm:blocked. ⛔ No half of the pair is left standing: no Claim:
    comment was ever posted for this card, and no agent was dispatched.

  5. self-assigned this
    on Sep 7, 2026
  6. hotlong commented on Sep 7, 2026

    @hotlong
    Contributor

    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/types surface 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 comment 5565861943 is 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 and pm:dispatched to os-justin on that same chain, but its real sites are disjoint from this card's single line (measured below). No other in-flight objectui card declares packages/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 the domain:spec seat 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 5565861943 was 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 on origin/main 411a132c0:

    #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 in index.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 ObjectSchema hits are different symbols sharing a name prefix, not the ObjectSchema.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#7122 line 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/main 411a132c0. The card body says packages/types/src/index.ts:1106; comment 5565861943
    corrected it to 1116. 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/** and apps/**
    (\bCloud\.[A-Z], excluding the declaring file), against a control of 15 export type * as lines 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.

  7. hotlong commented on Sep 7, 2026

    @hotlong
    Contributor

    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"
      ]
    }
  8. hotlong commented on Sep 7, 2026

    @hotlong
    Contributor

    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 head bdbdebf8. 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:215 is 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/examples for @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) job 101780633203 is failure —
    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-lane check-vi-mock-specifiers collapse. 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 reach scripts/**/*.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, so packages/components/src/__tests__/page-header-action-ids.dist.spec.tsx has 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; control spec/system 28 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 controls Data. 3 files, UI. 2); named import/export of Cloud from @object-ui/types 0 (controls System 1, Data 1); star re-exports 0; namespace imports 0; import('@object-ui/types').Cloud 0 (control 2 files); a perl cross-line scan of import braces over 4106 ts/tsx ⇒ 0 (controls System/Data/UI 1 each). The only bare Cloud, in the repo comes from lucide-react
    published surface reviewer used a cheaper independent method than the dev's probe: git archive base and head of packages/types, build both, diff the emitted dist/index.d.ts ⇒ exactly one line, as Cloud 1 → 0, family 15 → 14, as System identical as control, emitted JS byte-identical
    changeset 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 take minor), mechanically enforced by check-changeset-no-major.mjs
    the local red the dev dismissed verified rather than trusted: handler-keys-string-any-mirrors-7344.test.ts blob identical across base/main/head; its anchors read files this PR does not touch; under -P the anchor file sets are identical on both refs. Genuine host issue, #8361 accurate
    CI accounting 32 check runs (not 33): 28 success / 3 skipped / 1 failure. All three skips legitimately filtered (Test (coverage …) are if: push; dependabot is actor-gated), and the workflows that produced no run are schedule-, path- or merge-gated — ⛔ not missing coverage
    governed surface only .changeset/** and packages/types/src/index.ts; zero governed paths; Governed Surface Queue Guard green

    ⚠️ A small thing that matters more than its size

    The 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 \b and 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.

  9. hotlong commented on Sep 7, 2026

    @hotlong
    Contributor

    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"
      ]
    }
  10. hotlong commented on Sep 7, 2026

    @hotlong
    Contributor

    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 a merge-tree of today's main (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: extracted SCAN_ROOTS, the extension list, SKIP_DIRS and
    SPEC_SPECIFIER_RE verbatim from the test plus SPEC_PACKAGE_NAME from scripts/vite-objectstack-spec-dist.ts:48,
    and ran it over a git archive of 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 still toBeGreaterThanOrEqual (not weakened, not deleted), and the
    following toContain assertions 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, accepted
    the previously-skipped dist pin verified from the job's step list, not its overall conclusion: Test (shard 1/4) job 101810932838, step Run built-artifact pins (dist project) success, 16:42:51 → 16:43:29
    zero consumers re-derived a third time on today's main, the head, and the merge-tree result (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/bash 3.2.57 (8 probe parse failures), /usr/bin/grep BSD 2.6 printing Binary file … matches where the test asserts empty stdout, timeout absent. Genuine host reds; CI's four Linux shards green
    governed surface clean; Governed Surface Queue Guard green
    CI 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 reading

    Earlier in this card this seat reported "27 success / 3 skipped / 0 non-green". That was read off a truncated
    enumeration
    : gh api …/check-runs without --paginate returns 30 of 32, and the response's own total_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 :153 deriving 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 swept scripts/**, every
    packages/*/src/__tests__, vite.config.ts and vitest.config.mts for toBe|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: main recently took ab03bffae, 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 ./cloud is gone is for the spec-bump PR to check. Appended to the #16325 record.

    Landing

    Ready + enqueue. objectstack-ai/objectui does have a merge queue — ruleset 11776024 (main branch) carries
    rule types deletion, 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 no required_merge_queue key, and reported a configured queue as absent.

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

Metadata

Metadata

Assignees

Labels

domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneenhancementNew feature or requestpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions