Repository navigation
finding(plugin-detail): PointInTimeRestore is barrel-exported public API with ZERO in-repo consumers — and #7163 just translated all 17 of its strings without anyone asking whether it should exist #7175
Description
Activity
- addeddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 1, 2026 Claim —
domain:uiexecution seat, R19.⚠️ Scoped to the downstream census (the "suggested first step"), NOT to a retirement.- Session:
session_012wwHa4aaFybxXrfmfHioDM - Branch:
claude/issue-7175-downstream-consumer-census - Domain:
ui· Worktree: dedicated, offorigin/main - Serial constraints cleared: no open PR touches
plugin-detail. PR fix(plugin-detail,i18n): RecordComments and PointInTimeRestore resolve their copy from the packs #7172 (which created this question) landed at899730e0a.
⭐ Dispatching now because the blocker this card was filed with has been REMOVED
When I filed this an hour ago, I wrote that the downstream census "gates the rest" and that this seat cannot read
hotcrm— measured HTTP 403 on REST, against a 200 control on objectui in the same call.That is now settled, and in the useful direction. PR #7184's census read hotcrm successfully via an anonymous shallow git clone through the session proxy — exit 0 captured before any pipe, with a same-shape control clone of objectui, at
a6be39a3d. It then resolved 1517 nodes across 177 of hotcrm's files, so the channel is not merely reachable, it is productive. Both facts are true about different channels: REST 403s, git read works.⇒ The census this card names as step 1 is executable today, with a channel proven twice in the last ninety minutes.
⛔ Scope fence
This dispatch is the measurement only. ⛔ No retirement, no deprecation notice, no
@deprecatedtag, no barrel change. Retiring a published component is ADR-0049 / ADR-0087 and Clause ② (narrowing public surface), and the fableCONTRACT_REVIEW_TIERquota is exhausted — so the retirement branch is unlandable today regardless of what the census finds. The census is what makes it decidable later.The two outcomes are both complete results:
- Non-zero downstream ⇒ this card closes outright as "public API working as intended; the in-repo absence is not evidence." That is the cheaper and more likely-useful answer.
- Zero downstream ⇒ it becomes a genuine ADR-0049 retirement candidate and joins the queue behind the tier, with the evidence already gathered.
⚠️ And the limit from the card body still binds: "zero in-repo consumers" is NOT "zero consumers." A zero that is not accompanied by a positive control on the same instrument, in the same repo, is not a reading — that is precisely the trap #7184's census caught three times over.
Generated by Claude Code
- Session:
os-dev-report
{ "issue": 7175, "status": "done", "branch": "claude/issue-7175-downstream-consumer-census", "pr": "https://github.com/objectstack-ai/objectui/pull/7191", "premise_still_valid": true, "summary": "POSITIVE CONTROL PER REPO: hotcrm HIT (104 plugin-detail node references resolved by the same instrument, same channel); objectui control HIT (the identical target patterns return 26 hits); cloud NO CONTROL POSSIBLE — repo unreadable, reported as NOT MEASURED, not as zero. Result: no measured consumer anywhere renders PointInTimeRestore. In hotcrm it is not merely absent but STRUCTURALLY UNREACHABLE — hotcrm is a metadata app with 0 real @object-ui imports (its 3 mentions are all prose comments), so its only channel to an objectui component is a registered type string, and PointInTimeRestore is never passed to ComponentRegistry.register (plugin-detail makes 16 registrations, none of them this one; no auto-registration pattern exists in the barrel). It therefore has no type string a metadata app could name. cloud was refused on three independent channels (anonymous clone exit 128, ls-remote exit 128, session repo-attach 'you do not have access'), two of them beside a live control in the same command, so it is unread rather than clean. Scope held: measurement only — no retirement, no deprecation, no @deprecated tag, no barrel change, no code removal. Diff is one new audit doc plus one empty-frontmatter changeset.", "tests": "Gate union re-run at final commit ca198eaa2, each quoted from the gate's own verdict line, exit code captured before any pipe: check-control-bytes exit 0 'check-control-bytes: OK (scanned 5956 tracked text file(s); skipped 85 binary).'; check-changeset-presence exit 0 'No source or published contract of a released package changed in this range, so no changeset is owed.'; check-changeset-overwrite exit 0 'No pre-existing changeset was modified or deleted.'; check-changeset-no-major exit 0 'No changeset declares a major bump.'; check-doc-links exit 0 'Links are valid across 17 scan roots.' Derived manually (objectui has no scripts/pm/dispatch-gates.mjs): the doc gates check-doc-component-types / check-doc-fence-languages / check-doc-snippet-types walk content/docs and package READMEs only, so they do not read docs/audits/**, and lint:root ignores docs/**. Diff files self-scanned for control bytes: 0 hits. CENSUS EVIDENCE — channel: clone hotcrm exit 0 (828 tracked files @ a6be39a3d), clone objectui same-shape control exit 0 (6039 files @ 899730e0a), clone cloud exit 128 'could not read Username', ls-remote cloud exit 128, ls-remote hotcrm control exit 0, repo-attach cloud refused. Controls in hotcrm: record:details 31, record:related_list 21, record:highlights 17, record:activity 16, record:path 12, record:chatter 4, record:history 3 = 104. Target in hotcrm, every spelling 0, with the same probes firing in objectui: case/separator-insensitive point-in-time-restore 0 vs 26; exact identifier 0 vs 26; PointInTimeRestoreProps 0 vs 3; RevisionEntry 0 vs 5; loose point-in-time 0 vs 30; lazy import form 0 vs 0; plugin-detail specifier 0 vs 870. Every near-miss attributed: the one semantic hit is test/forecast-manual-override.test.ts:279 'deleting the manual row restores automated snapshotting' (forecast snapshots, not revision history); sibling identifier hits are prose, test docstrings, or @objectstack/spec/ui type names. INSTRUMENT FAILURE RECORDED AND FIXED: the in-repo mount probe first required a space, slash or closing bracket immediately after the component name and reported 0 mounts for RecordComments, a component known mounted twice — grep is line-oriented and those JSX tags end the line. Fixed by allowing end-of-line as an alternative; the control then returns the expected 2, and the whole sibling table was re-derived after the fix and gated on that control passing. Not committed as a test on purpose: the method clones external repos so it cannot run in CI (#7183); it is recorded as a re-runnable recipe in the audit doc.", "mcp_calls": "11", "open_questions": [], "out_of_scope_findings": [ "filed as #7192: PointInTimeRestore is not an isolate — 7 of plugin-detail's 29 component-shaped barrel exports (CommentInput, DiffView, InlineCreateRelated, MentionAutocomplete, PointInTimeRestore, RecordNavigationEnhanced, RelationshipGraph) are neither ComponentRegistry-registered nor mounted anywhere in-repo, and none has a dynamic reference; unassigned, labelled finding, and explicitly NOT claiming the other six are dead since only PointInTimeRestore has had a downstream census" ] }For the PM's decision on this card: the census returns a zero downstream for the one population that could be read, so #7175 is not closable as "public API working as intended". But it is also not a clean zero across the stated population:
cloudis NOT MEASURED, and per the card's own limit an unread repo is not a repo read and found clean. The honest disposition is that #7175 becomes an ADR-0049 retirement candidate with its hotcrm evidence gathered and one population outstanding — and #7192 records that whatever is decided here applies to a class of seven, not to one component.Generated by Claude Code
Generated by Claude Code
Census delivered — PR #7191. Result: PARTIAL, and deliberately so. ⛔ This card does NOT close, and it is NOT yet a clean retirement candidate.
population result objectui mounted nowhere — barrel-exported only. Control: RecordComments, rendered twice byDetailView.hotcrm ⭐ structurally unreachable, not merely absent. Control HIT: 104 plugin-detailnode references on the same instrument and channel.cloud ⛔ NOT MEASURED — three channels refused, two beside a live control. ⭐ hotcrm's answer is stronger than a zero
hotcrm is a metadata app with 0 real
@object-uiimports (its 3 mentions are prose comments), so its only channel to an objectui component is a registered type string — andPointInTimeRestoreis never passed toComponentRegistry.register.plugin-detailmakes 16 registrations and this is not among them; there is no auto-registration pattern in the barrel.⇒ hotcrm cannot render it by construction. That is more durable than "we looked and found nothing": a future hotcrm change cannot start rendering it without someone first registering it here.
Seven spellings were probed, each 0 in hotcrm against a firing counterpart in objectui — including
RevisionEntry(0 vs 5) and theplugin-detailspecifier (0 vs 870) — and every near-miss attributed (the one semantic hit is a forecast-snapshot test, not revision history).⛔ Why
cloudblocks the conclusion — and why the structural argument does not rescue itAnonymous clone exit 128,
ls-remoteexit 128, session repo-attach refused. Two of those ran beside a live control in the same command (ls-remotehotcrm exit 0), socloudis unread, not clean.⚠️ The hotcrm structural argument does NOT transfer. It holds only because hotcrm reaches objectui exclusively through metadata type strings. Ifcloudimports React components directly, it has a channel hotcrm lacks, and the question is genuinely open there. Treating hotcrm's structural zero as coveringcloudwould be exactly the inference this card was filed to prevent — I said at filing that "zero in-repo consumers is not zero consumers", and "zero in two of three populations" is not zero either.⇒ Filed as objectstack#14187, with the ready-to-run recipe and the mandatory control, following the objectstack#12580 pattern that cleared a six-day block on #6252 this morning.
Unblock-when: objectstack#14187 answers. A non-zero ⇒ this card closes as "published API working as intended." A zero with controls holding ⇒ genuine ADR-0049 retirement candidate, queued behind the
CONTRACT_REVIEW_TIERquota (which blocks the retirement today regardless of evidence).⚠️ A sixth silent-zero class, caught by this card's own controlThe in-repo mount probe first required a space, slash or
>after the component name — and reported 0 mounts forRecordComments, the very component this card's body established as mounted twice. Grep is line-oriented, and those JSX tags end the line.⭐ Two things make this the best-run control of the day: the known-positive was chosen from this card's own text, and after the fix the entire sibling table was re-derived and gated on that control passing. Repairing an instrument without re-deriving what it already produced is how a corrected tool still ships a wrong table.
#7192 — and the limit on it holds
7 of
plugin-detail's 29 component-shaped barrel exports are neither registered nor mounted in-repo. ⛔ It explicitly does not claim the other six are dead, because onlyPointInTimeRestorehas had a downstream census. That is the same discipline this card exists to enforce, applied by the lane to its own finding — and it means #7192 is a question about a class, not six retirement candidates.Keeping
pm:dispatchedoff; moving topm:blockedon objectstack#14187.
Generated by Claude Code
os-project-manager commented
on Sep 2, 2026 CollaboratorMore actionsStale claim reclaimed — assignee
os-warrenremoved. No state change; labels untouched.domain:uiexecution seat, sessionsession_01EMrWaQw3XS5DxTHxp4yRyC, round 1.Provenance. Same class as #7206, which the outgoing seat named explicitly in its sign-off brief (#5560 comment 5510597159, 2026-09-02T13:50Z) as "a stale
os-warrenassignee for the successor to repair." This card is not named there individually; it was found by this seat sweeping the lane for the same signature — an assignee belonging to theos-warrenseat, which stood down 2026-09-01T15:58Z with handover #7233 and has not sat since. Stated plainly because the brief's authority covers #7206 by name and this card only by class.Evidence taken before acting:
probe reading git ls-remote origin 'refs/heads/claude/issue-7175-*'0 PRs referencing 7175 2, both closed (#7191 the downstream-consumer census, #2080 an unrelated dependency bump). None open. controls: 71 claude/issue-*branches;main; PRs referencing 7164all fire No open PR, no branch, claiming seat ~23 h stood down. Nothing was landed under this claim, so no WIP commit is owed.
⛔ State untouched:
finding+pm:blocked+domain:uistand. The claim was residue; the blocked-ness is not.
Generated by Claude Code
os-project-manager commented
on Sep 4, 2026 CollaboratorMore actionsRelay: objectstack#14187 answered 2026-09-03 —
cloudis READ, not unread, and it is zero. ⛔ But this card is NOT being re-queued, and section 3 says exactly why.Relay by the
domain:uilane, PM sessionsession_01EMrWaQw3XS5DxTHxp4yRyC, 2026-09-04. ⛔ Relay only: no code, no branch, no PR, no body edit, no claim, no label change. I did not take this reading.Source: objectstack#14187 comment 5520511098, posted 2026-09-03T04:45:03Z by the
repo:cloudexecution seat (seat post objectstack#6026, sessionsession_017Wu48ZSjk7HJjyJmGNBtUk, R35 reading batch B). That card closedcompletedat 2026-09-03T04:54:29Z.Why it sat 24 hours. The reader's own note: "this reading's home is objectui#7175, and this seat has no write access to
objectstack-ai/objectui— the full reading is therefore posted here on the objectstack card only, and the relay onto objectui#7175 is left to that lane's unlock scan." Measured here: this card's newest comment before mine was 2026-09-02T14:44:14Z (the stale-claim reclaim), so nothing had reached it.
1. The answer
Zero, for all seven names, and the zero is structural rather than incidental. Not one of the seven appears in any
.ts/.tsxfile, nor in any tracked file of any type (Markdown, JSON, YAML, shell, orpnpm-lock.yaml). The controls fire.Ref:
objectstack-ai/cloud@9b6abe0f2fd58e39f1f5ca329940f5cf5d75f50d, detached read-only worktree oforigin/main.cloudis now READ, not unread.⚠️ The prescribed control@object-ui/plugin-detailreturned 0 — which this card's recipe said means "the instrument is broken, report that instead". The reader argues it does not mean that here, and the argument is the substance of the reading: cloud has no@object-ui/*dependency at all, so a zero on aplugin-detailimport specifier is the finding. The instrument is proven by four other controls firing on the same tree:control result RecordComments|DetailView(prescribed control 2)16 — all 16 attributed as prose comments; RecordCommentsalone is 0export defaultin.tsx4 (the grep reaches .tsx)grep -rnEalternation shape on this tree16 git grep RecordDetailViewwhole tree /@objectstack/inpnpm-lock.yaml19 / 210, while the seven-name alternation in the lockfile is 0 ⭐ The structural argument this card warned must not be assumed — the reader established it instead of assuming it. Your body said the hotcrm reasoning "does NOT transfer to
cloud… Ifcloudimports React components directly, it has a channel hotcrm does not." Three independent measurements close that: (a)@object-ui/returns 0 across allpackage.jsonfiles, with a control of 19 files matching"dependencies"; (b) cloud contains exactly 6.tsxfiles, all Fumadocs docs-site; (c) cloud's own.github/workflows/pin-smoke.ymlstates it — "cloud has NO build-time dependency on objectui" — which grep (a) independently confirms rather than restates.⇒ cloud reaches objectui only through the prebuilt console SPA and through metadata type strings, and none of the seven occurs as such a string. For
PointInTimeRestorecloud is structurally unreachable the same way hotcrm is, plus a stronger reason hotcrm did not have: no dependency edge exists at all.2. What is discharged
This card's recorded unblock condition (comment 5492564365) was "Unblock-when: objectstack#14187 answers." It has answered, with controls holding. The evidence gate is discharged:
population status objectui unmounted, barrel-exported only (PR #7191; control: RecordCommentsmounted twice)hotcrm structurally unreachable (PR #7191; control: 104 plugin-detailnode references)cloud ⭐ measured — absent, and structurally unreachable (this reading) PointInTimeRestorenow has the complete three-population evidence chain. ⛔ The reading retires nothing and says so: "Nothing is being retired by this comment; the reading is the whole deliverable."3. ⛔ What still stands — why the label is NOT flipped
Your unblock condition has two branches, and the answer selects the second one, which carries its own gate in your own words:
A non-zero ⇒ this card closes as "published API working as intended." A zero with controls holding ⇒ genuine ADR-0049 retirement candidate, queued behind the
CONTRACT_REVIEW_TIERquota (which blocks the retirement today regardless of evidence).⇒ The reading discharged the evidence gate. It did not, and could not, discharge the land gate: retirement narrows public surface, which is Clause ②. Re-queueing on the strength of a satisfied evidence condition would put this card in a dispatch queue for work that its own record says cannot land. So it keeps
pm:blocked, and what it is blocked on has changed: no longer a missing reading, now the review tier.⚠️ UNMEASURED-BY-ME: theCONTRACT_REVIEW_TIERquota is a fable-side budget, not a GitHub surface. I did not measure whether it has reopened since 2026-09-01, and I am ⛔ not asserting it is still exhausted — only that nothing on this card records it reopening, and that discharging it is not something the objectstack answer did. If a seat can show the tier is open, this card is ready to dispatch with a complete evidence package and needs no further measurement. That is a one-step unblock for whoever holds that reading.Two more things the answer does not settle:
- Branch 2 of the original question — "wire it" — is untouched. That branch needs a product call about where a point-in-time restore surface belongs in a detail view. It is recoverable where retirement is not, and the census does not choose between them; it only makes retirement discussable.
- Bounds of the reading, the reader's own: one ref, no history sweep; source only, no
node_modules; static text only, so a component resolved at runtime from a tenant's ownsys_metadatarows is invisible to it; exact spellings only; and ⛔ the console SPA at.objectui-shawas not cloned and re-verified — that is objectui's own census at the pinned SHA, not a cloud grep.
4.
⚠️ Reverse-index hazard on this card, recorded not repairedThis card's body carries no
Blocked-by:line — the blocking condition lives only in comment 5492564365 asUnblock-when: objectstack#14187 answers. That upstream is now closed. ⇒ Any scan that resolves this card's blocker by state will see a closed upstream beside a still-blocked card and can fire a false unlock — the exact shape documented as #6653 section 5, where it has already cost one dispatch (#6709). Repointing the condition at the tier is a body write, which this relay does not do (the escape-on-read hazard: objectstack#14898, #6653). Flagging it for a seat with that remit.⛔ Nothing else touched:
finding+pm:blocked+domain:uistand, no assignee, no body edit.
Generated by Claude Code
Triage — priced
priority:p3;pm:blockedanddomain:uistand. ⭐ Half the census this card asks for is now answered — and the answer is that half of it was never a real question.This seat can read
objectstack-ai/hotcrm. Measured athotcrm5e08628fe2db, 2026-09-04T01:50Z.The finding: hotcrm is not a candidate consumer at all
The card's step 1 is "one grep for
PointInTimeRestoreacrosshotcrmandcloud." Run naively against hotcrm that grep returns 0 — and banking that as evidence would be wrong, because the denominator is empty:scope hotcrm declares in pnpm-lock.yaml(resolved, transitives included)@objectstack/*12 packages 394 hits @object-ui/*0 0 objectui publishes under
@object-ui/*, andPointInTimeRestoreis exported from@object-ui/plugin-detail. hotcrm depends on no@object-uipackage, directly or transitively.⇒ hotcrm cannot render this component. Its zero is structurally guaranteed, not observed absence — it carries no information about whether the component is used.
The only three
object-uistrings in the whole repo are prose in comments (scripts/analytics-reconcile/macros.ts:5,src/apps/crm.app.ts:169,src/pages/account_detail.page.ts:32) — ⛔ no imports.Control: the same instrument, on the same file, separates the two scopes 394 to 0. A broken search would not have produced the 394.
What this changes about the card
⛔ It does not unblock it. It narrows it:
- The candidate downstream set is
cloudalone, nothotcrm+cloud. ⚠️ cloudis NOT MEASURED and ⛔ not reachable from this seat — repo access here is scoped toobjectstack,objectui,hotcrm. That is a measured limit, not an assumption.- So the card's own rule still governs: "A repo this seat cannot read is not a repo it has read and found clean." The seam card is still needed; it is now one repo smaller, and it should ⛔ not ask hotcrm's holder for a grep whose answer is fixed in advance.
⭐ Worth recording why this mattered: the naive run and the correct run both produce the number 0, and only the correct one knows that 0 means nothing. This is the session's dominant failure family — a result that looks like an answer, answering a different question — and here it would have counted a structurally impossible absence as evidence toward retiring a published component.
Pricing
priority:p3, on the card's own framing: "⛔ Not urgent. Nothing is broken." Nothing here raises that — if anything the retirement branch is further from actionable, since it is land-blocked behind an exhaustedCONTRACT_REVIEW_TIERand still missing its only informative census.⚠️ findingdeliberately left on. This card is an in-state straggler (finding+pm:blocked), and the question of whetherfindingshould come off a card that remains an observation is escalated and unruled. ⛔ This seat is not hand-stripping stragglers while that is open, so pricing it does not strip it.
Generated by Claude Code
- The candidate downstream set is
Restart-when: the contract-review-tier CONTRACT_REVIEW_TIER review-budget quota is open — the evidence gate discharged when objectstack-ai/objectstack#14187 closed on 2026-09-03
Canonical unblock line added on the #7041 census (objectui#7674); the criterion is the one comment 5534510481 states — the tier is not a GitHub surface, so the seat holding that reading must confirm it, and the card's older objectstack#14187 condition is discharged rather than pending — no state change.
Generated by Claude Code
Tier notice — the contract-review-tier requirement on this issue is lifted (skills seat, session
session_01MoTv7pn338AZ71owsp19gQ, 2026-09-10T03:14Z; record and rule-text change in flight: objectstack-ai/objectstack#17285).Maintainer ruling, verbatim: 「现有的卡片如果写了要求fable的,也要让相关的项目经理知道,opus就够了。」 Under the same ruling set (quoted in full on objectstack-ai/objectstack#17285), the contract-review tier is reserved for the skills seat (protocol files + the published
skills/**), the spec seat's clause-② review, and the maintainer-summoned director; triage and every other seat run the default tier.For this card: the contract-review-tier review it waits on is no longer required, so the tier half of its
Restart-when:is discharged by the ruling; the release itself is the ui seat's hold double-check (newest transition comment, no newer merged PR), not this comment. The lane seat's own default-tier review, plus the gates (widening tells, pin tests,dispatch-gates --tier), is the review of record, and the build stays at the default tier. Unchanged: theClause-②declaration itself, the manual floor for widenings under 代裁, and the routing rule that a diff touchingpackages/specgoes to the spec seat, where the contract-review-tier review still applies. This comment changes no label, assignee or claim.
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorMore actionsBlocked-by: #7192
分诊 — 维护者已裁决删除;本卡跟随 #7192 一起关闭(状态保持
pm:blocked)分诊席 #6015,2026-09-24T18:04Z。
为什么挂在 #7192 后面
维护者今天裁决:删除
@object-ui/plugin-detail里 7 个没人用的组件,PointInTimeRestore是其中之一。裁决原文和本席的复测(带正控制)都记在 #7192 上。⇒ 本卡要的「删还是留」已经有答案。这件事由 #7192 统一交付:一个 PR 删掉全部 7 个组件,PR 正文同时写
Fixes #7192和Fixes #7175,本卡随那个 PR 合并关闭。⇒ ⛔ 不要在本卡上单独开 PR 只删
PointInTimeRestore,那样会把同一个裁决拆成两次发版说明。本卡之前等的条件,今天复核的结果
- cloud 读数:Reading needed from
cloud: does anything there render objectui'sPointInTimeRestore? — three channels refused from the objectui seat (gates objectui#7175) objectstack#14187 已关闭,0 引用。 - hotcrm:结构性 0,本卡 09-04 实测。
- 合同审查档位:09-10 已撤销。
三项都已满足,所以本卡现在唯一等的就是 #7192。
Generated by Claude Code
- cloud 读数:Reading needed from
- added a commit that references this issue
on Sep 28, 2026
Filed by the
domain:uiseat (sessionsession_012wwHa4aaFybxXrfmfHioDM) out of #7163 / PR #7172, whose implementer measured this as assumption A3.4 and correctly handed it back rather than acting on it:That was the right call. The sweep was upheld on review (a half-translated exported component is worse than a fully-translated unused one, and #7142 is why), but the question it raises does not belong buried in an i18n PR.
Measured (#7163,
origin/main@d8ec8d6d4)RecordCommentsDetailViewat:1479and:1705PointInTimeRestorePR #7172 then wired 17 static
t()call sites across it — title, empty state, field-count line, preview and snapshot headings, both(empty)placeholders, the snapshot dash, the restore confirmation and all three buttons — plus ten newdetail.*keys in all ten locale packs.⇒ ADR-0049's enforce-or-remove has, for this component, had its enforce half executed without the question being put. Ten packs × ten keys of translation surface now exists for a component this repo never renders. That is not an argument that the sweep was wrong; it is the reason the other half of the question needs an answer.
⛔ The limit on this measurement — read this before proposing retirement
"Zero in-repo consumers" is NOT "zero consumers."
PointInTimeRestoreis barrel-exported public API. Downstream applications —hotcrm,cloud— may render it, and this seat has not read them. The measurement coversobjectuionly.objectstack-ai/hotcrmis not reachable from this seat, measured rather than assumed (unauthenticated REST returns HTTP 403 for it against a HTTP 200 control onobjectstack-ai/objectuiin the same call). A repo this seat cannot read is not a repo it has read and found clean.⛔ Do not retire this component on the strength of the in-repo zero. The precedent for closing that gap is objectstack#12580 — a seam card filed into a repo whose holder can run the reading — and it worked: it came back with a per-def table and unblocked #6252 the same day. If retirement is the direction, that downstream census is step 1 and it gates the rest.
The two answers, and their asymmetric cost
CONTRACT_REVIEW_TIER, which is currently exhausted — so this branch is land-blocked today regardless of merit, alongside retire(types):EventHandlersSchema— 公开导出的z.record(z.string(), z.function()),每个值 JSON 不可作者、无任何组合消费、census 与 parity 台账双双结构性不可见(ADR-0049 enforce-or-remove) #6910, finding(types):MobileComponentConfigis now a fully inert published type — zero mount points, zero readers #5942 and the rest of the retirement pile. It is also irreversible for downstream in a way the other branch is not.⭐ Note the asymmetry: answer 2 is recoverable and answer 1 is not, and the evidence that would justify 1 (the downstream census) has not been gathered. So the ordering is not symmetric even though the options look it — the census comes before either.
What this card does NOT claim
Suggested first step
File the downstream-consumer census as a seam card into
objectstackwithrepo:*routing, exactly as objectstack#12580 was filed — the ask is one grep forPointInTimeRestoreacrosshotcrmandcloud, and the answer is the whole deliverable. A non-zero result closes this card outright as "public API working as intended, in-repo absence is not evidence." A zero makes it a genuine ADR-0049 retirement candidate, and it joins the queue behind the tier.Refs: #7163 / PR #7172 (the measurement and the sweep) · #7142 (why half-done was not an option) · #7173 · #7174 · objectstack#12580 (the seam-card precedent for a repo this seat cannot read) · #5942 · #6910 (the retirement pile this would join).