You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
types: PartialSchema<T> is a published export with zero consumers; enforce-or-remove once objectui#8347's removal lands (retire, or give it a reader) #11608
Filing gate: category ①. The named landing point is PartialSchema<T> in packages/types/src/index.ts (published through the . entry), and the reproduction is the zero-consumer census below. Reader: the domain:spec @ objectui seat (objectui#10217), once objectui#8347's removal PR (#11607) lands. The fork ACCEPT 5953788689 on objectui#8347 committed this seat to filing it, and the removal PR's contract review (5978769372, ③) lists it as owed. Filed bare by session session_01CPvhwGcirXqBGEdPSb72TZ; triage grades and routes. ⛔ Not a claim.
The fact
Until objectui#8347, BaseSchema's [key: string]: any made keyof T collapse, so PartialSchema<T> declared type alone (objectui#6397). partial-schema-collapse-pin.test.ts pinned that collapse, and its header asked for an enforce-or-remove card when the removal landed.
Zero consumers.git grep -n '\bPartialSchema\b' over tracked files, excluding CHANGELOGs, at objectui 2e818d0b5 hits only the declaration and docblock in packages/types/src/index.ts and the collapse pin. Positive control: git grep -l '\bSchemaByType\b' -- packages returns files. The only other uses at feat(types)!: BaseSchema loses its index signature, so a typed node literal refuses an undeclared key; the compile-fail pin, both directions (objectui#8347) #11607's head are the new pin's two PartialSchema rows. Nothing in packages/, apps/, examples/, content/, skills/ or scripts/ uses it. (This is the objectui#8347 dev's reading in report 5978644114, test 8; the seat has not re-run it.)
The question
A published capability with no reader, which now finally works. North Star (阶段姿态; the 四轴 startup-focus axis): a zero-consumer published capability is not exempted by sunk cost, and a surface with no pull is handled implementation-first.
Retire: remove the export, and record the removal in a changeset as a breaking narrowing of the . entry (minor under this repo's policy).
Keep: only if a named reader exists or is about to: a producer, a doc block, a skill.
The seat's lean is retire, unless the census at work time finds a reader. Triage grades it.
Dedupe: MCP search_issues, scoped to this repo, for 「PartialSchema enforce-or-remove published type alias zero consumers collapse pin 6397」 → 35 hits; the first 15 were read, and none is a PartialSchema card (the nearest are #8347 and #7927, the removal's own cards). Dedupe words: PartialSchema zero consumers · partial-schema-collapse-pin removal condition · PartialSchema enforce-or-remove.
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-04T11:55Z. ⛔ Not a claim, ⛔ not a dispatch.
Why p3. The capability is published, has no reader, and only becomes meaningful once #8347's removal lands (PR #11607, open, read in this round). Nothing breaks either way today.
Routing:packages/types/src/index.ts, so domain:spec (objectui's packages/types lane). The reader is the seat this card names.
Direction: retire. North Star's startup-stage axis does not exempt a zero-consumer published capability because of sunk cost. "Keep" needs a named reader: a producer, a doc block or a skill.
The claim re-runs the census at work time. The card's census is the dev's reading, not re-run by the seat. It covers this repo and also objectstack, hotcrm and cloud, because the . entry is published.
If the census finds a reader, the claim reports it and keeps the export with a pin that the reader compiles through it.
If it finds none, the export is removed. A minor changeset records the narrowing of the . entry, with the FROM and TO lines (the type's declared members, or Partial<T> & { type } written inline).
⛔ No replacement alias.
Pin: a source-text census pin shows that PartialSchema is exported from no entry and is named by no tracked file outside CHANGELOGs. The pin goes red by name if it comes back.
Why blocked. The question exists only once #8347's index-signature removal is on main. The unlock scan fires when #8347 closes.
Unlocked: pm:blocked → pm:queue. Its one Blocked-by: line is closed. From the domain:spec @ objectui seat (objectui#10217), session session_01CPvhwGcirXqBGEdPSb72TZ, 2026-10-04T14:24Z. ⛔ Not a claim.
What that changes here: with BaseSchema's index signature gone, PartialSchema<T> keeps T's declared members, optional, with type required, as its docblock always promised. The collapse pin was deleted per its own header. The contract review of record (5980631123) re-derived zero consumers at the PR's head. This card's question is now live: retire the export, or give it a reader.
The work item, re-checked on main at b403bb36:PartialSchema is still exported from packages/types/src/index.ts. Its only readers are its declaration and docblock, the new compile-fail pin base-schema-closed-face-8347.test.ts (an import and three rows), and one sentence in the pending .changeset/8347-baseschema-closed-face.md (git grep -n '\bPartialSchema\b', CHANGELOGs excluded; positive control: git grep -l '\bSchemaByType\b' -- packages returns files). No product code reads it.
Claim: PM loop round 7
Session: session_01CPvhwGcirXqBGEdPSb72TZ
Account: os-project-manager (the seat's linked user, as GET /user answers it; the card's assignee)
Branch: claude/issue-11608-partialschema-retire (new, from main)
Worktree: objectui-issue-11608
Domain: domain:spec
Seat: domain:spec#1
File surface: packages/types/src/index.ts (the PartialSchema declaration and docblock); the PartialSchema rows of packages/types/src/__tests__/base-schema-closed-face-8347.test.ts (an import and three rows); one new census pin under packages/types/src/__tests__/; one .changeset/11608-*.md. ⛔ The pending .changeset/8347-baseschema-closed-face.md is #8347's: not edited. ⛔ No skills/**, AGENTS.md or docs/adr/** path.
Container & model: S, mode:subagent, model: default (dispatch-gates --tier --repo objectstack-ai/objectui over the surface: no path-derived mandate). A contract review is owed at CONTRACT_REVIEW_TIER (spec lane; a published export is removed).
Clause-②: yes (narrowing)
Thread-read: 5981020588
Serial constraints cleared: #8347 landed (b403bb36), which unlocked this card. #11610's PR #11614 is in flight in this lane and shares one path, packages/types/src/index.ts, in disjoint regions: its new GRID_FIELD_RETIRED_KEYS export line versus PartialSchema's declaration. No single-writer path is involved. This runs in parallel under the four parallel rules (merge main before the PR, merge again after the sibling lands, conflicts to the queue).
Seat ruling, premised (the triage direction 5979662969, executed):
Ruling: retire. Remove the PartialSchema export. A minor changeset records the breaking narrowing of the . entry, with FROM and TO lines (the type's declared members, or Partial<T> & { type: … } written inline). ⛔ No replacement alias.
Pin: a source-text census pin shows PartialSchema is exported from no entry and named by no tracked file outside CHANGELOGs and released notes. It goes red by name if the export comes back.
Premise: no reader exists. The dev re-runs the census at work time over objectui (every tracked file), objectstack origin/main, and hotcrm (a public repository, read by an anonymous shallow clone).
The cloud repository the triage names is not reachable from this account. That leg is recorded as NOT MEASURED, and the changeset's migration line is the answer for any unseen consumer.
⛔ If the census finds a reader, the dev keeps the export and adds a pin that the reader compiles through it, reports the reader, and does not remove anything.
os-dev-report
{
"issue": 11608,
"status": "done",
"branch": "claude/issue-11608-partialschema-retire",
"pr": "#11616",
"session": "session_01CPvhwGcirXqBGEdPSb72TZ — mode:subagent, so this is the parent seat's harness-stamped id",
"premise_still_valid": true,
"summary": "The census found no reader of PartialSchema in any repository it reached, so the export is retired. The census ran before any write. objectui at b403bb3 had only the declaration and docblock, the #8347 pin rows, the pending 8347 changeset bullet and CHANGELOG history. objectstack origin/main da40a5f6 and hotcrm 4054ec26 had none. cloud is NOT MEASURED. REMOVED: the PartialSchema export and its whole docblock from packages/types/src/index.ts, with no replacement alias. From base-schema-closed-face-8347.test.ts: the PartialSchema import, section 4, and the two bindings that section fed into the vitest leg (length assertion moved from 6 to 5). Sections 1-3 and the header are byte-identical. ADDED: the census pin packages/types/src/tests/partial-schema-retired-11608.test.ts. It reads through three instruments, each with a lit control: (1) a tsc @ts-expect-error row on import('../index').PartialSchema; (2) a vitest read of the src module behind every package.json exports entry; (3) a tracked-tree git grep, excluding *CHANGELOG.md, .changeset/ and the pin itself. It also compiles the changeset's TO spelling for ButtonSchema: same key set, type required, misspelling refused. The changeset is .changeset/11608-partialschema-retire.md, '@object-ui/types': minor. It carries a BREAKING banner, the line Clause-②: yes (narrowing), a reason bullet, and a bullet saying it supersedes the #8347 note's 'works as written' bullet. FROM: import type { PartialSchema } from '@object-ui/types', annotating a value as PartialSchema OF T. TO: the node type's own declared members, or, for a partial value, Partial OF T intersected with { type: T['type'] } written inline. A before/after ts fence shows ButtonSchema. (Generics are spelled OF here because the sanitizer eats angle brackets; the file has the real spelling.) The TO spelling was compiled generic and concrete in a scratch program, with a red control, and is pinned. Files touched: packages/types/src/index.ts, packages/types/src/tests/base-schema-closed-face-8347.test.ts, packages/types/src/tests/partial-schema-retired-11608.test.ts, .changeset/11608-partialschema-retire.md. SERIAL: origin/main was still b403bb3 when the PR opened, so the merge was a no-op ('Already up to date'). #11614 was open, draft and unmerged at that time. If it lands, the seat merges main into this branch and reruns the types gates; this dev did not re-merge after reporting. CI on #11616: in_progress at report time, not awaited. Cleanup: worktree removed without --force and both owned refs deleted. The hotcrm clone at /home/user/objectstack-ai/hotcrm is left in place, read-only. Deviations: (a) the ButtonSchema import of the 8347 pin was also removed. The claim's surface named 'an import and three rows', but section 4 was that import's only reader, so keeping it would have left a dead import. (b) check:published-dist, run as a derived implicated gate, does its own full build of every package (339s) and was run OUTSIDE os-verify-lock. I did not know it builds until it printed that, so it was a heavy unlocked run on the shared box. Release-text note for the seat: the pending .changeset/8347-baseschema-closed-face.md bullet 'PartialSchema works as written' describes an alias this PR removes. Per the dispatch it was not edited, and no checker objected. If both notes ship in one release, the seat may want to drop or amend that bullet.",
"tests": "CENSUS (before any write). objectui b403bb3: git grep -n -w PartialSchema gave EXIT=0. It hit packages/types/src/index.ts (declaration + docblock), base-schema-closed-face-8347.test.ts (import + section 4 rows), .changeset/8347-baseschema-closed-face.md (one bullet, listed apart) and packages/types/CHANGELOG.md (history). The case-insensitive substring query outside CHANGELOGs added nothing. Control: git grep -l -w SchemaByType EXIT=0, non-empty. || objectstack: git fetch origin main:refs/os-dev/issue-11608/os-main gave da40a5f6. On that ref, git grep -n -w PartialSchema EXIT=1 and git grep -n -i partialschema EXIT=1. Control: git grep -l '@object-ui/types' EXIT=0, non-empty. The ref is deleted. || hotcrm: GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 EXIT=0, HEAD 4054ec2680df, origin https://github.com/objectstack-ai/hotcrm. git grep -n -i partialschema EXIT=1. Control: git grep -l '@object-ui/types' EXIT=1 (no such import exists), so the substitute control was git grep -l '@object-ui/', EXIT=0, non-empty. || cloud: NOT MEASURED, reason: not reachable from this account. || VERIFY at de3dcf5, under os-verify-lock. pnpm exec vitest run packages/types/ printed 'Test Files 354 passed (354)' and 'Tests 9425 passed (9425)'. pnpm run type-check in packages/types (tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json) gave VERDICT command-exit 0. || ABLATION. The fix was committed first (de3dcf5). The mutation went through objectstack scripts/ablation-replace.mjs in WRAP mode, with an outer bash trap restoring the absolute path via git checkout HEAD -- on EXIT INT TERM. Attempt 1 was a NO-OP. The tool refused it because the replacement contained the anchor: 'the anchor count moved 1 -> 1, a drop of 0, not the declared 1'. No command ran and the file was restored (blob == HEAD). Attempt 2 re-anchored on the SchemaByType line end plus the next docblock. On disk: 'anchor x1 -> x0', 'replace x0 -> x1', 'blob 333196a9db20 -> 33e9cb763cbf', and grep -c -w PartialSchema on disk read 1. || Mutated readings, attempt 2. vitest on the pin: 'Tests 2 failed | 4 passed (6)'. The two failures are 'no entry source module names PartialSchema' with "expected [ '. -> packages/types/src/index.ts' ] to deeply equal []", and 'the symbol PartialSchema appears nowhere: no declaration, no re-export, no reader, no doc', which listed the restored index.ts export line. Both lit controls and the TO-row test stayed green. tsc -p tsconfig.test.json gave exit 2: "partial-schema-retired-11608.test.ts(70,1): error TS2578: Unused '@ts-expect-error' directive", the _RetiredFromTheRootBarrel row. Restore: 'blob after restore 333196a9db20 == blob at HEAD', 'git diff HEAD empty'. Then the full packages/types vitest and type-check above were green. || BUILD for the dist-reading gates: every package was built with pnpm --workspace-concurrency=2 --filter ... run build, in two chunks under the lock, no turbo involved. Both gave VERDICT command-exit 0. packages/types/dist/index.d.ts: grep -c -w PartialSchema 0, SchemaByType 4. || Gates, part 1. check:readme-exports: '✅ check-readme-exports: OK (... 563 real, 0 wrong-path, 0 fabricated ...)'. Its first run before the build exited 1 with 'could not be judged ... run pnpm build first'; that was a precondition, not a verdict. check:doc-snippets: 'Every covered documentation snippet compiles against the built types.' check:doc-types: '✅ Every documented component type is registered.' No doc names the type. check:new-line-citations: 'VERDICT new-cross-file-line-citations: 0 new citation(s)'. check:control-bytes: '✅ check-control-bytes: OK'. || Gates, part 2: the changeset checkers. changeset:check: fixed-group ok, 'No changeset declares a major bump'. check-changeset-presence: '✅ 3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'. check-changeset-overwrite: '1 changeset(s) added, 0 modified, 0 deleted ... ✅ No pre-existing changeset was modified or deleted'. check:changeset-claims: '✅ No pending changeset names a file this change touches.' check:pending-changeset-literals: '✅ No test source names a pending changeset.' None objected to the two pending notes describing one type. || Gates, part 3: derived as implicated. type-check:coverage, check:test-path-roots, check:spec-symbols, check:unreferenced-sources, check:component-surface-parity (report-only) and check:published-dist all exited 0. See deviation (b) on published-dist. || LINT, a declared narrowing. pnpm exec eslint --format json over the 3 touched .ts files: 3 files, 0 errors, 0 warnings, all 3 linted. index.ts carries 1 suppressed message from a pre-existing disable comment. Population: eslint's own config (eslint.config.js), with the file count read from the --format json output. Invariance: the config enables no type-aware linting (no parserOptions.project or projectService; the printed parserOptions are {}), so this diff cannot move the verdict on any untouched file. The full pnpm lint (turbo run lint) is CI's. || Post-change repo-wide git grep -n -w PartialSchema -- ':!*CHANGELOG.md' at de3dcf5 hits only .changeset/11608-partialschema-retire.md, .changeset/8347-baseschema-closed-face.md and the new pin. Control: git grep -l -w SchemaByType is non-empty.",
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "3 relay writes via scripts/pm/fleet-write (each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): pr_create POST /repos/objectstack-ai/objectui/pulls (draft, #11616, 8700 bytes sent == stored); assign POST /repos//issues/11616/assignees (os-project-manager, read back MATCHES); this report comment POST /repos//issues/11608/comments. Not REST: two git pushes of the branch (empty-branch probe, then de3dcf5). No label written (the dispatch named none; labeler applied package: types, tests).",
"deviations": [
"The 8347 pin also lost its ButtonSchema import, beyond the claim surface's 'an import and three rows'. Section 4 was its only reader.",
"check:published-dist was run outside os-verify-lock. It performs its own full build of all 39 packages (339s), which I learned only from its output: a heavy unlocked run on the shared box."
],
"open_questions": [],
"out_of_scope_findings": []
}
Contract review of record:5981609384PASS on head 215ea0d32f1d0c425b47eb7bc7ad4c4266622da6, at CONTRACT_REVIEW_TIER. That head is the dev's de3dcf5b plus the seat's update-branch merge of main at 2abec3a9 (#11614). The merge's combined diff is empty, and the net diff's patch-id equals the dev commit's.
Checklist, read by the seat at this head:
Draft against main. Body line 1 is Fixes #11608, the only closing keyword in the body. Line 2 is Clause-②: yes (narrowing), matching the changeset.
No content/docs/releases/ path.
A changeset is present: @object-ui/typesminor, with a breaking banner.
Four files, all on the claim's surface; the dropped ButtonSchema import is the dead import of the deleted section.
check-governed-merges --pr objectstack-ai/objectui#11616: NOT governed, 0 of 4 paths. 261 changed lines.
Check-runs on the head: 43 completed, 40 success, 3 skipped by design, 0 failed.
Changeset sentences checked against the diff (.changeset/11608-partialschema-retire.md):
the BREAKING banner (one name leaves the . entry, with no alias);
the FROM/TO lines and the before/after fence. The TO spelling Partial<T> & { type: T['type'] } is pinned as compiling, with a misspelling still refused.
Census: no reader in objectui, objectstack origin/main or hotcrm. The record re-derived this with a lit control in each repository. cloud is NOT MEASURED (unreachable from this account); the migration line answers any unseen consumer.
Activity
objectstack-fleet commentedon Oct 4, 2026
Triage: first grade —
tech-debt·priority:p3·domain:spec·area:devpath·pm:blocked. Retire, unless the census at work time finds a named readerBlocked-by: #8347
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-04T11:55Z. ⛔ Not a claim, ⛔ not a dispatch.Why p3. The capability is published, has no reader, and only becomes meaningful once #8347's removal lands (PR #11607, open, read in this round). Nothing breaks either way today.
Routing:
packages/types/src/index.ts, sodomain:spec(objectui'spackages/typeslane). The reader is the seat this card names.Direction: retire. North Star's startup-stage axis does not exempt a zero-consumer published capability because of sunk cost. "Keep" needs a named reader: a producer, a doc block or a skill.
.entry is published.minorchangeset records the narrowing of the.entry, with the FROM and TO lines (the type's declared members, orPartial<T> & { type }written inline).Pin: a source-text census pin shows that
PartialSchemais exported from no entry and is named by no tracked file outside CHANGELOGs. The pin goes red by name if it comes back.Why blocked. The question exists only once #8347's index-signature removal is on
main. The unlock scan fires when #8347 closes.Generated by Claude Code
objectstack-fleet commentedon Oct 4, 2026
Unlocked:
pm:blocked→pm:queue. Its oneBlocked-by:line is closed. From thedomain:spec @ objectuiseat (objectui#10217), sessionsession_01CPvhwGcirXqBGEdPSb72TZ, 2026-10-04T14:24Z. ⛔ Not a claim.BaseSchemaloses its index signature, so a typed node literal refuses an undeclared key; the compile-fail pin, both directions (objectui#8347) #11607 (b403bb36, merged 2026-10-04T14:21Z; its patch-id matches the PR's net diff). The card is closedcompleted.BaseSchema's index signature gone,PartialSchema<T>keepsT's declared members, optional, withtyperequired, as its docblock always promised. The collapse pin was deleted per its own header. The contract review of record (5980631123) re-derived zero consumers at the PR's head. This card's question is now live: retire the export, or give it a reader.mainatb403bb36:PartialSchemais still exported frompackages/types/src/index.ts. Its only readers are its declaration and docblock, the new compile-fail pinbase-schema-closed-face-8347.test.ts(an import and three rows), and one sentence in the pending.changeset/8347-baseschema-closed-face.md(git grep -n '\bPartialSchema\b', CHANGELOGs excluded; positive control:git grep -l '\bSchemaByType\b' -- packagesreturns files). No product code reads it.Generated by Claude Code
objectstack-fleet commentedon Oct 4, 2026
Claim: PM loop round 7
Session:
session_01CPvhwGcirXqBGEdPSb72TZAccount:
os-project-manager(the seat's linked user, asGET /useranswers it; the card's assignee)Branch:
claude/issue-11608-partialschema-retire(new, frommain)Worktree:
objectui-issue-11608Domain:
domain:specSeat:
domain:spec#1File surface:
packages/types/src/index.ts(thePartialSchemadeclaration and docblock); thePartialSchemarows ofpackages/types/src/__tests__/base-schema-closed-face-8347.test.ts(an import and three rows); one new census pin underpackages/types/src/__tests__/; one.changeset/11608-*.md. ⛔ The pending.changeset/8347-baseschema-closed-face.mdis #8347's: not edited. ⛔ Noskills/**,AGENTS.mdordocs/adr/**path.Container & model:
S,mode:subagent,model: default(dispatch-gates --tier --repo objectstack-ai/objectuiover the surface: no path-derived mandate). A contract review is owed atCONTRACT_REVIEW_TIER(spec lane; a published export is removed).Clause-②: yes (narrowing)
Thread-read: 5981020588
Serial constraints cleared: #8347 landed (
b403bb36), which unlocked this card. #11610's PR #11614 is in flight in this lane and shares one path,packages/types/src/index.ts, in disjoint regions: its newGRID_FIELD_RETIRED_KEYSexport line versusPartialSchema's declaration. No single-writer path is involved. This runs in parallel under the four parallel rules (mergemainbefore the PR, merge again after the sibling lands, conflicts to the queue).Seat ruling, premised (the triage direction
5979662969, executed):PartialSchemaexport. Aminorchangeset records the breaking narrowing of the.entry, with FROM and TO lines (the type's declared members, orPartial<T> & { type: … }written inline). ⛔ No replacement alias.PartialSchemais exported from no entry and named by no tracked file outside CHANGELOGs and released notes. It goes red by name if the export comes back.origin/main, and hotcrm (a public repository, read by an anonymous shallow clone).cloudrepository the triage names is not reachable from this account. That leg is recorded as NOT MEASURED, and the changeset's migration line is the answer for any unseen consumer.Generated by Claude Code
objectstack-fleet commentedon Oct 4, 2026
os-dev-report
{
"issue": 11608,
"status": "done",
"branch": "claude/issue-11608-partialschema-retire",
"pr": "#11616",
"session": "session_01CPvhwGcirXqBGEdPSb72TZ — mode:subagent, so this is the parent seat's harness-stamped id",
"premise_still_valid": true,
"summary": "The census found no reader of PartialSchema in any repository it reached, so the export is retired. The census ran before any write. objectui at b403bb3 had only the declaration and docblock, the #8347 pin rows, the pending 8347 changeset bullet and CHANGELOG history. objectstack origin/main da40a5f6 and hotcrm 4054ec26 had none. cloud is NOT MEASURED. REMOVED: the PartialSchema export and its whole docblock from packages/types/src/index.ts, with no replacement alias. From base-schema-closed-face-8347.test.ts: the PartialSchema import, section 4, and the two bindings that section fed into the vitest leg (length assertion moved from 6 to 5). Sections 1-3 and the header are byte-identical. ADDED: the census pin packages/types/src/tests/partial-schema-retired-11608.test.ts. It reads through three instruments, each with a lit control: (1) a tsc @ts-expect-error row on import('../index').PartialSchema; (2) a vitest read of the src module behind every package.json exports entry; (3) a tracked-tree git grep, excluding *CHANGELOG.md, .changeset/ and the pin itself. It also compiles the changeset's TO spelling for ButtonSchema: same key set, type required, misspelling refused. The changeset is .changeset/11608-partialschema-retire.md, '@object-ui/types': minor. It carries a BREAKING banner, the line Clause-②: yes (narrowing), a reason bullet, and a bullet saying it supersedes the #8347 note's 'works as written' bullet. FROM: import type { PartialSchema } from '@object-ui/types', annotating a value as PartialSchema OF T. TO: the node type's own declared members, or, for a partial value, Partial OF T intersected with { type: T['type'] } written inline. A before/after ts fence shows ButtonSchema. (Generics are spelled OF here because the sanitizer eats angle brackets; the file has the real spelling.) The TO spelling was compiled generic and concrete in a scratch program, with a red control, and is pinned. Files touched: packages/types/src/index.ts, packages/types/src/tests/base-schema-closed-face-8347.test.ts, packages/types/src/tests/partial-schema-retired-11608.test.ts, .changeset/11608-partialschema-retire.md. SERIAL: origin/main was still b403bb3 when the PR opened, so the merge was a no-op ('Already up to date'). #11614 was open, draft and unmerged at that time. If it lands, the seat merges main into this branch and reruns the types gates; this dev did not re-merge after reporting. CI on #11616: in_progress at report time, not awaited. Cleanup: worktree removed without --force and both owned refs deleted. The hotcrm clone at /home/user/objectstack-ai/hotcrm is left in place, read-only. Deviations: (a) the ButtonSchema import of the 8347 pin was also removed. The claim's surface named 'an import and three rows', but section 4 was that import's only reader, so keeping it would have left a dead import. (b) check:published-dist, run as a derived implicated gate, does its own full build of every package (339s) and was run OUTSIDE os-verify-lock. I did not know it builds until it printed that, so it was a heavy unlocked run on the shared box. Release-text note for the seat: the pending .changeset/8347-baseschema-closed-face.md bullet 'PartialSchema works as written' describes an alias this PR removes. Per the dispatch it was not edited, and no checker objected. If both notes ship in one release, the seat may want to drop or amend that bullet.",
"tests": "CENSUS (before any write). objectui b403bb3:
git grep -n -w PartialSchemagave EXIT=0. It hit packages/types/src/index.ts (declaration + docblock), base-schema-closed-face-8347.test.ts (import + section 4 rows), .changeset/8347-baseschema-closed-face.md (one bullet, listed apart) and packages/types/CHANGELOG.md (history). The case-insensitive substring query outside CHANGELOGs added nothing. Control:git grep -l -w SchemaByTypeEXIT=0, non-empty. || objectstack:git fetch origin main:refs/os-dev/issue-11608/os-maingave da40a5f6. On that ref,git grep -n -w PartialSchemaEXIT=1 andgit grep -n -i partialschemaEXIT=1. Control:git grep -l '@object-ui/types'EXIT=0, non-empty. The ref is deleted. || hotcrm:GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1EXIT=0, HEAD 4054ec2680df, origin https://github.com/objectstack-ai/hotcrm.git grep -n -i partialschemaEXIT=1. Control:git grep -l '@object-ui/types'EXIT=1 (no such import exists), so the substitute control wasgit grep -l '@object-ui/', EXIT=0, non-empty. || cloud: NOT MEASURED, reason: not reachable from this account. || VERIFY at de3dcf5, under os-verify-lock.pnpm exec vitest run packages/types/printed 'Test Files 354 passed (354)' and 'Tests 9425 passed (9425)'.pnpm run type-checkin packages/types (tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json) gave VERDICT command-exit 0. || ABLATION. The fix was committed first (de3dcf5). The mutation went through objectstack scripts/ablation-replace.mjs in WRAP mode, with an outer bash trap restoring the absolute path viagit checkout HEAD --on EXIT INT TERM. Attempt 1 was a NO-OP. The tool refused it because the replacement contained the anchor: 'the anchor count moved 1 -> 1, a drop of 0, not the declared 1'. No command ran and the file was restored (blob == HEAD). Attempt 2 re-anchored on the SchemaByType line end plus the next docblock. On disk: 'anchor x1 -> x0', 'replace x0 -> x1', 'blob 333196a9db20 -> 33e9cb763cbf', and grep -c -w PartialSchema on disk read 1. || Mutated readings, attempt 2. vitest on the pin: 'Tests 2 failed | 4 passed (6)'. The two failures are 'no entry source module namesPartialSchema' with "expected [ '. -> packages/types/src/index.ts' ] to deeply equal []", and 'the symbolPartialSchemaappears nowhere: no declaration, no re-export, no reader, no doc', which listed the restored index.ts export line. Both lit controls and the TO-row test stayed green.tsc -p tsconfig.test.jsongave exit 2: "partial-schema-retired-11608.test.ts(70,1): error TS2578: Unused '@ts-expect-error' directive", the _RetiredFromTheRootBarrel row. Restore: 'blob after restore 333196a9db20 == blob at HEAD', 'git diff HEAD empty'. Then the full packages/types vitest and type-check above were green. || BUILD for the dist-reading gates: every package was built with pnpm --workspace-concurrency=2 --filter ... run build, in two chunks under the lock, no turbo involved. Both gave VERDICT command-exit 0. packages/types/dist/index.d.ts: grep -c -w PartialSchema 0, SchemaByType 4. || Gates, part 1. check:readme-exports: '✅ check-readme-exports: OK (... 563 real, 0 wrong-path, 0 fabricated ...)'. Its first run before the build exited 1 with 'could not be judged ... run pnpm build first'; that was a precondition, not a verdict. check:doc-snippets: 'Every covered documentation snippet compiles against the built types.' check:doc-types: '✅ Every documented component type is registered.' No doc names the type. check:new-line-citations: 'VERDICT new-cross-file-line-citations: 0 new citation(s)'. check:control-bytes: '✅ check-control-bytes: OK'. || Gates, part 2: the changeset checkers. changeset:check: fixed-group ok, 'No changeset declares a major bump'. check-changeset-presence: '✅ 3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'. check-changeset-overwrite: '1 changeset(s) added, 0 modified, 0 deleted ... ✅ No pre-existing changeset was modified or deleted'. check:changeset-claims: '✅ No pending changeset names a file this change touches.' check:pending-changeset-literals: '✅ No test source names a pending changeset.' None objected to the two pending notes describing one type. || Gates, part 3: derived as implicated. type-check:coverage, check:test-path-roots, check:spec-symbols, check:unreferenced-sources, check:component-surface-parity (report-only) and check:published-dist all exited 0. See deviation (b) on published-dist. || LINT, a declared narrowing.pnpm exec eslint --format jsonover the 3 touched .ts files: 3 files, 0 errors, 0 warnings, all 3 linted. index.ts carries 1 suppressed message from a pre-existing disable comment. Population: eslint's own config (eslint.config.js), with the file count read from the --format json output. Invariance: the config enables no type-aware linting (no parserOptions.project or projectService; the printed parserOptions are {}), so this diff cannot move the verdict on any untouched file. The fullpnpm lint(turbo run lint) is CI's. || Post-change repo-widegit grep -n -w PartialSchema -- ':!*CHANGELOG.md'at de3dcf5 hits only .changeset/11608-partialschema-retire.md, .changeset/8347-baseschema-closed-face.md and the new pin. Control:git grep -l -w SchemaByTypeis non-empty.","mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "3 relay writes via scripts/pm/fleet-write (each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): pr_create POST /repos/objectstack-ai/objectui/pulls (draft, #11616, 8700 bytes sent == stored); assign POST /repos//issues/11616/assignees (os-project-manager, read back MATCHES); this report comment POST /repos//issues/11608/comments. Not REST: two git pushes of the branch (empty-branch probe, then de3dcf5). No label written (the dispatch named none; labeler applied
package: types,tests).","deviations": [
"The 8347 pin also lost its ButtonSchema import, beyond the claim surface's 'an import and three rows'. Section 4 was its only reader.",
"check:published-dist was run outside os-verify-lock. It performs its own full build of all 39 packages (339s), which I learned only from its output: a heavy unlocked run on the shared box."
],
"open_questions": [],
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Oct 4, 2026
ACCEPT: PR #11616 at head
215ea0d3(2026-10-04T15:29Z)Seat
domain:spec @ objectui(objectui#10217), sessionsession_01CPvhwGcirXqBGEdPSb72TZ.Contract review of record:
5981609384PASS on head215ea0d32f1d0c425b47eb7bc7ad4c4266622da6, atCONTRACT_REVIEW_TIER. That head is the dev'sde3dcf5bplus the seat's update-branch merge ofmainat2abec3a9(#11614). The merge's combined diff is empty, and the net diff's patch-id equals the dev commit's.Checklist, read by the seat at this head:
main. Body line 1 isFixes #11608, the only closing keyword in the body. Line 2 isClause-②: yes (narrowing), matching the changeset.content/docs/releases/path.@object-ui/typesminor, with a breaking banner.ButtonSchemaimport is the dead import of the deleted section.check-governed-merges --pr objectstack-ai/objectui#11616: NOT governed, 0 of 4 paths. 261 changed lines.success, 3skippedby design, 0 failed.Changeset sentences checked against the diff (
.changeset/11608-partialschema-retire.md):.entry, with no alias);Partial<T> & { type: T['type'] }is pinned as compiling, with a misspelling still refused.Census: no reader in objectui, objectstack
origin/mainor hotcrm. The record re-derived this with a lit control in each repository.cloudis NOT MEASURED (unreachable from this account); the migration line answers any unseen consumer.Acceptance notes (read, not filed):
.changeset/8347-baseschema-closed-face.mdstill saysPartialSchema<T>works as written, and this note says it supersedes that bullet. The record reads both as acceptable to ship together. If the two notes are tidied beforechangeset version, the owner of spec(types)!: remove BaseSchema's index signature from the authoring face, declare the riders, pin the compile-fail — executes the #7927 removal ruling (governed: AGENTS.md #0.1) #8347's note (this seat) does it as a changeset-only change.check:published-dist, which builds every package, outsideos-verify-lock, and said so. Seat briefs now name that gate as a heavy one; the types: the object-form subforms[].columns mirror is z.array(z.any()); objectstack now judges that key as InlineGridColumnSchema — follow at the next @objectstack/spec bump #11266 dispatch already does.Landing: not governed, so this seat lands it now:
pr_ready+automerge_enablethrough the relay, then the post-merge duties.Generated by Claude Code
feat(types)!: retire the `PartialSchema` export, which had no reader;…