Repository navigation
docs(adr,skills): ADR-0029, ADR-0126 and the published objectstack-data indexing rule still state the overlay uniqueness key as four parts — bundle_member since 5677add93f (family closure for #23006) #23039
Description
Filing gate ①, class (b), family closure. An accepted record, or a shipped skill, states the current overlay uniqueness key, and since 5677add93f (PR #22954, #22877 ruling 6116165299 letter A) that statement is false. The key carries a fifth part, bundle_member. #23006 is the family's first card: it fixes ADR-0005 alone, in PR #23037. This card covers every remaining position, so no single-point cards follow. reach: named producer 5677add93f. Readers: every agent and author who reads these records, plus every customer agent that loads the published objectstack-data skill (North Star 4: skills/** ships).
Filed by domain:skills seat 2 (#19287) · os-justin · session_012dGTuJen61ECNHXYXKChoC, from the #23006 dev report's out_of_scope_findings (comment 6123800633 on #23006), which named the positions. The seat re-read each position on origin/main. ⛔ Not a claim. Lane and grade are triage's.
Positions (read on origin/main at e4a770d6b)
docs/adr/0029-kernel-object-ownership-and-platform-objects-decomposition.md:669: "the overlay-uniqueness index keys on(type, name, organization_id, COALESCE(package_id, ''))(ADR-0005 amendment 2026-08-09, [docs] ADR-0005 的「Index migration」段落描述的是已不存在的机制:addSysMetadataOverlayIndex 已随 #6771 删除,段落还写着 project_id 与 partial 键 #6825)". The argument around it (two packages may each hold an active row for one(type, name)) still holds under the five-part key; only the key's spelling is stale.docs/adr/0126-packaged-metadata-customization-model.md:313: "the uniqueness index keys on(type, name, organization_id, COALESCE(package_id, ''))(ADR-0005 amendment, [docs] ADR-0005 的「Index migration」段落描述的是已不存在的机制:addSysMetadataOverlayIndex 已随 #6771 删除,段落还写着 project_id 与 partial 键 #6825; …)". Same shape.skills/objectstack-data/rules/indexing.md:165, published: "The platform does exactly this for its own overlay uniqueness:metadata-protocol'sensureOverlayIndexruns" a four-partCREATE UNIQUE INDEX … ON sys_metadata (type, name, organization_id, COALESCE(package_id, '')) WHERE state = 'active'. The sentence claims what the platform runs, and the platform no longer runs that. The file is under the per-file skills token ratchet: an edit pays for itself with a deletion, or the example is re-cut so it does not restate the platform's key.
The runtime key on the same tree: OVERLAY_INDEX_COLUMNS = ['type', 'name', 'organization_id', 'package_id', OVERLAY_MEMBER_COLUMN] with OVERLAY_MEMBER_COLUMN = 'bundle_member', and both folded through COALESCE(…, '') (packages/metadata-protocol/src/migrations/overlay-index.ts, overlayIndexKeyParts).
Not in this family (seen, not owed here)
docs/qa/platform-checklist/areas/cli.json:1125recreates "the declared NULL-distinct form" with four columns. The step still seeds the duplicates it needs, so this is unexercised drift, not a wrong statement.packages/metadata-core/src/objects/sys-metadata.object.ts:244-249, a code comment: "it still prevents duplicate ACTIVE overlays" about the declared coarse fallback. After5677add93fthat fallback is NULL-distinct onbundle_memberand holds no canonical row unique (the docs(adr): ADR-0005 still states the overlay uniqueness key as four parts — since 5677add93f (#22877 stage 1) it carries bundle_member (Tier H, the maintainer's hand) #23006 dev's SQLite probe; PR docs(adr): ADR-0005 states the five-part overlay key — bundle_member since 5677add93f (#23006) #23037 Acceptance note 2). No composition was measured to get only the declared tier, so it stays an acceptance note.
Re-check (the enumeration pin)
git grep -n -F "COALESCE(package_id, ''))" origin/main -- docs skills content .claude AGENTS.md
Positive control on the same corpus and instrument: git grep -n -F "idx_sys_metadata_overlay_active" origin/main -- docs skills content .claude AGENTS.md → 7 hits at e4a770d6b (a zero there means the instrument broke, not that the family is closed). At e4a770d6b the pin reads 4 hits: ADR-0005:867 (fixed by PR #23037) plus the three positions above. The card is done when the pin reads 0 hits in present-tense statements; dated historical text that names the key as it was may stay, annotated.
Dedupe
MCP search_issues, closed included:
overlay uniqueness key bundle_member ADR-0029 ADR-0126 four parts indexing skill→ 3 hits: docs(adr): ADR-0005 still states the overlay uniqueness key as four parts — since 5677add93f (#22877 stage 1) it carries bundle_member (Tier H, the maintainer's hand) #23006 (this family's first card, the carrier of ADR-0005 only), plus [#14478 stack 3/6]kernel/: the 14 remaining duration keys carry their unit in the key name — ADR-0087 conversions with readers (runtime-emitted measurements included) #15678 and [metadata] addSysMetadataOverlayIndex 用 ADR-0048 之前的键抢占 idx_sys_metadata_overlay_active——同名索引有两个生产者,先跑的赢 #6771 (other subjects).idx_sys_metadata_overlay_active partial index example skills objectstack-data indexing.md stale key→ 31 hits; none of the first ten covers these positions.
Dedupe words: overlay key bundle_member family; ADR-0029 overlay uniqueness four parts; ADR-0126 uniqueness index key; objectstack-data indexing.md ensureOverlayIndex example.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 12, 2026
Pointer from
domain:skillsseat 2 (#19287) ·session_012dGTuJen61ECNHXYXKChoC· 2026-10-12T12:12Z. ⛔ Not a claim.The contract review of PR #23037 (6123969188, PASS) suggests one optional rider for whoever carries this card: the code comment at
packages/metadata-core/src/objects/sys-metadata.object.ts:244-249. It says the declared coarse index "still prevents duplicate ACTIVE overlays". Once PR #23037 lands, that comment contradicts ADR-0005's Owner 2 sentence, which now says the index holds no canonical row unique, because it is NULL-distinct onbundle_member. The file is not governed and sits indomain:engine's package. Triage decides whether it rides here or stays an acceptance note; this card's family scope as filed is unchanged.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Triage: first grade,
documentation·priority:p3·domain:skills·area:devpath, intopm:queue. The family closure after #23006, sequenced after PR #23037Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-12T13:06Z. ⛔ Not a claim, ⛔ not a dispatch.domain:skillstakes them under the Tier H steps.:669and ADR-0126:313take the five-part key in the shape docs(adr): ADR-0005 still states the overlay uniqueness key as four parts — since 5677add93f (#22877 stage 1) it carries bundle_member (Tier H, the maintainer's hand) #23006's PR uses.skills/objectstack-data/rules/indexing.md:165stops restating the platform's own key: the example is re-cut so it teaches the indexing rule without it. That keeps the token ratchet whole.sys-metadata.object.ts:244-249) is not governed, so it rides the next change to that file, ⛔ not this Tier H PR.domain:skills); rationale: governed text.objectstack-fleet commentedon Oct 12, 2026
Claim: PM loop round 3 (#23039 — the overlay key's fifth part in ADR-0029, ADR-0126 and the published objectstack-data indexing rule; the family closure after #23006) · 2026-10-12T23:15Z
Session:
session_012dGTuJen61ECNHXYXKChoCAccount:
os-justin(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-23039-overlay-key-family-closureWorktree:
objectstack-issue-23039Domain:
domain:skillsSeat:
domain:skills#2File surface:
docs/adr/0029-kernel-object-ownership-and-platform-objects-decomposition.md(the one key statement at:669),docs/adr/0126-packaged-metadata-customization-model.md(the one at:313),skills/objectstack-data/rules/indexing.md(the partial-index example at:155–170, re-cut so it stops restating the platform's own key; net lines ≤ 0, per-file token ratchet whole) (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: ceiling — CONTRACT_REVIEW_TIER;dispatch-gates --tier --repo objectstack-ai/objectstackon the three paths at36b2889cddprinted 「Model tier — MANDATORY: … (derived from the file surface, not recalled)」 for the publishedskills/**; no exit is taken: the skill edit is a re-cut, not a one-line mechanical editClause-②: no
Responsibility:
n/a — not a defect card(class (b): an accepted record and a shipped skill state a key that5677add93fchanged)Thread-read: 6124879304
Ruling-ref: none on this card. Triage's grade
6124879304gives the direction: the two ADRs take the five-part key in the shape PR #23037 used; the skill's example is re-cut so it teaches the indexing rule without restating the platform's key; thesys-metadata.object.tscode-comment rider does not ride this Tier H PR.Resume-from: none
Serial constraints cleared: PR #23037 (#23006), which this family follows, MERGED as
38d98d8d8. No open PR changes these three files (16 open PRs' file lists read). No in-flight claim names them (every openpm:dispatchedclaim's file surface read). The enumeration pin reads 3 hits at36b2889cdd, exactly this card's positions (controlidx_sys_metadata_overlay_active: 7 hits).Delivery shape:
Fixes #23039; Tier H (two ADRs and a published skill), so the PR stays draft until an authorized approval.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
os-dev-report
{ "issue": 23039, "status": "done", "branch": "claude/issue-23039-overlay-key-family-closure", "pr": "http://github.com/objectstack-ai/objectstack/pull/23111", "session": "session_012dGTuJen61ECNHXYXKChoC", "premise_still_valid": true, "summary": "Draft PR #23111 (Tier H: docs/adr/** and skills/**), one commit 34a834a27 on origin/main 846438024, assignee os-justin, Fixes #23039, Clause-②: no. ADR-0029 D9.9 and ADR-0126 section 7.1 now spell the five-part overlay key (type, name, organization_id, COALESCE(package_id, ''), COALESCE(bundle_member, '')) with provenance pointing at ADR-0005's 2026-08-09 (#6825) and 2026-10-12 (#22877 ruling A) amendments; the arguments around both sentences are untouched and neither ADR gains a status-line entry (both cite the key, neither decides it). skills/objectstack-data/rules/indexing.md's partial-index example is re-cut to an application-shaped index (one pending job per dedup key: the coarse { fields: ['source', 'dedup_key'] } declared in metadata, the unique partial form built in a migration, plain-index fallback on a dialect that rejects the predicate) and keeps the pointer that the platform's own overlay uniqueness is built the same way, without naming its columns or ensureOverlayIndex. A patch changeset for @objectstack/skills rides along (sync-catalog copies the whole skills/ tree into dist; files[] = dist), so no skip-changeset and zero label writes. H1 confirmed on origin/main 846438024 (pin 3, control 7) and on 34a834a27 the pin reads 0 with the control at 6 — the one control hit that left is indexing.md:164, the re-cut example's own CREATE UNIQUE INDEX line. H2 confirmed from the tree (OVERLAY_INDEX_COLUMNS has five columns; package_id and bundle_member fold through COALESCE to ''). H3: both sentences are present-tense statements, so they take the key outright rather than a dated note. H4: net 0 lines, -4 tokens. H5: check:skill-docs reads SKILL.md frontmatter only, check:skill-refs reads references/** only, check:skill-examples reads marked ts fences only — none reaches the edited sql fence.", "tests": "Gate derivation on HEAD 34a834a27: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) found 4 paths vs merge base 846438024 and listed 47 commands (the dispatch's 35 grew by the .changeset/** families). Each ran alone in the foreground with stdout and stderr redirected to its own log file and the exit code read from the shell status immediately after (never through a pipe), appended as 'command :: exit N', then reconciled: 'dispatch-gates --ran: 47 derived famil(ies) accounted for — 45 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)', wrapper exit 0. 45 exit 0, every family the dispatch named among them: check-skills-token-ratchet '54 authored bundle file(s) within their ceilings' and the row line 'skills/objectstack-data/rules/indexing.md is 2198 tokens (ceiling 3241; headroom 1043)'; check:pm-skill-id-lint '87 file(s) clean (pattern /#[0-9]{3,}/g)'; check:skill-compatibility '10 SKILL.md file(s) reconciled against 81 workspace packages'; check:skill-identifier-liveness 'Leg 1: 457 citation(s) over 53 published file(s) checked against 127687 implementation word tokens'; check:adr-anchors 'OK (68 anchored file(s), every governing ADR still referenced; … 44264 citation(s) across 5883 file(s) …)'; check-adr-links '730 relative link destination(s) under docs/adr/'; check:nul-bytes 'OK (scanned 11113 text file(s) … no raw ASCII control bytes)'; check:doc-authoring '53 published skill files clean — no internal issue-id references'; check-adr-0087-registration 'adds no declared-breaking changeset (1 non-breaking changeset(s) seen)'; check-empty-changeset '1 declaring changeset(s) added'; check:doc-formula-expressions '15 predicate(s) … judged clean' after building @objectstack/lint... under the shared verify lock (OS_VERIFY_LOCK_SLOT=issue-23039; 'VERDICT command-exit 0 · held the lock 130s · waited 0s'). NOT MEASURED (exit 3, PREREQUISITE NOT MET): check:dual-build-cjs-loads (loads about 80 packages' built entry points) and check:lean-entry-closure (loads @objectstack/objectql's built entry) — the diff touches no package source, so a full build on the shared box would measure nothing the diff can move; CI builds fresh. Extra, outside the derivation: pnpm --filter @objectstack/spec check:skill-examples exits 3 (client dists absent), NOT MEASURED, and its scan surface (ts fences carrying its marker) does not include the edited sql fence. Control-byte self-scan of the four changed files: no hits. Enumeration pin: git grep -n -F \"COALESCE(package_id, ''))\" -- docs skills content .claude AGENTS.md reads 3 on origin/main 846438024 (ADR-0029:669, ADR-0126:313, indexing.md:165) and 0 on 34a834a27; control idx_sys_metadata_overlay_active reads 7 before and 6 after (indexing.md:164 left; ADR-0005 x4 and cli.json x2 remain). No ablation: no code, no gate script, no test was changed. pnpm lint and the repo-wide farm: not run locally, CI's.", "mcp_calls": "0 — no MCP GitHub tool was called. Reads: gh api (single-card REST reads of issue 23039, its comments, and PR 23111 for the read-back). Writes: scripts/pm/fleet-write/dispatch.mjs (route resolved to 'dispatch', session read from the container).", "api_writes": "2 — two relay dispatches, each one POST /repos/objectstack-ai/objectstack/dispatches (HTTP 204) that the fleet-write runner executed as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft forced) + POST /repos/objectstack-ai/objectstack/issues/23111/assignees (os-justin), run 38323409581 success, read-back 10211 bytes sent = 10211 stored; (2) comment → POST /repos/objectstack-ai/objectstack/issues/23039/comments (this report). Plus two git pushes (the empty-branch probe, exit 0, and the one commit), which are not REST writes. Zero label writes: @objectstack/skills publishes, so skip-changeset is not applicable; the PR's labels documentation/size/s/tooling were set by labeler bots, not by this seat, and were left alone.", "open_questions": [], "out_of_scope_findings": [ "carrier: the next PR that touches packages/metadata-core/src/objects/sys-metadata.object.ts (domain:engine) · the code comment at :244-249 ('it still prevents duplicate ACTIVE overlays') still contradicts ADR-0005's Owner 2 sentence after 5677add93f; triage 6124879304 ruled it off this Tier H PR · noted, not filed", "carrier: 承接者:无 · docs/qa/platform-checklist/areas/cli.json:1125 recreates the declared index with four columns; the card lists it outside this family (unexercised drift, the step still seeds what it needs) · noted, not filed", "carrier: 承接者:无 · skills/objectstack-data/rules/indexing.md:53 says unique: 'organization' materializes as (COALESCE(organization_id, '__global__'), …fields); ADR-0131 D1 forbids a nullable tenant column, so that COALESCE may now describe a shape the driver no longer needs — a read-only inference, SqlDriver.syncDeclaredIndexes not measured, so it is not a finding under the three classes · noted, not filed" ], "gates": { "head": "34a834a27", "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) — 47 commands, merge base 846438024", "reconciliation": "dispatch-gates --ran: 47 derived famil(ies) accounted for — 45 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3); exit 0", "exit_0": 45, "not_measured": [ "pnpm check:dual-build-cjs-loads :: exit 3 (PREREQUISITE NOT MET — about 80 package dists absent; diff touches no package source)", "pnpm check:lean-entry-closure :: exit 3 (PREREQUISITE NOT MET — @objectstack/objectql dist absent; diff touches no package source)" ], "named_by_dispatch_all_exit_0": [ "node scripts/check-skills-token-ratchet.mjs", "pnpm check:pm-skill-id-lint", "pnpm check:skill-compatibility", "pnpm check:skill-identifier-liveness", "pnpm check:adr-anchors", "node scripts/check-adr-links.mjs", "pnpm check:nul-bytes" ], "extra_outside_derivation": [ "pnpm --filter @objectstack/spec check:skill-examples :: exit 3 (client dists absent; its scan surface does not include the edited sql fence)" ], "ci": "in_progress — report delivered at local-verification completion; CI convergence is the PM's wait" }, "line_budget": { "docs/adr/0029-kernel-object-ownership-and-platform-objects-decomposition.md": { "before": 820, "after": 821, "delta": "+1 (budget ≤ +2)" }, "docs/adr/0126-packaged-metadata-customization-model.md": { "before": 433, "after": 434, "delta": "+1 (budget ≤ +2)" }, "skills/objectstack-data/rules/indexing.md": { "before_lines": 230, "after_lines": 230, "before_tokens": 2202, "after_tokens": 2198, "ceiling": 3241, "delta": "0 lines, -4 tokens (budget: net ≤ 0 lines, tokens not up)" }, "skills/objectstack-data (whole package, 15 .md files)": { "before_lines": 3718, "after_lines": 3718, "before_tokens": 39143, "after_tokens": 39139 } }, "deviations": [ "The derived gate list is 47 commands, not the 35 the dispatch took on three paths: the .changeset/** path adds its families; all 47 were run or recorded exit 3 — not a deviation in coverage, a note on the count.", "Two derived gates recorded exit 3 (PREREQUISITE NOT MET) and are declared NOT MEASURED rather than built for: both load the full built tree, which this docs-and-skill diff cannot move; this is the declared narrowing.", "The harness attribution reminder asked for a model-named Co-Authored-By trailer; the commit carries the model-free pair AGENTS.md requires (Claude-Session + Co-authored-by: Claude), which the pre-push hook confirmed ('no model identifier in the trailer pair').", "The PR labels documentation/size/s/tooling were applied by labeler bots after creation; this seat wrote no label and did not touch them." ], "files_changed": [ "docs/adr/0029-kernel-object-ownership-and-platform-objects-decomposition.md (+4/-3)", "docs/adr/0126-packaged-metadata-customization-model.md (+3/-2)", "skills/objectstack-data/rules/indexing.md (+9/-9)", ".changeset/23039-indexing-partial-example-recut.md (new, @objectstack/skills patch)" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
REWORK, round 1 (one example) — PR #23111 @
34a834a27· seatdomain:skills#2·session_012dGTuJen61ECNHXYXKChoC· 2026-10-13T00:00ZThe at-tier contract review
6134927768reads PASS on this head. The seat holds the ACCEPT for one item that review raised (its M1), because the item sits in the published skill an AI author reads.skills/objectstack-data/rules/indexing.mdnow declares the same column pair two ways:{ fields: ['source', 'dedup_key'], unique: 'global' }— one holder across the installation;{ fields: ['source', 'dedup_key'] }plus a unique partial indexWHERE status = 'pending'— one pending job per key.Each section is right on its own. Read together, as the PR body invites ("describe one table"), they contradict: the global unique already forbids a second job with that key in any status, so the partial index would add nothing. An author who greps
dedup_keymeets the unique declaration first.Patch round sent to the same dev on the same claim:
{ fields: ['account_id'] }declared in metadata;CREATE UNIQUE INDEX … ON subscription (account_id) WHERE status = 'active'in the migration). The dev picks the final shape after reading the file.origin/main: net ≤ 0 lines, and tokens not abovemain's 2202.(source, dedup_key)follow the new example. The PR body's "describe one table" claim goes.Nothing else in the PR changes: the two ADR sentences, the changeset level and
Clause-②: nostand.The review's M2 is a design call for the maintainer: the ADR-0029 and ADR-0126 sentences are rewritten in place inside dated sections rather than left standing with a dated note. It goes to the maintainer in the final quick-read, after the contract review on the patched head.
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{ "issue": 23039, "status": "done", "round": "rework 1 (scope comment 6134947626; contract review 6134927768 M1)", "branch": "claude/issue-23039-overlay-key-family-closure", "pr": "http://github.com/objectstack-ai/objectstack/pull/23111", "head": "9ef34a302 (9ef34a3029ca1e01c7130dedb189e931464d89aa), one commit on top of 34a834a27; merge base with origin/main unchanged at 846438024", "session": "session_012dGTuJen61ECNHXYXKChoC", "premise_still_valid": true, "summary": "The partial-index example in skills/objectstack-data/rules/indexing.md no longer reuses (source, dedup_key), which line 61 of the same file declares unique: 'global'. It is now one *active* subscription per account: the coarse { fields: ['account_id'] } declared in metadata and CREATE UNIQUE INDEX IF NOT EXISTS idx_subscription_account_active ON subscription (account_id) WHERE status = 'active' built in the migration. account_id and subscription appear in no other example of the file (grep over the whole file: status is used only in plain, non-unique examples and query comments; account appears only as an object name in two plain-index naming examples). The rule sentence (coarse index or none in metadata, partial form as raw SQL in a runtime migration, plain-index fallback on a dialect that rejects it) and the platform pointer without its columns are unchanged, as are both ADR sentences, the changeset level (@objectstack/skills patch) and Clause-②: no. The changeset sentence that named the pair now names the new example. origin/main moved to 21c86444e; git merge-tree --write-tree origin/main HEAD exits 0 (clean), so no merge was made, per the scope. Example before (34a834a27): 'One *pending* job per dedup key, the coarse { fields: ['source', 'dedup_key'] } declared in metadata' + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_job_dedup_pending ON job (source, dedup_key) WHERE status = 'pending''. After (9ef34a302): 'One *active* subscription per account, the coarse { fields: ['account_id'] } declared in metadata' + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_subscription_account_active ON subscription (account_id) WHERE status = 'active''.", "pr_body": "NOT patched by this seat — CONFLICT FLAGGED: the rework instruction says to update the PR body through the relay (issue_patch on 23111); the os-dev standing clause says the dev writes the PR body once at pr_create, never PATCHes it, and names the edit for the seat to write; on a conflict the standing file wins and the conflict is reported, not quietly chosen. The replacement body is ready, byte-exact, with the session-URL footer: /tmp/claude-0/-home-user/6aafb332-0dd0-5aa8-9c6c-3d8461ba74e3/scratchpad/issue-23039/rework1/pr-body.md (10846 bytes; 0 angle brackets, 0 HTML comments, 0 control bytes; the only closing keyword is line 1 'Fixes #23039'), and the relay payload for it is /tmp/claude-0/-home-user/6aafb332-0dd0-5aa8-9c6c-3d8461ba74e3/scratchpad/issue-23039/rework1/actions-issue-patch.json — dry-run exit 0, nothing sent. Send: node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file PATH --json (PATH = the actions file named above), then read the body back (the relay reports sent vs stored bytes). The 16 replacements, all asserted single-match against the round-1 body: HEAD 34a834a27 → 9ef34a302 in the What-changed heading (one commit → two commits), the pin table, the readings table header and the Gates heading; the indexing.md bullet's tokens 2198 → 2200 and its example sentence 'one *pending* job per dedup key, the coarse { fields: ['source', 'dedup_key'] } …' → 'one *active* subscription per account, the coarse { fields: ['account_id'] } …'; the sentence 'The (source, dedup_key) pair is the one the file's unique: 'global' example already uses, so the declared coarse index and the partial form describe one table.' DELETED and replaced by 'The table and column are ones no other example in the file declares with a different uniqueness (rework round 1, the contract review's M1).'; readings rows 2198 → 2200 and 39139 → 39141; the ratchet line 2198/1043 → 2200/1041 and 'four tokens removed' → 'two tokens removed'; the formula gate's lock figure 130 s → 121 s; a new Acceptance note 6 describing the rework (old note 6 becomes 7) with −4 → −2 tokens; in the 维护者速读: 'token 少 4' → 'token 少 2', the example description '每个去重键至多一条 pending 作业' → '每个账户至多一条 active 订阅', and '这一个 commit' → '两个 commit'.", "tests": "Gate derivation on HEAD 9ef34a302: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) — 4 paths vs merge base 846438024, 47 commands, the same set as round 1. The derivation printed a STALE TREE note (branch 8 commits behind origin/main; scripts/check-verify-stand-in-erasure.mjs, scripts/engine-double-contract.baseline.json and scripts/objectql-double-limit.baseline.json changed on main) — none of the three is among the 47 derived families and the scope forbids a merge on a clean merge-tree, so it is recorded here, not acted on; CI runs the PR against main's merge ref. Each command ran alone in the foreground with stdout and stderr redirected to its own log and the exit code read from the shell status right after (never through a pipe), then reconciled: 'dispatch-gates --ran: 47 derived famil(ies) accounted for — 45 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)', wrapper exit 0. 45 exit 0, including every family the rework named: check-skills-token-ratchet '54 authored bundle file(s) within their ceilings' with the row line 'skills/objectstack-data/rules/indexing.md is 2200 tokens (ceiling 3241; headroom 1041)'; check:pm-skill-id-lint '87 file(s) clean (pattern /#[0-9]{3,}/g)'; check:skill-identifier-liveness 'Leg 1: 457 citation(s) over 53 published file(s) checked against 127687 implementation word tokens (0 ledgered exemption(s))'; check:doc-authoring '53 published skill files clean — no internal issue-id references' and 'sibling-package prose ids hold the baseline'; check:nul-bytes 'OK (scanned 11113 text file(s) … no raw ASCII control bytes)'; the changeset families — check-adr-0087-registration 'adds no declared-breaking changeset (1 non-breaking changeset(s) seen)', check-changeset-no-major (+ self-test), check-empty-changeset 'No changeset from the merge base modified or deleted by this diff' (+ self-test), check:changeset-gate-self-tests, check:objectui-changeset, check:pm-changeset-deadline-census — all exit 0; check:doc-formula-expressions exit 0 after rebuilding @objectstack/lint... under the shared verify lock (OS_VERIFY_LOCK_SLOT=issue-23039; 'VERDICT command-exit 0 · held the lock 121s · waited 0s'); plus check:adr-anchors, check-adr-links, check:skill-compatibility, check:skill-frame-sync, check:published-files and the rest. NOT MEASURED (exit 3, PREREQUISITE NOT MET), as in round 1: check:dual-build-cjs-loads and check:lean-entry-closure — both load the full built tree; the diff touches no package source. Readings on 9ef34a302 vs origin/main 21c86444e (indexing.md identical on 21c86444e and 846438024): lines 230 → 230 (net 0); bytes 8805 → 8798; tokens ceil(bytes/4) 2202 → 2200 (round 1 was 2198; the new example costs 8 bytes more and stays under main's 2202); package skills/objectstack-data lines 3718 → 3718, tokens (sum of per-file counts over 15 .md files) 39143 → 39141. Enumeration pin on the head: git grep -n -F \"COALESCE(package_id, ''))\" -- docs skills content .claude AGENTS.md reads 0; control idx_sys_metadata_overlay_active reads 6 (unchanged from round 1). Control-byte self-scan of the two edited files: no hits. Leftover 'dedup', 'job', 'source' in the partial-index section: none. No ablation: no code, gate script or test changed. Local tree clean; local head = remote head = 9ef34a302.", "mcp_calls": "0 — no MCP GitHub tool was called. Reads: gh api (comments 6134947626 and 6134927768, and comment read-backs). Writes: scripts/pm/fleet-write/dispatch.mjs only.", "api_writes": "1 — one relay dispatch, POST /repos/objectstack-ai/objectstack/dispatches (HTTP 204), executed by the fleet-write runner as objectstack-fleet[bot]: comment → POST /repos/objectstack-ai/objectstack/issues/23039/comments (this rework report). Plus one git push (9ef34a302, no force), not a REST write. Zero label writes. The PR body was NOT patched (see pr_body: conflict flagged, payload prepared and dry-run for the seat); an issue_patch dry-run sends nothing.", "open_questions": [], "out_of_scope_findings": [], "gates": { "head": "9ef34a302", "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) — 47 commands, merge base 846438024; STALE TREE note recorded (three changed gate files on main, none among the 47)", "reconciliation": "dispatch-gates --ran: 47 derived famil(ies) accounted for — 45 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3); exit 0", "exit_0": 45, "not_measured": [ "pnpm check:dual-build-cjs-loads :: exit 3 (PREREQUISITE NOT MET — package dists absent; diff touches no package source)", "pnpm check:lean-entry-closure :: exit 3 (PREREQUISITE NOT MET — @objectstack/objectql dist absent; diff touches no package source)" ], "named_by_rework_all_exit_0": [ "node scripts/check-skills-token-ratchet.mjs (row: indexing.md 2200 / 3241)", "pnpm check:pm-skill-id-lint", "pnpm check:skill-identifier-liveness", "pnpm check:doc-authoring", "pnpm check:nul-bytes", "node scripts/check-adr-0087-registration.mjs --base origin/main", "node scripts/check-changeset-no-major.mjs --base origin/main", "node scripts/check-empty-changeset.mjs --base origin/main", "pnpm check:changeset-gate-self-tests", "pnpm check:objectui-changeset", "pnpm check:pm-changeset-deadline-census" ], "ci": "in_progress — report delivered at local-verification completion; CI convergence on 9ef34a302 is the PM's wait" }, "line_budget": { "skills/objectstack-data/rules/indexing.md": { "main_lines": 230, "head_lines": 230, "main_tokens": 2202, "round1_tokens": 2198, "head_tokens": 2200, "ceiling": 3241, "delta_vs_main": "0 lines, -2 tokens (budget: net ≤ 0 lines, tokens not above 2202)" }, "skills/objectstack-data (whole package, 15 .md files)": { "main_lines": 3718, "head_lines": 3718, "main_tokens": 39143, "head_tokens": 39141 }, ".changeset/23039-indexing-partial-example-recut.md": { "delta": "+1/-1, one sentence; level and Clause-②: no unchanged" }, "docs/adr/0029-kernel-object-ownership-and-platform-objects-decomposition.md": { "before": 820, "after": 821, "delta": "unchanged this round (+1 from round 1)" }, "docs/adr/0126-packaged-metadata-customization-model.md": { "before": 433, "after": 434, "delta": "unchanged this round (+1 from round 1)" } }, "deviations": [ "PR body not patched by this seat: the rework instruction asked for an issue_patch through the relay; the os-dev standing clause forbids a dev PATCH of the PR body and routes the edit to the seat. The standing file wins on a conflict and the conflict is reported here rather than quietly chosen either way. The replacement body and its relay payload are prepared, scanned and dry-run (see pr_body); one dispatch by the seat lands it.", "Derivation STALE TREE note: the branch is 8 commits behind origin/main and three gate files changed there; none is among the 47 derived families, the merge-tree is clean, and the scope says no merge unless the branch conflicts — so no merge, recorded only.", "Two derived gates recorded exit 3 (PREREQUISITE NOT MET) and are declared NOT MEASURED rather than built for, as in round 1: both load the full built tree, which this docs-and-skill diff cannot move." ], "files_changed": [ "skills/objectstack-data/rules/indexing.md (+5/-5 this round; +9/-9 vs origin/main)", ".changeset/23039-indexing-partial-example-recut.md (+1/-1 this round; new vs origin/main, @objectstack/skills patch)" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
ACCEPT — PR #23111 @
9ef34a302· seatdomain:skills#2·session_012dGTuJen61ECNHXYXKChoC· 2026-10-13T00:28ZChecked against GitHub and
origin/main, not the reports (6134762108, rework6135127432):main, first lineFixes #23039,Clause-②: no, assigneeos-justin. One@objectstack/skillspatch changeset (the package shipsskills/**throughdist, soskip-changesetwould be wrong). Four files: ADR-0029 (+1 line), ADR-0126 (+1 line),skills/objectstack-data/rules/indexing.md(net 0 lines, 2202 → 2200 tokens), the changeset.ensureOverlayIndex. It teaches the same rule with an application example: one active subscription per account, the coarse{ fields: ['account_id'] }declared in metadata, and the unique partial form built in a migration, with a plain-index fallback.account_idandsubscriptionappear in no other example of the file.6134947626): the round-1 example reused(source, dedup_key), which line 61 of the same file declaresunique: 'global'. Read together the two contradicted, so the example was re-cut. The delta is one example and the sentences that name it. The PR body was patched by this seat (the os-dev rule: a dev writes the body once), read back 10846 bytes sent = stored.pr-automationjobs, all green, two of which skip on a re-run).CONTRACT_REVIEW_TIERon this head, record6135262550(previous head6134927768, PASS, whose M1 the rework answered). The one design call left for the maintainer (M2) rides with the approval and is restated in the final quick-read on the PR.docs/adr/**,skills/**). The PR stays draft;needs-user-decisiongoes on the PR; review is requested fromos-zhuangandhotlong. After an authorized APPROVED review this seat lands it.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Landed — PR #23111 MERGED as
e9e10fdab(merged byos-zhuangthrough the queue: APPROVED review 5497616973 on9ef34a302, flipped ready, auto-merge, enqueued) · seatdomain:skills#2·session_012dGTuJen61ECNHXYXKChoC· 2026-10-13T01:21Zorigin/mainafter the merge: ADR-0029:669 and ADR-0126:313 carryCOALESCE(bundle_member, ''), andskills/objectstack-data/rules/indexing.md:164carries the re-cut exampleidx_subscription_account_active.git grep -n -F "COALESCE(package_id, ''))" origin/main -- docs skills content .claude AGENTS.md) reads 0 hits, so the family is closed: ADR-0005 via PR docs(adr): ADR-0005 states the five-part overlay key — bundle_member since 5677add93f (#23006) #23037, the three remaining positions via this PR.Fixes;pm:dispatchedis stripped in this act. The noted-not-filed rider (sys-metadata.object.ts:244-249) rides the next change to that file, per triage6124879304.Generated by Claude Code