Skip to content

refactor(metadata-protocol): move the publish backfill pair and the draft pair out of protocol.ts into protocol-publish-backfill.ts and protocol-drafts.ts (#25467 cut 12) - #25939

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-ybjm3h
Oct 26, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-ybjm3h

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Leehom · project thread

Part of #25467
Clause-②: no
Metadata-protocol: none
Ruling-ref: 6270097840

Cut 12 of the protocol.ts split (#24586 ruling A, recorded in 6270097840). Cuts 1–11 landed as #25494, #25518, #25538, #25589, #25601, #25623, #25642, #25719, #25731, #25740 and #25797. The claim is 6407710285; the scope is the cut 12 proposal of the cut 11 report (6397905786), as the server seat approved it in its dispatch order.

Four ObjectStackProtocolImplementation members move unedited into two new modules (#23050 shape B, one engine getter each), one per family, because the two families share no helper and no member:

  • packages/metadata-protocol/src/protocol-publish-backfill.ts: the publish backfill pair, planPublishBackfill and applyPublishBackfill.
  • packages/metadata-protocol/src/protocol-drafts.ts: the draft pair, listDrafts (public) and discardDraftInItsScope.

protocol.ts loses 146 net lines (29,769 to 29,623). The cut is move-only, and the card stays open for later cuts.

Branch claude/project-thread-ybjm3h is the harness-pinned branch for this thread. It names no issue, so the claim comment is the identity record. It holds the move commit 31ecbf1a, the pin commit 6d1256e1, both on main cb0a2fcf4f (cut 11's merge 4893a2fb2c is in its history), and the merge of main f00e8d5c3c (d6e35b43). That merge brought one commit (#25830) that touches no file of packages/metadata-protocol/ (the package's src/ tree is 980b4345 at both cb0a2fcf4f and f00e8d5c3c).

Serial with the file's in-flight PRs. Measured just before this PR was opened: of the 9 open PRs, two touch packages/metadata-protocol/src/. #25813 edits seed-loader.ts and its test, disjoint. #25826 has one protocol.ts hunk, at lines 9021–9060, textually disjoint from this cut's hunks (the imports near the top, seven module-level declarations above line 4000, and the class between lines 23440 and 24900); whichever lands second merges main.

What moves

Member Base line Visibility Module AST tokens (params + return + body)
listDrafts :23440 public protocol-drafts.ts 233
planPublishBackfill :23651 private protocol-publish-backfill.ts 620
applyPublishBackfill :23743 private protocol-publish-backfill.ts 852
discardDraftInItsScope :24875 private protocol-drafts.ts 119

The shape (#23050 shape B, as cuts 1–11 apply it)

  • The class keeps every member with its name, docblock, signature and position; listDrafts keeps its declared public return type. Each body is now one host literal plus a .call, marked [#25467 cut 12].
  • Typing. PublishBackfillHost and DraftsHost type every member as the class member itself (an indexed access on ObjectStackProtocolImplementation). Each moved function types its this as the Pick of its module's host over exactly the members its body reads. Each stub annotates its literal as ThisParameterType of typeof fn. No cast, no generic member (so the plain .call spelling of cuts 1–10), and no member changes visibility.
  • Members read, measured. planPublishBackfill reads engine and getOverlayRepo; applyPublishBackfill reads engine and updateManyData; listDrafts reads engine, ensureOverlayIndex and getOverlayRepo; discardDraftInItsScope reads deleteMetaItem. engine goes as a GETTER, so the read happens when the body makes it (tests replace it on a constructed protocol); each method goes as a closure on the protocol. No private-static member is read, and nothing on the Release's stay list moves: runPublishSideEffects, promoteDraftForPublish, publishPackageDrafts and discardPackageDrafts stay in the class. The order's hypotheses hold.
  • Every other caller still calls the class method: publishPackageDrafts calls the backfill pair; the _drafts doors call listDrafts; discardPackageDrafts and revertStoredPackage call discardDraftInItsScope.

Module-level declarations, by reader

  • Seven gain export, none moves. The bodies read canonicalMetaType, clientFacingFailureText and the interface MetadataIssueEntry (already exported), plus seven declarations that gain export in place, as cuts 8 and 11 did: isItemOfDisabledPackage, bundleMemberDiscriminator, clientFacingFailureCode, publishBackfillRefusal, PUBLISH_BACKFILL_PAGE_SIZE, and the types PublishBackfillEntry and PublishBackfillReceipt. Six of the seven keep readers in protocol.ts (the two types are named by the stubs' own signatures; publishBackfillRefusal is thrown by readPublishBackfillRequest too). PUBLISH_BACKFILL_PAGE_SIZE has no reader left in protocol.ts; it stays with its family's declarations (see Acceptance notes). The new modules import them from protocol.js; the cycle is evaluation-safe because each is read only inside a function body.
  • index.ts names what it publishes from protocol.ts one by one, so the published surface does not move (measured below).
  • Imports in protocol.ts. One import loses its last reader and is dropped: discriminateDefaultValueShape from @objectstack/spec/data (2 occurrences at base, the import and planPublishBackfill's call). The new modules import it, DroppedFieldsEvent, UpdateManyDataRequest, PLURAL_TO_SINGULAR and I18nLabel from the same spec subpaths. The two new statements are the imports of the new modules.

The published .d.ts

The series bar is ruling 6348891160, sorted-union identity, measured first. Base and head were built with pnpm --filter @objectstack/metadata-protocol build against one dependency tree (the closure built at head, then the package's src/ swapped tree-only to base for the base build and restored from HEAD under a trap; git diff HEAD empty, git status clean and all four touched blobs equal to HEAD's after). Measured twice: before the merge (base cb0a2fcf4f, head 6d1256e1) and after it (merged base, head d6e35b43, closure rebuilt with a full pnpm build, 119/119).

  • Raw sha256: 325970c1661efaa6a3762ce7de9e6bb205ea16099784f2b6c5950d62d175b331 at base and at head, on both dist/index.d.ts and dist/index.d.cts, 772,838 bytes each, in both measurements (the hash cuts 8–11 reported). Raw identity holds, so sorted-union identity holds too. The three private members stay private NAME; lines; listDrafts prints its declared signature unchanged.
  • Normalised sha256: aa05995b9d9a32f69b3416eac92ef86b46d79593001a37bf1bb529ed7a9f8952 at both ends (80 string-literal union runs sorted; this run's own normaliser, so the hash is not comparable with cut 11's).
  • The two builds differ where they should: index.js hashes bbe1a227b80604e0… at base (cut 11's head hash) and 066b577863ed02f0… at head; each of the four functions' .call(host sites occurs 0 times in the base bundles and once in the head bundles (ESM and CJS alike).
  • Positive control on the head tree (on disk, restored from HEAD under a trap, hash equal to HEAD's after): private dropped from discardDraftInItsScope and the package rebuilt. Both .d.ts files move to d0a5c1ec3071d8c8… and print the member's full signature, its parameter docblock included, so the bar can see a change on these members.
  • Export tables. The ESM and CJS bundles, loaded at runtime from the package, each export the same 78 names at base and head, in both measurements; the sorted list hashes to 9f18a0177ac736ed… on all of them. None of the moved functions, the two host types or the seven newly exported declarations appears.

No changeset: skip-changeset, per ruling 6348891160.

Proof of move-only

  • Bodies, by AST token (the TypeScript compiler's AST leaf tokens, JSDoc skipped, over parameters less the added this, return type and body): 1,824 tokens compared, 0 differ. The parameter, return-type and body text, comments included, is also equal with whitespace collapsed, for all four. Negative control: one changed token in applyPublishBackfill's body (ids.length === 0 to ids.length !== 0, on an in-memory copy) makes the check report differ=1 on that member and 0 on the other three.
  • Class side. 299 members at base and at head, in the same order. The 295 that did not move are byte-identical to base, leading comments included. Each of the 4 stubs sits at its base position and keeps its docblock and signature byte-identical (everything before the body's opening brace).
  • Top level of protocol.ts. 231 of the 239 base statements other than the class are byte-identical, leading comments included. Of the other eight, seven gain the export keyword and nothing else, and one is the @objectstack/spec/data import, which loses the discriminateDefaultValueShape line. Head adds two statements, the new modules' imports.
  • Size. +401 / −183 over 4 files, 584 changed lines (the order's estimate was 450–550; the 900-line split bar is not reached). protocol-publish-backfill.ts has 239 lines, protocol-drafts.ts 122.

Readers of the moved lines

Every test and script that reads protocol.ts by path (20 files), and every test file in packages/ and scripts/, was grepped for the four member names and for the seven declarations that gained export.

  • No by-path reader of the moved bodies. Outside protocol.ts the names planPublishBackfill, applyPublishBackfill, discardDraftInItsScope, publishBackfillRefusal, PUBLISH_BACKFILL_PAGE_SIZE and PublishBackfillEntry occur nowhere but CHANGELOG.md entries; PublishBackfillReceipt also names an unrelated local type in ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx. listDrafts is a public verb the tests call through the protocol, not by path.
  • protocol.read-verb-canonical-fold.test.ts scans protocol.ts for request-taking verbs whose required type is folded; listDrafts takes an optional type? filter and is out of that population by the pin's own rule, and its signature line stays in place. Green, list unchanged.
  • Bracketed-refusal pin (PRODUCERS): applyPublishBackfill's three new Error( move with its body, so the new module gets a row, 'protocol-publish-backfill.ts': 3, the module's own count, beside the rows cuts 1, 3, 5, 6, 7 and 10 added. protocol.ts goes from 74 to 71 such sites, still above its floor of 5; protocol-drafts.ts has none and gets no row. Control: with the first of the module's throws changed to new TypeError( (on disk, restored from HEAD under a trap, hash equal to HEAD's after), the new row fails with "protocol-publish-backfill.ts no longer constructs errors here — this pin is scanning the wrong file: expected 2 to be greater than or equal to 3" (1 failed, 13 passed); restored, 14/14 pass. (The control's first attempt matched no anchor and changed nothing, so it is not counted; the run above is the second, with its on-disk counts read before the test: 2 new Error(, 1 new TypeError(.)
  • ADR anchors and decision letters. check-adr-anchors exits 0 at both ends: 85 anchored files, 58,830 citations, 1,847 → 1,846 decision-letter citations, files 8,247 → 8,248. The one letter citation that leaves the anchored surface is listDrafts' body comment [ADR-0131 D6] The environment's pending drafts., now in protocol-drafts.ts (protocol.ts cites ADR-0131 D6 118 times at base, 117 at head). The protocol.ts anchor entry does not cover ADR-0131, and no moved body is the mechanism of any entry paragraph, so the new modules get no entry (disclosure only, as cut 8 disclosed its ADR-0090 D11 citation).
  • Durability checker: check-durability-degradation-log-level exits 0 at both ends with identical output. In its --list (lines stripped of [@:][0-9]+), the one difference is the file of the read seam guards find() in applyPublishBackfill() → no invented answer, listed under protocol.ts at base and under protocol-publish-backfill.ts at head; its verdict is unchanged.
  • Engine-double contract (check-engine-double-contract): exits 0 at both ends. The updateData/deleteData seams keep their entries at new line numbers (14022 → 14025, 14047 → 14050). productionFiles is 3,701 at base and 3,704 at head: +2 are the new files, +1 is the gitignored packages/spec/src/migrations/registry.ts, which the spec build writes in the head tree and the clean base tree had not built.
  • Identical output at both ends: check-adr-symbol-anchors, check-system-context-census, check-tenant-audit-census, check-query-options-erasure-ratchet, check-filter-alias-parity. check-nul-bytes differs only in the scanned file count, +2. The base-end readings were taken in a clean detached worktree at cb0a2fcf4f.
  • Platform checklist. check-platform-checklist --changed-from origin/main: OK, 1 anchored file in the change set, 29 anchors judged, 0 lost.
  • Governed surface. check-governed-merges --branch claude/project-thread-ybjm3h: 0 of 4 paths hit the register, NOT governed; 584 changed lines, under the 3,000-line human-merge bar.

Verification

All at head d6e35b43 unless stated.

  • tsc --noEmit in packages/metadata-protocol exits 0, before and after the merge. pnpm exec eslint --no-inline-config packages/metadata-protocol (the whole touched package) exits 0, no output.
  • packages/metadata-protocol suite, base and head, compared per test name and status (vitest --maxWorkers=2, JSON reporter, each run under the shared verify lock, VERDICT command-exit 0 both legs), on the pre-merge tree (the merge changed no file of the package):
    • Base cb0a2fcf4f: 21,509 tests (21,490 passed, 0 failed, 19 skipped), 266 files.
    • Head 6d1256e1: 21,510 tests (21,491 passed, 0 failed, 19 skipped), 266 files.
    • None lost, none changed status, one added: the new PRODUCERS row's case. The base leg is the package src/ swapped tree-only from cb0a2fcf4f (the new modules removed from the tree) and restored from HEAD under a trap.
  • Derived gates. dispatch-gates --commands --repo objectstack-ai/objectstack derives 59 gates on 4 changed paths, the same list before and after the merge; all 59 exit 0 on the merged tree, after a full pnpm build (119/119, VERDICT command-exit 0) and with the plugin-teardown fixture commit fetched first. dispatch-gates --ran: 59 derived, 59 run, 0 NOT-MEASURED, 0 UNRUN, exit 0.

Acceptance notes

  • PUBLISH_BACKFILL_PAGE_SIZE now has its only reader in protocol-publish-backfill.ts (it had no other reader at base either). It stays in protocol.ts beside the other [#24253] backfill declarations, whose remaining readers (readPublishBackfillRequest, publishPackageDrafts) did not move; a later cut that moves the request judgement and the receipt types could take the family whole.
  • listDrafts' [ADR-0131 D6] comment now sits in an unanchored module (see Readers above); the anchor file never named ADR-0131, so nothing that guarded it before stops guarding it.

Carry-forward

Unchanged from cut 11: public members whose return type is inferred, the bodies kept by a reader (probeRecord, getMetaItemCached, findReferencesToMeta, packagelessAddress, refuseUnmintableMetaType, metaTypeNamespaceExists, viewContainerNameCollisionRefusal with overlaidShippedContainerViewNames, reportPageRequiresAbsentAtLoad, the 7 applyRegistryWriteThrough callers, readCodeLayerForCarryForward), and the private-static readers stay in protocol.ts; this cut adds runPublishSideEffects, promoteDraftForPublish, publishPackageDrafts and discardPackageDrafts to that list, for the reasons the cut 11 report gave.


Generated by Claude Code

…raft pair out of protocol.ts (#25467 cut 12)

Move-only. The bodies of planPublishBackfill and applyPublishBackfill move
into the new protocol-publish-backfill.ts, and the bodies of listDrafts and
discardDraftInItsScope into the new protocol-drafts.ts (host shape B: an
`engine` getter and protocol-bound closures for getOverlayRepo,
updateManyData, ensureOverlayIndex and deleteMetaItem). Every member keeps
its name, docblock and signature in the class as a stub that delegates.
The module-level declarations the bodies read gain `export` in place;
discriminateDefaultValueShape leaves protocol.ts' import with its last
reader. index.ts names its exports one by one, so the published surface
does not move.

Claude-Session: https://claude.ai/code/session_016SP1spj613tyGCgxoD1An6
Co-authored-by: Claude <noreply@anthropic.com>
…h backfill pair's throw sites (#25467 cut 12)

applyPublishBackfill's three `new Error(` moved with its body into
protocol-publish-backfill.ts, so the scan gains that module's row with its
own count as the floor, as cuts 1, 3, 5, 6, 7 and 10 added theirs.

Claude-Session: https://claude.ai/code/session_016SP1spj613tyGCgxoD1An6
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/metadata-protocol, touching 28 documentable anchor(s).

11 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/api/client-sdk.mdx (via createMany (sdk, the bare tail of client method data.createMany, bound to POST /api/v1/data/:object/createMany), data.createMany (sdk, the route ledger binds it to POST /api/v1/data/:object/createMany, selected by route anchor /:object/createMany), data.updateMany (sdk, the route ledger binds it to POST /api/v1/data/:object/updateMany, selected by route anchor /:object/updateMany), updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/api/data-api.mdx (via createMany (sdk, the bare tail of client method data.createMany, bound to POST /api/v1/data/:object/createMany), updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany), /:object/createMany (route, bridged from symbol updateManyData — its route source's handler names it), /:object/updateMany (route, bridged from symbol updateManyData — its route source's handler names it))
  • content/docs/automation/hook-bodies.mdx (via updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/automation/webhooks.mdx (via updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/concepts/metadata-lifecycle.mdx (via getOverlayRepo (symbol, a field of interface DraftsHost; a field of interface PublishBackfillHost), getOverlayRepo (literal, a string literal in getOverlayRepo; a string literal in listDrafts; a string literal in planPublishBackfill))
  • content/docs/data-modeling/formulas.mdx (via updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/kernel/services-checklist.mdx (via deleteMetaItem (symbol, a field of interface DraftsHost), updateManyData (symbol, a field of interface PublishBackfillHost), deleteMetaItem (literal, a string literal in deleteMetaItem; a string literal in discardDraftInItsScope), updateManyData (literal, a string literal in applyPublishBackfill; a string literal in updateManyData))
  • content/docs/protocol/kernel/error-handling.mdx (via createMany (sdk, the bare tail of client method data.createMany, bound to POST /api/v1/data/:object/createMany), updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/protocol/kernel/http-protocol.mdx (via createMany (sdk, the bare tail of client method data.createMany, bound to POST /api/v1/data/:object/createMany), updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/protocol/knowledge.mdx (via updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/ui/apps.mdx _(via /api/v1/meta/drafts (route, the route ledger binds it to client method meta.listDrafts))

⛔ 5 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/implementation-status.mdx (via createMany (sdk, the bare tail of client method data.createMany, bound to POST /api/v1/data/:object/createMany), updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany), /:object/createMany (route, bridged from symbol updateManyData — its route source's handler names it), /:object/updateMany (route, bridged from symbol updateManyData — its route source's handler names it))
  • content/docs/releases/v16.mdx (via createMany (sdk, the bare tail of client method data.createMany, bound to POST /api/v1/data/:object/createMany), updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/releases/v17/17-0.mdx (via updateManyData (symbol, a field of interface PublishBackfillHost), updateManyData (literal, a string literal in applyPublishBackfill; a string literal in updateManyData), updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/releases/v17/17-2.mdx (via updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))
  • content/docs/releases/v17/17-4.mdx (via updateMany (sdk, the bare tail of client method data.updateMany, bound to POST /api/v1/data/:object/updateMany))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 54 of 206 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 11 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 2a728ba2acf52c13d1918c2afca7b79bf391e1f5 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 4e7f3f8bfa19f7ce4ae17f734eecc857b0a5b419 — the merge of head d6e35b431af981bfba988365f69cfbfdd34d8893 into base 2a728ba2acf52c13d1918c2afca7b79bf391e1f5, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 4e7f3f8bfa19f7ce4ae17f734eecc857b0a5b419 && git checkout 4e7f3f8bfa19f7ce4ae17f734eecc857b0a5b419
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 2a728ba2acf52c13d1918c2afca7b79bf391e1f5 d6e35b431af981bfba988365f69cfbfdd34d8893 && git checkout -B drift-repro 2a728ba2acf52c13d1918c2afca7b79bf391e1f5 && git merge --no-ff d6e35b431af981bfba988365f69cfbfdd34d8893

node scripts/docs-audit/affected-docs.mjs --json 2a728ba2acf52c13d1918c2afca7b79bf391e1f5

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 2a728ba2acf52c13d1918c2afca7b79bf391e1f5 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · domain:server seat 1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC · 2026-10-26T04:55Z

Head d6e35b431a, report 6408535757, claim 6407710285.

item reading
Shape draft, base main, Part of #25467 (no closing keyword), skip-changeset label, Clause-②: no line-initial.
Files (4, +401/−183) protocol.ts, the new protocol-publish-backfill.ts and protocol-drafts.ts (two families that share nothing), and the PRODUCERS row in protocol.bracketed-refusal-opener-absence.test.ts ('protocol-publish-backfill.ts': 3): exactly the claim's surface. No packages/spec/**, no docs/adr/**. Not governed (check-governed-merges --pr 25939), 584 changed lines, inside the order's 900-line split threshold.
Move-only report's AST proof: 1,824 leaf tokens, 0 differ; one-token negative control reads DIFFERENT. Seat's own read on the diff: the four class members keep name, docblock and signature; each is a host literal plus .call — engine as a live getter, protocol-bound closures for getOverlayRepo, ensureOverlayIndex, updateManyData, deleteMetaItem. The stay list (runPublishSideEffects, promoteDraftForPublish, publishPackageDrafts, discardPackageDrafts) is untouched.
Exports module-level helpers the bodies read (isItemOfDisabledPackage, PublishBackfillEntry, PublishBackfillReceipt, PUBLISH_BACKFILL_PAGE_SIZE, publishBackfillRefusal, bundleMemberDiscriminator, clientFacingFailureCode) gain export in place (cut 8/11 precedent); the published export table is unchanged (78 names both ends).
.d.ts raw byte-identical at base and head (325970c1…), before and after the dev's one main merge. Ruling 6348891160 holds.
Gates 59/59 derived exit 0 on the merged tree, --ran 0 NOT-MEASURED; package suite 0 lost / 0 changed / +1 (the new PRODUCERS row; its TypeError control reds). Decision-letter citations 1,847 → 1,846 (listDrafts' [ADR-0131 D6] comment left the anchored file; no anchor entry owed, as cut 8). CI at this act: in progress.
Landing ready + auto-merge through the relay once every check on this head is green or an expected skip. Cut 13 (packaged-base door refusals, ~250–320 lines, per the report) is the next claim.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 26, 2026 05:22
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit efe3598 Oct 26, 2026
52 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-ybjm3h branch October 26, 2026 05:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/l skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants