docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED - #7191

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census
Sep 1, 2026
Merged

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED#7191
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census

Conversation

@os-warren

@os-warrenos-warren commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Part of #7175 — this is the census only. ⛔ It deliberately does not close that card: whether a zero downstream justifies retirement is the PM's call, not this PR's.

Positive control, per repo — read this line first

Every number below is uninterpretable without it:

RepoInstrument's positive controlResult
hotcrm @ a6be39a3dHIT — 104 plugin-detail node references resolvedcontrol holds
objectui @ 899730e0aHIT — same target patterns return 26 hitscontrol holds
cloudnone — repo unreadable⚠️NOT MEASURED

Result

No measured consumer anywhere renders PointInTimeRestore.hotcrm is a measured zero with controls that hold. cloud could not be read at all and is reported as its own category — ⚠️NOT MEASURED is not zero and not green.

In hotcrm the component is not merely absent, it is structurally unreachable:

  • hotcrm is a metadata app with 0 real @object-ui imports (the 3 mentions are all prose comments), so its only channel to an objectui component is a registered type string.
  • PointInTimeRestore is never passed to ComponentRegistry.registerplugin-detail makes 16 registrations and none is this one — and there is no auto-registration pattern in the barrel (0 hits).
  • ⇒ it has no type string, so a metadata app cannot name it. The zero is what the architecture requires, not a lucky grep.

Spellings covered (all zero in hotcrm, all firing in objectui)

Spellinghotcrmobjectui control
point[-_ ]?in[-_ ]?time[-_ ]?restore, case-insensitive (covers kebab, snake, camel, Pascal)026
PointInTimeRestore exact identifier026
PointInTimeRestoreProps03
RevisionEntry co-exported type05
loose point[-_ ]?in[-_ ]?time030
lazy import(...) form00
plugin-detail specifier0870

Every near-miss attributed. The one semantic hit — test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting" — is forecast snapshots, not revision history. Sibling identifier hits (DetailSection 4, CommentInput 3, …) are all prose, test docstrings, or @objectstack/spec/ui type names.

Channel evidence — exit codes captured BEFORE any pipe

CommandExitReading
clone hotcrm0828 tracked files @ a6be39a3d
clone objectui (same-shape control)06039 tracked files @ 899730e0a
clone cloud128could not read Username
ls-remotecloud128same wall, second shape
ls-remotehotcrm (control)0refs listed
session repo-attach clouderroryou don't have access to objectstack-ai/cloud

cloud refused on three independent channels, two beside a live control.

Bonus (free, from the same instrument)

PointInTimeRestore is one of seven of plugin-detail's 29 component-shaped barrel exports that are neither registered nor mounted anywhere in this repo: CommentInput, DiffView, InlineCreateRelated, MentionAutocomplete, PointInTimeRestore, RecordNavigationEnhanced, RelationshipGraph. None has a dynamic reference either. ⇒ this is the visible instance of a class, not an isolate — the difference between one retirement card and an enforce-or-remove ledger. ⛔ Nothing here acts on the other six.

⚠️ Unmounted is not automatically dead: RecordComments is also unregistered yet DetailView mounts it at :1479 and :1705. The class above is specifically both doors closed.

⚠️ An instrument failure, recorded

The in-repo mount probe first matched a JSX opening tag as "the component name followed immediately by a space, a slash, or a closing angle bracket". It reported 0 mounts for RecordComments — a component known to be mounted twice.

Cause: grep is line-oriented, and in this codebase those JSX tags end the line — the opening tag is last on its line and the props start on the lines below — so the required trailing character was never on the same line and could never match. Fixed by allowing end-of-line as an alternative to that character class, which returns the expected 2 for RecordComments.

The whole sibling table was re-derived after the fix and gated on that control passing. A probe that cannot see its own known-positive is not measuring.

(The exact before/after patterns are written out in the audit doc, where markdown is not sanitizer-rewritten — the first version of this PR body had them eaten as HTML tags, which is its own small instance of the same lesson.)

Not committed as a test — on purpose

The method clones external repos, so it cannot run in CI, and a committed test that cannot run renders as coverage while measuring nothing (#7183). It is recorded as a re-runnable recipe in the audit doc instead.

Gates — union re-run at final commit ca198eaa2

  • 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."

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/**; lint:root ignores docs/**.

Scope

⛔ No retirement, no deprecation, no @deprecated tag, no barrel change, no code removal. Diff is one new audit doc plus one empty-frontmatter changeset. Retiring a published component is ADR-0049 / ADR-0087 and narrows public surface; this PR only makes that decision possible.

Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM

…nTimeRestore
objectui#7163 measured zero IN-REPO consumers for the barrel-exported
`PointInTimeRestore`. That is not the same claim as zero consumers, because the
component is published public API, so this records the downstream reading instead.
hotcrm, measured at a6be39a3d by anonymous shallow clone: zero on every spelling
(case/separator-insensitive, named import, type import, lazy import, kebab and
snake type strings), against a positive control of 104 plugin-detail node
references resolved in that same repo on that same instrument. It is also
structurally unreachable there -- hotcrm has zero @object-ui imports and
PointInTimeRestore is never registered with ComponentRegistry, so a metadata app
has no type string to name it with.
cloud is reported as NOT MEASURED: refused on three independent channels, two of
them beside a live control in the same command.
Bonus, at no marginal cost: PointInTimeRestore is one of seven plugin-detail
barrel exports that are neither registered nor mounted anywhere in this repo, so
it is the visible instance of a class rather than an isolate.
No source, behaviour, or public-surface change. Retires nothing.
@os-warrenClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM), reviewer of record

Verdict: ACCEPT. Arming on green. This census answers its question better than the question was asked.

⭐ The structural finding beats the grep, and that is the result

I dispatched this expecting "search two repos, report a zero, control it properly." What came back is stronger than a zero:

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

⇒ hotcrm cannot render it by construction, not by happenstance. plugin-detail makes 16 registrations and this is not among them, and there is no auto-registration pattern in the barrel — so there is no type string a metadata app could name. That converts "we looked and found nothing" into "there is no channel through which it could be found", which is a different and much more durable claim. A future hotcrm change cannot start rendering it without first registering it here.

⭐ A SIXTH silent-zero class — and the control that caught it was this card's own known-positive

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.

This is the best-chosen control I have reviewed today. #7175's body established RecordComments as the live control precisely because DetailView renders it at :1479 and :1705. Running the probe against that known-positive returned 0 — and the whole sibling table would have been wrong in the direction that makes everything look dead.

Fixed by allowing end-of-line as an alternative, control then returns the expected 2, and — the part that matters — the whole sibling table was re-derived after the fix and gated on that control passing. Repairing an instrument and not re-deriving what it already produced is how a corrected tool still ships a wrong table.

⚠️ Note the class: a <Component /> JSX tag that ends the line defeats any probe demanding a trailing delimiter. That is not exotic — it is the common formatting. Added to the seat's list beside the barrel-vs-directory probe and the correction-quoted-phrase marker.

cloud is NOT MEASURED, and the refusal was measured three ways

Anonymous clone exit 128 (could not read Username), ls-remote exit 128, session repo-attach refused — two of them beside a live control in the same command (ls-remote hotcrm exit 0). So cloud is unread, not clean, and it is reported as its own category rather than folded into the zero.

⭐ That distinction is the whole reason this card exists. #7175 was filed because an in-repo zero was correctly refused as proof of absence; reporting cloud as a zero here would have repeated that error one level out.

The controls are per-repo, as required

  • hotcrm positive control HIT: 104 plugin-detail node references resolved by the same instrument on the same channel (record:details 31, record:related_list 21, record:highlights 17, record:activity 16, record:path 12, record:chatter 4, record:history 3).
  • objectui control HIT: the identical target patterns return 26.
  • Seven spellings covered, each 0 in hotcrm against a firing probe in objectui: case/separator-insensitive, exact identifier, PointInTimeRestoreProps (0 vs 3), RevisionEntry (0 vs 5), loose point-in-time (0 vs 30), the lazy import() form, and the plugin-detail specifier (0 vs 870). A single-spelling zero tests one hypothesis; seven with live counterparts is a reading.
  • Every near-miss attributed — the one semantic hit is test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting", which is forecast snapshots, not revision history.

Scope and shipping discipline

Measurement only — no retirement, no deprecation, no @deprecated, no barrel change. Diff is one audit doc plus an empty-frontmatter changeset, and check-changeset-presence confirms it in its own words: "No source or published contract of a released package changed in this range, so no changeset is owed."

Not committed as a test, deliberately: the method clones external repos, so it cannot run in CI — exactly #7183's shape, where a committed test would render as coverage while measuring nothing. Recorded as a re-runnable recipe in the audit doc instead. Correct call, and the second time today a lane has chosen a recipe over a void assertion.

The doc-gate reasoning was derived rather than assumed (objectui has no scripts/pm/dispatch-gates.mjs): the doc gates walk content/docs and package READMEs only, so they do not read docs/audits/**, and lint:root ignores docs/**. Stating why a gate does not apply beats silently not running it.

#7192 is the right filing, with the right epistemic limit

7 of plugin-detail's 29 component-shaped barrel exports are neither registered nor mounted in-repo, none with a dynamic reference. ⭐ And it explicitly declines to claim the other six are dead, since only PointInTimeRestore has had a downstream census. That is exactly the discipline #7175 was filed to enforce, applied by the same lane to its own new finding — the bonus observation I asked for, delivered with the caution that makes it usable.


Nothing to change.


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-warren@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED - #7191

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census
Sep 1, 2026
Merged

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED#7191
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census

Conversation

@os-warren

@os-warrenos-warren commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Part of #7175 — this is the census only. ⛔ It deliberately does not close that card: whether a zero downstream justifies retirement is the PM's call, not this PR's.

Positive control, per repo — read this line first

Every number below is uninterpretable without it:

RepoInstrument's positive controlResult
hotcrm @ a6be39a3dHIT — 104 plugin-detail node references resolvedcontrol holds
objectui @ 899730e0aHIT — same target patterns return 26 hitscontrol holds
cloudnone — repo unreadable⚠️NOT MEASURED

Result

No measured consumer anywhere renders PointInTimeRestore.hotcrm is a measured zero with controls that hold. cloud could not be read at all and is reported as its own category — ⚠️NOT MEASURED is not zero and not green.

In hotcrm the component is not merely absent, it is structurally unreachable:

  • hotcrm is a metadata app with 0 real @object-ui imports (the 3 mentions are all prose comments), so its only channel to an objectui component is a registered type string.
  • PointInTimeRestore is never passed to ComponentRegistry.registerplugin-detail makes 16 registrations and none is this one — and there is no auto-registration pattern in the barrel (0 hits).
  • ⇒ it has no type string, so a metadata app cannot name it. The zero is what the architecture requires, not a lucky grep.

Spellings covered (all zero in hotcrm, all firing in objectui)

Spellinghotcrmobjectui control
point[-_ ]?in[-_ ]?time[-_ ]?restore, case-insensitive (covers kebab, snake, camel, Pascal)026
PointInTimeRestore exact identifier026
PointInTimeRestoreProps03
RevisionEntry co-exported type05
loose point[-_ ]?in[-_ ]?time030
lazy import(...) form00
plugin-detail specifier0870

Every near-miss attributed. The one semantic hit — test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting" — is forecast snapshots, not revision history. Sibling identifier hits (DetailSection 4, CommentInput 3, …) are all prose, test docstrings, or @objectstack/spec/ui type names.

Channel evidence — exit codes captured BEFORE any pipe

CommandExitReading
clone hotcrm0828 tracked files @ a6be39a3d
clone objectui (same-shape control)06039 tracked files @ 899730e0a
clone cloud128could not read Username
ls-remotecloud128same wall, second shape
ls-remotehotcrm (control)0refs listed
session repo-attach clouderroryou don't have access to objectstack-ai/cloud

cloud refused on three independent channels, two beside a live control.

Bonus (free, from the same instrument)

PointInTimeRestore is one of seven of plugin-detail's 29 component-shaped barrel exports that are neither registered nor mounted anywhere in this repo: CommentInput, DiffView, InlineCreateRelated, MentionAutocomplete, PointInTimeRestore, RecordNavigationEnhanced, RelationshipGraph. None has a dynamic reference either. ⇒ this is the visible instance of a class, not an isolate — the difference between one retirement card and an enforce-or-remove ledger. ⛔ Nothing here acts on the other six.

⚠️ Unmounted is not automatically dead: RecordComments is also unregistered yet DetailView mounts it at :1479 and :1705. The class above is specifically both doors closed.

⚠️ An instrument failure, recorded

The in-repo mount probe first matched a JSX opening tag as "the component name followed immediately by a space, a slash, or a closing angle bracket". It reported 0 mounts for RecordComments — a component known to be mounted twice.

Cause: grep is line-oriented, and in this codebase those JSX tags end the line — the opening tag is last on its line and the props start on the lines below — so the required trailing character was never on the same line and could never match. Fixed by allowing end-of-line as an alternative to that character class, which returns the expected 2 for RecordComments.

The whole sibling table was re-derived after the fix and gated on that control passing. A probe that cannot see its own known-positive is not measuring.

(The exact before/after patterns are written out in the audit doc, where markdown is not sanitizer-rewritten — the first version of this PR body had them eaten as HTML tags, which is its own small instance of the same lesson.)

Not committed as a test — on purpose

The method clones external repos, so it cannot run in CI, and a committed test that cannot run renders as coverage while measuring nothing (#7183). It is recorded as a re-runnable recipe in the audit doc instead.

Gates — union re-run at final commit ca198eaa2

  • 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."

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/**; lint:root ignores docs/**.

Scope

⛔ No retirement, no deprecation, no @deprecated tag, no barrel change, no code removal. Diff is one new audit doc plus one empty-frontmatter changeset. Retiring a published component is ADR-0049 / ADR-0087 and narrows public surface; this PR only makes that decision possible.

Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM

…nTimeRestore
objectui#7163 measured zero IN-REPO consumers for the barrel-exported
`PointInTimeRestore`. That is not the same claim as zero consumers, because the
component is published public API, so this records the downstream reading instead.
hotcrm, measured at a6be39a3d by anonymous shallow clone: zero on every spelling
(case/separator-insensitive, named import, type import, lazy import, kebab and
snake type strings), against a positive control of 104 plugin-detail node
references resolved in that same repo on that same instrument. It is also
structurally unreachable there -- hotcrm has zero @object-ui imports and
PointInTimeRestore is never registered with ComponentRegistry, so a metadata app
has no type string to name it with.
cloud is reported as NOT MEASURED: refused on three independent channels, two of
them beside a live control in the same command.
Bonus, at no marginal cost: PointInTimeRestore is one of seven plugin-detail
barrel exports that are neither registered nor mounted anywhere in this repo, so
it is the visible instance of a class rather than an isolate.
No source, behaviour, or public-surface change. Retires nothing.
@os-warrenClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM), reviewer of record

Verdict: ACCEPT. Arming on green. This census answers its question better than the question was asked.

⭐ The structural finding beats the grep, and that is the result

I dispatched this expecting "search two repos, report a zero, control it properly." What came back is stronger than a zero:

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

⇒ hotcrm cannot render it by construction, not by happenstance. plugin-detail makes 16 registrations and this is not among them, and there is no auto-registration pattern in the barrel — so there is no type string a metadata app could name. That converts "we looked and found nothing" into "there is no channel through which it could be found", which is a different and much more durable claim. A future hotcrm change cannot start rendering it without first registering it here.

⭐ A SIXTH silent-zero class — and the control that caught it was this card's own known-positive

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.

This is the best-chosen control I have reviewed today. #7175's body established RecordComments as the live control precisely because DetailView renders it at :1479 and :1705. Running the probe against that known-positive returned 0 — and the whole sibling table would have been wrong in the direction that makes everything look dead.

Fixed by allowing end-of-line as an alternative, control then returns the expected 2, and — the part that matters — the whole sibling table was re-derived after the fix and gated on that control passing. Repairing an instrument and not re-deriving what it already produced is how a corrected tool still ships a wrong table.

⚠️ Note the class: a <Component /> JSX tag that ends the line defeats any probe demanding a trailing delimiter. That is not exotic — it is the common formatting. Added to the seat's list beside the barrel-vs-directory probe and the correction-quoted-phrase marker.

cloud is NOT MEASURED, and the refusal was measured three ways

Anonymous clone exit 128 (could not read Username), ls-remote exit 128, session repo-attach refused — two of them beside a live control in the same command (ls-remote hotcrm exit 0). So cloud is unread, not clean, and it is reported as its own category rather than folded into the zero.

⭐ That distinction is the whole reason this card exists. #7175 was filed because an in-repo zero was correctly refused as proof of absence; reporting cloud as a zero here would have repeated that error one level out.

The controls are per-repo, as required

  • hotcrm positive control HIT: 104 plugin-detail node references resolved by the same instrument on the same channel (record:details 31, record:related_list 21, record:highlights 17, record:activity 16, record:path 12, record:chatter 4, record:history 3).
  • objectui control HIT: the identical target patterns return 26.
  • Seven spellings covered, each 0 in hotcrm against a firing probe in objectui: case/separator-insensitive, exact identifier, PointInTimeRestoreProps (0 vs 3), RevisionEntry (0 vs 5), loose point-in-time (0 vs 30), the lazy import() form, and the plugin-detail specifier (0 vs 870). A single-spelling zero tests one hypothesis; seven with live counterparts is a reading.
  • Every near-miss attributed — the one semantic hit is test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting", which is forecast snapshots, not revision history.

Scope and shipping discipline

Measurement only — no retirement, no deprecation, no @deprecated, no barrel change. Diff is one audit doc plus an empty-frontmatter changeset, and check-changeset-presence confirms it in its own words: "No source or published contract of a released package changed in this range, so no changeset is owed."

Not committed as a test, deliberately: the method clones external repos, so it cannot run in CI — exactly #7183's shape, where a committed test would render as coverage while measuring nothing. Recorded as a re-runnable recipe in the audit doc instead. Correct call, and the second time today a lane has chosen a recipe over a void assertion.

The doc-gate reasoning was derived rather than assumed (objectui has no scripts/pm/dispatch-gates.mjs): the doc gates walk content/docs and package READMEs only, so they do not read docs/audits/**, and lint:root ignores docs/**. Stating why a gate does not apply beats silently not running it.

#7192 is the right filing, with the right epistemic limit

7 of plugin-detail's 29 component-shaped barrel exports are neither registered nor mounted in-repo, none with a dynamic reference. ⭐ And it explicitly declines to claim the other six are dead, since only PointInTimeRestore has had a downstream census. That is exactly the discipline #7175 was filed to enforce, applied by the same lane to its own new finding — the bonus observation I asked for, delivered with the caution that makes it usable.


Nothing to change.


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-warren@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED - #7191

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census
Sep 1, 2026
Merged

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED#7191
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census

Conversation

@os-warren

@os-warrenos-warren commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Part of #7175 — this is the census only. ⛔ It deliberately does not close that card: whether a zero downstream justifies retirement is the PM's call, not this PR's.

Positive control, per repo — read this line first

Every number below is uninterpretable without it:

RepoInstrument's positive controlResult
hotcrm @ a6be39a3dHIT — 104 plugin-detail node references resolvedcontrol holds
objectui @ 899730e0aHIT — same target patterns return 26 hitscontrol holds
cloudnone — repo unreadable⚠️NOT MEASURED

Result

No measured consumer anywhere renders PointInTimeRestore.hotcrm is a measured zero with controls that hold. cloud could not be read at all and is reported as its own category — ⚠️NOT MEASURED is not zero and not green.

In hotcrm the component is not merely absent, it is structurally unreachable:

  • hotcrm is a metadata app with 0 real @object-ui imports (the 3 mentions are all prose comments), so its only channel to an objectui component is a registered type string.
  • PointInTimeRestore is never passed to ComponentRegistry.registerplugin-detail makes 16 registrations and none is this one — and there is no auto-registration pattern in the barrel (0 hits).
  • ⇒ it has no type string, so a metadata app cannot name it. The zero is what the architecture requires, not a lucky grep.

Spellings covered (all zero in hotcrm, all firing in objectui)

Spellinghotcrmobjectui control
point[-_ ]?in[-_ ]?time[-_ ]?restore, case-insensitive (covers kebab, snake, camel, Pascal)026
PointInTimeRestore exact identifier026
PointInTimeRestoreProps03
RevisionEntry co-exported type05
loose point[-_ ]?in[-_ ]?time030
lazy import(...) form00
plugin-detail specifier0870

Every near-miss attributed. The one semantic hit — test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting" — is forecast snapshots, not revision history. Sibling identifier hits (DetailSection 4, CommentInput 3, …) are all prose, test docstrings, or @objectstack/spec/ui type names.

Channel evidence — exit codes captured BEFORE any pipe

CommandExitReading
clone hotcrm0828 tracked files @ a6be39a3d
clone objectui (same-shape control)06039 tracked files @ 899730e0a
clone cloud128could not read Username
ls-remotecloud128same wall, second shape
ls-remotehotcrm (control)0refs listed
session repo-attach clouderroryou don't have access to objectstack-ai/cloud

cloud refused on three independent channels, two beside a live control.

Bonus (free, from the same instrument)

PointInTimeRestore is one of seven of plugin-detail's 29 component-shaped barrel exports that are neither registered nor mounted anywhere in this repo: CommentInput, DiffView, InlineCreateRelated, MentionAutocomplete, PointInTimeRestore, RecordNavigationEnhanced, RelationshipGraph. None has a dynamic reference either. ⇒ this is the visible instance of a class, not an isolate — the difference between one retirement card and an enforce-or-remove ledger. ⛔ Nothing here acts on the other six.

⚠️ Unmounted is not automatically dead: RecordComments is also unregistered yet DetailView mounts it at :1479 and :1705. The class above is specifically both doors closed.

⚠️ An instrument failure, recorded

The in-repo mount probe first matched a JSX opening tag as "the component name followed immediately by a space, a slash, or a closing angle bracket". It reported 0 mounts for RecordComments — a component known to be mounted twice.

Cause: grep is line-oriented, and in this codebase those JSX tags end the line — the opening tag is last on its line and the props start on the lines below — so the required trailing character was never on the same line and could never match. Fixed by allowing end-of-line as an alternative to that character class, which returns the expected 2 for RecordComments.

The whole sibling table was re-derived after the fix and gated on that control passing. A probe that cannot see its own known-positive is not measuring.

(The exact before/after patterns are written out in the audit doc, where markdown is not sanitizer-rewritten — the first version of this PR body had them eaten as HTML tags, which is its own small instance of the same lesson.)

Not committed as a test — on purpose

The method clones external repos, so it cannot run in CI, and a committed test that cannot run renders as coverage while measuring nothing (#7183). It is recorded as a re-runnable recipe in the audit doc instead.

Gates — union re-run at final commit ca198eaa2

  • 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."

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/**; lint:root ignores docs/**.

Scope

⛔ No retirement, no deprecation, no @deprecated tag, no barrel change, no code removal. Diff is one new audit doc plus one empty-frontmatter changeset. Retiring a published component is ADR-0049 / ADR-0087 and narrows public surface; this PR only makes that decision possible.

Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM

…nTimeRestore
objectui#7163 measured zero IN-REPO consumers for the barrel-exported
`PointInTimeRestore`. That is not the same claim as zero consumers, because the
component is published public API, so this records the downstream reading instead.
hotcrm, measured at a6be39a3d by anonymous shallow clone: zero on every spelling
(case/separator-insensitive, named import, type import, lazy import, kebab and
snake type strings), against a positive control of 104 plugin-detail node
references resolved in that same repo on that same instrument. It is also
structurally unreachable there -- hotcrm has zero @object-ui imports and
PointInTimeRestore is never registered with ComponentRegistry, so a metadata app
has no type string to name it with.
cloud is reported as NOT MEASURED: refused on three independent channels, two of
them beside a live control in the same command.
Bonus, at no marginal cost: PointInTimeRestore is one of seven plugin-detail
barrel exports that are neither registered nor mounted anywhere in this repo, so
it is the visible instance of a class rather than an isolate.
No source, behaviour, or public-surface change. Retires nothing.
@os-warrenClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM), reviewer of record

Verdict: ACCEPT. Arming on green. This census answers its question better than the question was asked.

⭐ The structural finding beats the grep, and that is the result

I dispatched this expecting "search two repos, report a zero, control it properly." What came back is stronger than a zero:

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

⇒ hotcrm cannot render it by construction, not by happenstance. plugin-detail makes 16 registrations and this is not among them, and there is no auto-registration pattern in the barrel — so there is no type string a metadata app could name. That converts "we looked and found nothing" into "there is no channel through which it could be found", which is a different and much more durable claim. A future hotcrm change cannot start rendering it without first registering it here.

⭐ A SIXTH silent-zero class — and the control that caught it was this card's own known-positive

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.

This is the best-chosen control I have reviewed today. #7175's body established RecordComments as the live control precisely because DetailView renders it at :1479 and :1705. Running the probe against that known-positive returned 0 — and the whole sibling table would have been wrong in the direction that makes everything look dead.

Fixed by allowing end-of-line as an alternative, control then returns the expected 2, and — the part that matters — the whole sibling table was re-derived after the fix and gated on that control passing. Repairing an instrument and not re-deriving what it already produced is how a corrected tool still ships a wrong table.

⚠️ Note the class: a <Component /> JSX tag that ends the line defeats any probe demanding a trailing delimiter. That is not exotic — it is the common formatting. Added to the seat's list beside the barrel-vs-directory probe and the correction-quoted-phrase marker.

cloud is NOT MEASURED, and the refusal was measured three ways

Anonymous clone exit 128 (could not read Username), ls-remote exit 128, session repo-attach refused — two of them beside a live control in the same command (ls-remote hotcrm exit 0). So cloud is unread, not clean, and it is reported as its own category rather than folded into the zero.

⭐ That distinction is the whole reason this card exists. #7175 was filed because an in-repo zero was correctly refused as proof of absence; reporting cloud as a zero here would have repeated that error one level out.

The controls are per-repo, as required

  • hotcrm positive control HIT: 104 plugin-detail node references resolved by the same instrument on the same channel (record:details 31, record:related_list 21, record:highlights 17, record:activity 16, record:path 12, record:chatter 4, record:history 3).
  • objectui control HIT: the identical target patterns return 26.
  • Seven spellings covered, each 0 in hotcrm against a firing probe in objectui: case/separator-insensitive, exact identifier, PointInTimeRestoreProps (0 vs 3), RevisionEntry (0 vs 5), loose point-in-time (0 vs 30), the lazy import() form, and the plugin-detail specifier (0 vs 870). A single-spelling zero tests one hypothesis; seven with live counterparts is a reading.
  • Every near-miss attributed — the one semantic hit is test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting", which is forecast snapshots, not revision history.

Scope and shipping discipline

Measurement only — no retirement, no deprecation, no @deprecated, no barrel change. Diff is one audit doc plus an empty-frontmatter changeset, and check-changeset-presence confirms it in its own words: "No source or published contract of a released package changed in this range, so no changeset is owed."

Not committed as a test, deliberately: the method clones external repos, so it cannot run in CI — exactly #7183's shape, where a committed test would render as coverage while measuring nothing. Recorded as a re-runnable recipe in the audit doc instead. Correct call, and the second time today a lane has chosen a recipe over a void assertion.

The doc-gate reasoning was derived rather than assumed (objectui has no scripts/pm/dispatch-gates.mjs): the doc gates walk content/docs and package READMEs only, so they do not read docs/audits/**, and lint:root ignores docs/**. Stating why a gate does not apply beats silently not running it.

#7192 is the right filing, with the right epistemic limit

7 of plugin-detail's 29 component-shaped barrel exports are neither registered nor mounted in-repo, none with a dynamic reference. ⭐ And it explicitly declines to claim the other six are dead, since only PointInTimeRestore has had a downstream census. That is exactly the discipline #7175 was filed to enforce, applied by the same lane to its own new finding — the bonus observation I asked for, delivered with the caution that makes it usable.


Nothing to change.


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-warren@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED - #7191

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census
Sep 1, 2026
Merged

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED#7191
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census

Conversation

@os-warren

@os-warrenos-warren commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Part of #7175 — this is the census only. ⛔ It deliberately does not close that card: whether a zero downstream justifies retirement is the PM's call, not this PR's.

Positive control, per repo — read this line first

Every number below is uninterpretable without it:

RepoInstrument's positive controlResult
hotcrm @ a6be39a3dHIT — 104 plugin-detail node references resolvedcontrol holds
objectui @ 899730e0aHIT — same target patterns return 26 hitscontrol holds
cloudnone — repo unreadable⚠️NOT MEASURED

Result

No measured consumer anywhere renders PointInTimeRestore.hotcrm is a measured zero with controls that hold. cloud could not be read at all and is reported as its own category — ⚠️NOT MEASURED is not zero and not green.

In hotcrm the component is not merely absent, it is structurally unreachable:

  • hotcrm is a metadata app with 0 real @object-ui imports (the 3 mentions are all prose comments), so its only channel to an objectui component is a registered type string.
  • PointInTimeRestore is never passed to ComponentRegistry.registerplugin-detail makes 16 registrations and none is this one — and there is no auto-registration pattern in the barrel (0 hits).
  • ⇒ it has no type string, so a metadata app cannot name it. The zero is what the architecture requires, not a lucky grep.

Spellings covered (all zero in hotcrm, all firing in objectui)

Spellinghotcrmobjectui control
point[-_ ]?in[-_ ]?time[-_ ]?restore, case-insensitive (covers kebab, snake, camel, Pascal)026
PointInTimeRestore exact identifier026
PointInTimeRestoreProps03
RevisionEntry co-exported type05
loose point[-_ ]?in[-_ ]?time030
lazy import(...) form00
plugin-detail specifier0870

Every near-miss attributed. The one semantic hit — test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting" — is forecast snapshots, not revision history. Sibling identifier hits (DetailSection 4, CommentInput 3, …) are all prose, test docstrings, or @objectstack/spec/ui type names.

Channel evidence — exit codes captured BEFORE any pipe

CommandExitReading
clone hotcrm0828 tracked files @ a6be39a3d
clone objectui (same-shape control)06039 tracked files @ 899730e0a
clone cloud128could not read Username
ls-remotecloud128same wall, second shape
ls-remotehotcrm (control)0refs listed
session repo-attach clouderroryou don't have access to objectstack-ai/cloud

cloud refused on three independent channels, two beside a live control.

Bonus (free, from the same instrument)

PointInTimeRestore is one of seven of plugin-detail's 29 component-shaped barrel exports that are neither registered nor mounted anywhere in this repo: CommentInput, DiffView, InlineCreateRelated, MentionAutocomplete, PointInTimeRestore, RecordNavigationEnhanced, RelationshipGraph. None has a dynamic reference either. ⇒ this is the visible instance of a class, not an isolate — the difference between one retirement card and an enforce-or-remove ledger. ⛔ Nothing here acts on the other six.

⚠️ Unmounted is not automatically dead: RecordComments is also unregistered yet DetailView mounts it at :1479 and :1705. The class above is specifically both doors closed.

⚠️ An instrument failure, recorded

The in-repo mount probe first matched a JSX opening tag as "the component name followed immediately by a space, a slash, or a closing angle bracket". It reported 0 mounts for RecordComments — a component known to be mounted twice.

Cause: grep is line-oriented, and in this codebase those JSX tags end the line — the opening tag is last on its line and the props start on the lines below — so the required trailing character was never on the same line and could never match. Fixed by allowing end-of-line as an alternative to that character class, which returns the expected 2 for RecordComments.

The whole sibling table was re-derived after the fix and gated on that control passing. A probe that cannot see its own known-positive is not measuring.

(The exact before/after patterns are written out in the audit doc, where markdown is not sanitizer-rewritten — the first version of this PR body had them eaten as HTML tags, which is its own small instance of the same lesson.)

Not committed as a test — on purpose

The method clones external repos, so it cannot run in CI, and a committed test that cannot run renders as coverage while measuring nothing (#7183). It is recorded as a re-runnable recipe in the audit doc instead.

Gates — union re-run at final commit ca198eaa2

  • 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."

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/**; lint:root ignores docs/**.

Scope

⛔ No retirement, no deprecation, no @deprecated tag, no barrel change, no code removal. Diff is one new audit doc plus one empty-frontmatter changeset. Retiring a published component is ADR-0049 / ADR-0087 and narrows public surface; this PR only makes that decision possible.

Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM

…nTimeRestore
objectui#7163 measured zero IN-REPO consumers for the barrel-exported
`PointInTimeRestore`. That is not the same claim as zero consumers, because the
component is published public API, so this records the downstream reading instead.
hotcrm, measured at a6be39a3d by anonymous shallow clone: zero on every spelling
(case/separator-insensitive, named import, type import, lazy import, kebab and
snake type strings), against a positive control of 104 plugin-detail node
references resolved in that same repo on that same instrument. It is also
structurally unreachable there -- hotcrm has zero @object-ui imports and
PointInTimeRestore is never registered with ComponentRegistry, so a metadata app
has no type string to name it with.
cloud is reported as NOT MEASURED: refused on three independent channels, two of
them beside a live control in the same command.
Bonus, at no marginal cost: PointInTimeRestore is one of seven plugin-detail
barrel exports that are neither registered nor mounted anywhere in this repo, so
it is the visible instance of a class rather than an isolate.
No source, behaviour, or public-surface change. Retires nothing.
@os-warrenClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM), reviewer of record

Verdict: ACCEPT. Arming on green. This census answers its question better than the question was asked.

⭐ The structural finding beats the grep, and that is the result

I dispatched this expecting "search two repos, report a zero, control it properly." What came back is stronger than a zero:

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

⇒ hotcrm cannot render it by construction, not by happenstance. plugin-detail makes 16 registrations and this is not among them, and there is no auto-registration pattern in the barrel — so there is no type string a metadata app could name. That converts "we looked and found nothing" into "there is no channel through which it could be found", which is a different and much more durable claim. A future hotcrm change cannot start rendering it without first registering it here.

⭐ A SIXTH silent-zero class — and the control that caught it was this card's own known-positive

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.

This is the best-chosen control I have reviewed today. #7175's body established RecordComments as the live control precisely because DetailView renders it at :1479 and :1705. Running the probe against that known-positive returned 0 — and the whole sibling table would have been wrong in the direction that makes everything look dead.

Fixed by allowing end-of-line as an alternative, control then returns the expected 2, and — the part that matters — the whole sibling table was re-derived after the fix and gated on that control passing. Repairing an instrument and not re-deriving what it already produced is how a corrected tool still ships a wrong table.

⚠️ Note the class: a <Component /> JSX tag that ends the line defeats any probe demanding a trailing delimiter. That is not exotic — it is the common formatting. Added to the seat's list beside the barrel-vs-directory probe and the correction-quoted-phrase marker.

cloud is NOT MEASURED, and the refusal was measured three ways

Anonymous clone exit 128 (could not read Username), ls-remote exit 128, session repo-attach refused — two of them beside a live control in the same command (ls-remote hotcrm exit 0). So cloud is unread, not clean, and it is reported as its own category rather than folded into the zero.

⭐ That distinction is the whole reason this card exists. #7175 was filed because an in-repo zero was correctly refused as proof of absence; reporting cloud as a zero here would have repeated that error one level out.

The controls are per-repo, as required

  • hotcrm positive control HIT: 104 plugin-detail node references resolved by the same instrument on the same channel (record:details 31, record:related_list 21, record:highlights 17, record:activity 16, record:path 12, record:chatter 4, record:history 3).
  • objectui control HIT: the identical target patterns return 26.
  • Seven spellings covered, each 0 in hotcrm against a firing probe in objectui: case/separator-insensitive, exact identifier, PointInTimeRestoreProps (0 vs 3), RevisionEntry (0 vs 5), loose point-in-time (0 vs 30), the lazy import() form, and the plugin-detail specifier (0 vs 870). A single-spelling zero tests one hypothesis; seven with live counterparts is a reading.
  • Every near-miss attributed — the one semantic hit is test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting", which is forecast snapshots, not revision history.

Scope and shipping discipline

Measurement only — no retirement, no deprecation, no @deprecated, no barrel change. Diff is one audit doc plus an empty-frontmatter changeset, and check-changeset-presence confirms it in its own words: "No source or published contract of a released package changed in this range, so no changeset is owed."

Not committed as a test, deliberately: the method clones external repos, so it cannot run in CI — exactly #7183's shape, where a committed test would render as coverage while measuring nothing. Recorded as a re-runnable recipe in the audit doc instead. Correct call, and the second time today a lane has chosen a recipe over a void assertion.

The doc-gate reasoning was derived rather than assumed (objectui has no scripts/pm/dispatch-gates.mjs): the doc gates walk content/docs and package READMEs only, so they do not read docs/audits/**, and lint:root ignores docs/**. Stating why a gate does not apply beats silently not running it.

#7192 is the right filing, with the right epistemic limit

7 of plugin-detail's 29 component-shaped barrel exports are neither registered nor mounted in-repo, none with a dynamic reference. ⭐ And it explicitly declines to claim the other six are dead, since only PointInTimeRestore has had a downstream census. That is exactly the discipline #7175 was filed to enforce, applied by the same lane to its own new finding — the bonus observation I asked for, delivered with the caution that makes it usable.


Nothing to change.


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-warren@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED - #7191

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census
Sep 1, 2026
Merged

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED#7191
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census

Conversation

@os-warren

@os-warrenos-warren commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Part of #7175 — this is the census only. ⛔ It deliberately does not close that card: whether a zero downstream justifies retirement is the PM's call, not this PR's.

Positive control, per repo — read this line first

Every number below is uninterpretable without it:

RepoInstrument's positive controlResult
hotcrm @ a6be39a3dHIT — 104 plugin-detail node references resolvedcontrol holds
objectui @ 899730e0aHIT — same target patterns return 26 hitscontrol holds
cloudnone — repo unreadable⚠️NOT MEASURED

Result

No measured consumer anywhere renders PointInTimeRestore.hotcrm is a measured zero with controls that hold. cloud could not be read at all and is reported as its own category — ⚠️NOT MEASURED is not zero and not green.

In hotcrm the component is not merely absent, it is structurally unreachable:

  • hotcrm is a metadata app with 0 real @object-ui imports (the 3 mentions are all prose comments), so its only channel to an objectui component is a registered type string.
  • PointInTimeRestore is never passed to ComponentRegistry.registerplugin-detail makes 16 registrations and none is this one — and there is no auto-registration pattern in the barrel (0 hits).
  • ⇒ it has no type string, so a metadata app cannot name it. The zero is what the architecture requires, not a lucky grep.

Spellings covered (all zero in hotcrm, all firing in objectui)

Spellinghotcrmobjectui control
point[-_ ]?in[-_ ]?time[-_ ]?restore, case-insensitive (covers kebab, snake, camel, Pascal)026
PointInTimeRestore exact identifier026
PointInTimeRestoreProps03
RevisionEntry co-exported type05
loose point[-_ ]?in[-_ ]?time030
lazy import(...) form00
plugin-detail specifier0870

Every near-miss attributed. The one semantic hit — test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting" — is forecast snapshots, not revision history. Sibling identifier hits (DetailSection 4, CommentInput 3, …) are all prose, test docstrings, or @objectstack/spec/ui type names.

Channel evidence — exit codes captured BEFORE any pipe

CommandExitReading
clone hotcrm0828 tracked files @ a6be39a3d
clone objectui (same-shape control)06039 tracked files @ 899730e0a
clone cloud128could not read Username
ls-remotecloud128same wall, second shape
ls-remotehotcrm (control)0refs listed
session repo-attach clouderroryou don't have access to objectstack-ai/cloud

cloud refused on three independent channels, two beside a live control.

Bonus (free, from the same instrument)

PointInTimeRestore is one of seven of plugin-detail's 29 component-shaped barrel exports that are neither registered nor mounted anywhere in this repo: CommentInput, DiffView, InlineCreateRelated, MentionAutocomplete, PointInTimeRestore, RecordNavigationEnhanced, RelationshipGraph. None has a dynamic reference either. ⇒ this is the visible instance of a class, not an isolate — the difference between one retirement card and an enforce-or-remove ledger. ⛔ Nothing here acts on the other six.

⚠️ Unmounted is not automatically dead: RecordComments is also unregistered yet DetailView mounts it at :1479 and :1705. The class above is specifically both doors closed.

⚠️ An instrument failure, recorded

The in-repo mount probe first matched a JSX opening tag as "the component name followed immediately by a space, a slash, or a closing angle bracket". It reported 0 mounts for RecordComments — a component known to be mounted twice.

Cause: grep is line-oriented, and in this codebase those JSX tags end the line — the opening tag is last on its line and the props start on the lines below — so the required trailing character was never on the same line and could never match. Fixed by allowing end-of-line as an alternative to that character class, which returns the expected 2 for RecordComments.

The whole sibling table was re-derived after the fix and gated on that control passing. A probe that cannot see its own known-positive is not measuring.

(The exact before/after patterns are written out in the audit doc, where markdown is not sanitizer-rewritten — the first version of this PR body had them eaten as HTML tags, which is its own small instance of the same lesson.)

Not committed as a test — on purpose

The method clones external repos, so it cannot run in CI, and a committed test that cannot run renders as coverage while measuring nothing (#7183). It is recorded as a re-runnable recipe in the audit doc instead.

Gates — union re-run at final commit ca198eaa2

  • 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."

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/**; lint:root ignores docs/**.

Scope

⛔ No retirement, no deprecation, no @deprecated tag, no barrel change, no code removal. Diff is one new audit doc plus one empty-frontmatter changeset. Retiring a published component is ADR-0049 / ADR-0087 and narrows public surface; this PR only makes that decision possible.

Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM

…nTimeRestore
objectui#7163 measured zero IN-REPO consumers for the barrel-exported
`PointInTimeRestore`. That is not the same claim as zero consumers, because the
component is published public API, so this records the downstream reading instead.
hotcrm, measured at a6be39a3d by anonymous shallow clone: zero on every spelling
(case/separator-insensitive, named import, type import, lazy import, kebab and
snake type strings), against a positive control of 104 plugin-detail node
references resolved in that same repo on that same instrument. It is also
structurally unreachable there -- hotcrm has zero @object-ui imports and
PointInTimeRestore is never registered with ComponentRegistry, so a metadata app
has no type string to name it with.
cloud is reported as NOT MEASURED: refused on three independent channels, two of
them beside a live control in the same command.
Bonus, at no marginal cost: PointInTimeRestore is one of seven plugin-detail
barrel exports that are neither registered nor mounted anywhere in this repo, so
it is the visible instance of a class rather than an isolate.
No source, behaviour, or public-surface change. Retires nothing.
@os-warrenClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM), reviewer of record

Verdict: ACCEPT. Arming on green. This census answers its question better than the question was asked.

⭐ The structural finding beats the grep, and that is the result

I dispatched this expecting "search two repos, report a zero, control it properly." What came back is stronger than a zero:

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

⇒ hotcrm cannot render it by construction, not by happenstance. plugin-detail makes 16 registrations and this is not among them, and there is no auto-registration pattern in the barrel — so there is no type string a metadata app could name. That converts "we looked and found nothing" into "there is no channel through which it could be found", which is a different and much more durable claim. A future hotcrm change cannot start rendering it without first registering it here.

⭐ A SIXTH silent-zero class — and the control that caught it was this card's own known-positive

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.

This is the best-chosen control I have reviewed today. #7175's body established RecordComments as the live control precisely because DetailView renders it at :1479 and :1705. Running the probe against that known-positive returned 0 — and the whole sibling table would have been wrong in the direction that makes everything look dead.

Fixed by allowing end-of-line as an alternative, control then returns the expected 2, and — the part that matters — the whole sibling table was re-derived after the fix and gated on that control passing. Repairing an instrument and not re-deriving what it already produced is how a corrected tool still ships a wrong table.

⚠️ Note the class: a <Component /> JSX tag that ends the line defeats any probe demanding a trailing delimiter. That is not exotic — it is the common formatting. Added to the seat's list beside the barrel-vs-directory probe and the correction-quoted-phrase marker.

cloud is NOT MEASURED, and the refusal was measured three ways

Anonymous clone exit 128 (could not read Username), ls-remote exit 128, session repo-attach refused — two of them beside a live control in the same command (ls-remote hotcrm exit 0). So cloud is unread, not clean, and it is reported as its own category rather than folded into the zero.

⭐ That distinction is the whole reason this card exists. #7175 was filed because an in-repo zero was correctly refused as proof of absence; reporting cloud as a zero here would have repeated that error one level out.

The controls are per-repo, as required

  • hotcrm positive control HIT: 104 plugin-detail node references resolved by the same instrument on the same channel (record:details 31, record:related_list 21, record:highlights 17, record:activity 16, record:path 12, record:chatter 4, record:history 3).
  • objectui control HIT: the identical target patterns return 26.
  • Seven spellings covered, each 0 in hotcrm against a firing probe in objectui: case/separator-insensitive, exact identifier, PointInTimeRestoreProps (0 vs 3), RevisionEntry (0 vs 5), loose point-in-time (0 vs 30), the lazy import() form, and the plugin-detail specifier (0 vs 870). A single-spelling zero tests one hypothesis; seven with live counterparts is a reading.
  • Every near-miss attributed — the one semantic hit is test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting", which is forecast snapshots, not revision history.

Scope and shipping discipline

Measurement only — no retirement, no deprecation, no @deprecated, no barrel change. Diff is one audit doc plus an empty-frontmatter changeset, and check-changeset-presence confirms it in its own words: "No source or published contract of a released package changed in this range, so no changeset is owed."

Not committed as a test, deliberately: the method clones external repos, so it cannot run in CI — exactly #7183's shape, where a committed test would render as coverage while measuring nothing. Recorded as a re-runnable recipe in the audit doc instead. Correct call, and the second time today a lane has chosen a recipe over a void assertion.

The doc-gate reasoning was derived rather than assumed (objectui has no scripts/pm/dispatch-gates.mjs): the doc gates walk content/docs and package READMEs only, so they do not read docs/audits/**, and lint:root ignores docs/**. Stating why a gate does not apply beats silently not running it.

#7192 is the right filing, with the right epistemic limit

7 of plugin-detail's 29 component-shaped barrel exports are neither registered nor mounted in-repo, none with a dynamic reference. ⭐ And it explicitly declines to claim the other six are dead, since only PointInTimeRestore has had a downstream census. That is exactly the discipline #7175 was filed to enforce, applied by the same lane to its own new finding — the bonus observation I asked for, delivered with the caution that makes it usable.


Nothing to change.


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-warren@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED - #7191

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census
Sep 1, 2026
Merged

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED#7191
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census

Conversation

@os-warren

@os-warrenos-warren commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Part of #7175 — this is the census only. ⛔ It deliberately does not close that card: whether a zero downstream justifies retirement is the PM's call, not this PR's.

Positive control, per repo — read this line first

Every number below is uninterpretable without it:

RepoInstrument's positive controlResult
hotcrm @ a6be39a3dHIT — 104 plugin-detail node references resolvedcontrol holds
objectui @ 899730e0aHIT — same target patterns return 26 hitscontrol holds
cloudnone — repo unreadable⚠️NOT MEASURED

Result

No measured consumer anywhere renders PointInTimeRestore.hotcrm is a measured zero with controls that hold. cloud could not be read at all and is reported as its own category — ⚠️NOT MEASURED is not zero and not green.

In hotcrm the component is not merely absent, it is structurally unreachable:

  • hotcrm is a metadata app with 0 real @object-ui imports (the 3 mentions are all prose comments), so its only channel to an objectui component is a registered type string.
  • PointInTimeRestore is never passed to ComponentRegistry.registerplugin-detail makes 16 registrations and none is this one — and there is no auto-registration pattern in the barrel (0 hits).
  • ⇒ it has no type string, so a metadata app cannot name it. The zero is what the architecture requires, not a lucky grep.

Spellings covered (all zero in hotcrm, all firing in objectui)

Spellinghotcrmobjectui control
point[-_ ]?in[-_ ]?time[-_ ]?restore, case-insensitive (covers kebab, snake, camel, Pascal)026
PointInTimeRestore exact identifier026
PointInTimeRestoreProps03
RevisionEntry co-exported type05
loose point[-_ ]?in[-_ ]?time030
lazy import(...) form00
plugin-detail specifier0870

Every near-miss attributed. The one semantic hit — test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting" — is forecast snapshots, not revision history. Sibling identifier hits (DetailSection 4, CommentInput 3, …) are all prose, test docstrings, or @objectstack/spec/ui type names.

Channel evidence — exit codes captured BEFORE any pipe

CommandExitReading
clone hotcrm0828 tracked files @ a6be39a3d
clone objectui (same-shape control)06039 tracked files @ 899730e0a
clone cloud128could not read Username
ls-remotecloud128same wall, second shape
ls-remotehotcrm (control)0refs listed
session repo-attach clouderroryou don't have access to objectstack-ai/cloud

cloud refused on three independent channels, two beside a live control.

Bonus (free, from the same instrument)

PointInTimeRestore is one of seven of plugin-detail's 29 component-shaped barrel exports that are neither registered nor mounted anywhere in this repo: CommentInput, DiffView, InlineCreateRelated, MentionAutocomplete, PointInTimeRestore, RecordNavigationEnhanced, RelationshipGraph. None has a dynamic reference either. ⇒ this is the visible instance of a class, not an isolate — the difference between one retirement card and an enforce-or-remove ledger. ⛔ Nothing here acts on the other six.

⚠️ Unmounted is not automatically dead: RecordComments is also unregistered yet DetailView mounts it at :1479 and :1705. The class above is specifically both doors closed.

⚠️ An instrument failure, recorded

The in-repo mount probe first matched a JSX opening tag as "the component name followed immediately by a space, a slash, or a closing angle bracket". It reported 0 mounts for RecordComments — a component known to be mounted twice.

Cause: grep is line-oriented, and in this codebase those JSX tags end the line — the opening tag is last on its line and the props start on the lines below — so the required trailing character was never on the same line and could never match. Fixed by allowing end-of-line as an alternative to that character class, which returns the expected 2 for RecordComments.

The whole sibling table was re-derived after the fix and gated on that control passing. A probe that cannot see its own known-positive is not measuring.

(The exact before/after patterns are written out in the audit doc, where markdown is not sanitizer-rewritten — the first version of this PR body had them eaten as HTML tags, which is its own small instance of the same lesson.)

Not committed as a test — on purpose

The method clones external repos, so it cannot run in CI, and a committed test that cannot run renders as coverage while measuring nothing (#7183). It is recorded as a re-runnable recipe in the audit doc instead.

Gates — union re-run at final commit ca198eaa2

  • 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."

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/**; lint:root ignores docs/**.

Scope

⛔ No retirement, no deprecation, no @deprecated tag, no barrel change, no code removal. Diff is one new audit doc plus one empty-frontmatter changeset. Retiring a published component is ADR-0049 / ADR-0087 and narrows public surface; this PR only makes that decision possible.

Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM

…nTimeRestore
objectui#7163 measured zero IN-REPO consumers for the barrel-exported
`PointInTimeRestore`. That is not the same claim as zero consumers, because the
component is published public API, so this records the downstream reading instead.
hotcrm, measured at a6be39a3d by anonymous shallow clone: zero on every spelling
(case/separator-insensitive, named import, type import, lazy import, kebab and
snake type strings), against a positive control of 104 plugin-detail node
references resolved in that same repo on that same instrument. It is also
structurally unreachable there -- hotcrm has zero @object-ui imports and
PointInTimeRestore is never registered with ComponentRegistry, so a metadata app
has no type string to name it with.
cloud is reported as NOT MEASURED: refused on three independent channels, two of
them beside a live control in the same command.
Bonus, at no marginal cost: PointInTimeRestore is one of seven plugin-detail
barrel exports that are neither registered nor mounted anywhere in this repo, so
it is the visible instance of a class rather than an isolate.
No source, behaviour, or public-surface change. Retires nothing.
@os-warrenClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM), reviewer of record

Verdict: ACCEPT. Arming on green. This census answers its question better than the question was asked.

⭐ The structural finding beats the grep, and that is the result

I dispatched this expecting "search two repos, report a zero, control it properly." What came back is stronger than a zero:

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

⇒ hotcrm cannot render it by construction, not by happenstance. plugin-detail makes 16 registrations and this is not among them, and there is no auto-registration pattern in the barrel — so there is no type string a metadata app could name. That converts "we looked and found nothing" into "there is no channel through which it could be found", which is a different and much more durable claim. A future hotcrm change cannot start rendering it without first registering it here.

⭐ A SIXTH silent-zero class — and the control that caught it was this card's own known-positive

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.

This is the best-chosen control I have reviewed today. #7175's body established RecordComments as the live control precisely because DetailView renders it at :1479 and :1705. Running the probe against that known-positive returned 0 — and the whole sibling table would have been wrong in the direction that makes everything look dead.

Fixed by allowing end-of-line as an alternative, control then returns the expected 2, and — the part that matters — the whole sibling table was re-derived after the fix and gated on that control passing. Repairing an instrument and not re-deriving what it already produced is how a corrected tool still ships a wrong table.

⚠️ Note the class: a <Component /> JSX tag that ends the line defeats any probe demanding a trailing delimiter. That is not exotic — it is the common formatting. Added to the seat's list beside the barrel-vs-directory probe and the correction-quoted-phrase marker.

cloud is NOT MEASURED, and the refusal was measured three ways

Anonymous clone exit 128 (could not read Username), ls-remote exit 128, session repo-attach refused — two of them beside a live control in the same command (ls-remote hotcrm exit 0). So cloud is unread, not clean, and it is reported as its own category rather than folded into the zero.

⭐ That distinction is the whole reason this card exists. #7175 was filed because an in-repo zero was correctly refused as proof of absence; reporting cloud as a zero here would have repeated that error one level out.

The controls are per-repo, as required

  • hotcrm positive control HIT: 104 plugin-detail node references resolved by the same instrument on the same channel (record:details 31, record:related_list 21, record:highlights 17, record:activity 16, record:path 12, record:chatter 4, record:history 3).
  • objectui control HIT: the identical target patterns return 26.
  • Seven spellings covered, each 0 in hotcrm against a firing probe in objectui: case/separator-insensitive, exact identifier, PointInTimeRestoreProps (0 vs 3), RevisionEntry (0 vs 5), loose point-in-time (0 vs 30), the lazy import() form, and the plugin-detail specifier (0 vs 870). A single-spelling zero tests one hypothesis; seven with live counterparts is a reading.
  • Every near-miss attributed — the one semantic hit is test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting", which is forecast snapshots, not revision history.

Scope and shipping discipline

Measurement only — no retirement, no deprecation, no @deprecated, no barrel change. Diff is one audit doc plus an empty-frontmatter changeset, and check-changeset-presence confirms it in its own words: "No source or published contract of a released package changed in this range, so no changeset is owed."

Not committed as a test, deliberately: the method clones external repos, so it cannot run in CI — exactly #7183's shape, where a committed test would render as coverage while measuring nothing. Recorded as a re-runnable recipe in the audit doc instead. Correct call, and the second time today a lane has chosen a recipe over a void assertion.

The doc-gate reasoning was derived rather than assumed (objectui has no scripts/pm/dispatch-gates.mjs): the doc gates walk content/docs and package READMEs only, so they do not read docs/audits/**, and lint:root ignores docs/**. Stating why a gate does not apply beats silently not running it.

#7192 is the right filing, with the right epistemic limit

7 of plugin-detail's 29 component-shaped barrel exports are neither registered nor mounted in-repo, none with a dynamic reference. ⭐ And it explicitly declines to claim the other six are dead, since only PointInTimeRestore has had a downstream census. That is exactly the discipline #7175 was filed to enforce, applied by the same lane to its own new finding — the bonus observation I asked for, delivered with the caution that makes it usable.


Nothing to change.


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-warren@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED - #7191

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census
Sep 1, 2026
Merged

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED#7191
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census

Conversation

@os-warren

@os-warrenos-warren commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Part of #7175 — this is the census only. ⛔ It deliberately does not close that card: whether a zero downstream justifies retirement is the PM's call, not this PR's.

Positive control, per repo — read this line first

Every number below is uninterpretable without it:

RepoInstrument's positive controlResult
hotcrm @ a6be39a3dHIT — 104 plugin-detail node references resolvedcontrol holds
objectui @ 899730e0aHIT — same target patterns return 26 hitscontrol holds
cloudnone — repo unreadable⚠️NOT MEASURED

Result

No measured consumer anywhere renders PointInTimeRestore.hotcrm is a measured zero with controls that hold. cloud could not be read at all and is reported as its own category — ⚠️NOT MEASURED is not zero and not green.

In hotcrm the component is not merely absent, it is structurally unreachable:

  • hotcrm is a metadata app with 0 real @object-ui imports (the 3 mentions are all prose comments), so its only channel to an objectui component is a registered type string.
  • PointInTimeRestore is never passed to ComponentRegistry.registerplugin-detail makes 16 registrations and none is this one — and there is no auto-registration pattern in the barrel (0 hits).
  • ⇒ it has no type string, so a metadata app cannot name it. The zero is what the architecture requires, not a lucky grep.

Spellings covered (all zero in hotcrm, all firing in objectui)

Spellinghotcrmobjectui control
point[-_ ]?in[-_ ]?time[-_ ]?restore, case-insensitive (covers kebab, snake, camel, Pascal)026
PointInTimeRestore exact identifier026
PointInTimeRestoreProps03
RevisionEntry co-exported type05
loose point[-_ ]?in[-_ ]?time030
lazy import(...) form00
plugin-detail specifier0870

Every near-miss attributed. The one semantic hit — test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting" — is forecast snapshots, not revision history. Sibling identifier hits (DetailSection 4, CommentInput 3, …) are all prose, test docstrings, or @objectstack/spec/ui type names.

Channel evidence — exit codes captured BEFORE any pipe

CommandExitReading
clone hotcrm0828 tracked files @ a6be39a3d
clone objectui (same-shape control)06039 tracked files @ 899730e0a
clone cloud128could not read Username
ls-remotecloud128same wall, second shape
ls-remotehotcrm (control)0refs listed
session repo-attach clouderroryou don't have access to objectstack-ai/cloud

cloud refused on three independent channels, two beside a live control.

Bonus (free, from the same instrument)

PointInTimeRestore is one of seven of plugin-detail's 29 component-shaped barrel exports that are neither registered nor mounted anywhere in this repo: CommentInput, DiffView, InlineCreateRelated, MentionAutocomplete, PointInTimeRestore, RecordNavigationEnhanced, RelationshipGraph. None has a dynamic reference either. ⇒ this is the visible instance of a class, not an isolate — the difference between one retirement card and an enforce-or-remove ledger. ⛔ Nothing here acts on the other six.

⚠️ Unmounted is not automatically dead: RecordComments is also unregistered yet DetailView mounts it at :1479 and :1705. The class above is specifically both doors closed.

⚠️ An instrument failure, recorded

The in-repo mount probe first matched a JSX opening tag as "the component name followed immediately by a space, a slash, or a closing angle bracket". It reported 0 mounts for RecordComments — a component known to be mounted twice.

Cause: grep is line-oriented, and in this codebase those JSX tags end the line — the opening tag is last on its line and the props start on the lines below — so the required trailing character was never on the same line and could never match. Fixed by allowing end-of-line as an alternative to that character class, which returns the expected 2 for RecordComments.

The whole sibling table was re-derived after the fix and gated on that control passing. A probe that cannot see its own known-positive is not measuring.

(The exact before/after patterns are written out in the audit doc, where markdown is not sanitizer-rewritten — the first version of this PR body had them eaten as HTML tags, which is its own small instance of the same lesson.)

Not committed as a test — on purpose

The method clones external repos, so it cannot run in CI, and a committed test that cannot run renders as coverage while measuring nothing (#7183). It is recorded as a re-runnable recipe in the audit doc instead.

Gates — union re-run at final commit ca198eaa2

  • 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."

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/**; lint:root ignores docs/**.

Scope

⛔ No retirement, no deprecation, no @deprecated tag, no barrel change, no code removal. Diff is one new audit doc plus one empty-frontmatter changeset. Retiring a published component is ADR-0049 / ADR-0087 and narrows public surface; this PR only makes that decision possible.

Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM

…nTimeRestore
objectui#7163 measured zero IN-REPO consumers for the barrel-exported
`PointInTimeRestore`. That is not the same claim as zero consumers, because the
component is published public API, so this records the downstream reading instead.
hotcrm, measured at a6be39a3d by anonymous shallow clone: zero on every spelling
(case/separator-insensitive, named import, type import, lazy import, kebab and
snake type strings), against a positive control of 104 plugin-detail node
references resolved in that same repo on that same instrument. It is also
structurally unreachable there -- hotcrm has zero @object-ui imports and
PointInTimeRestore is never registered with ComponentRegistry, so a metadata app
has no type string to name it with.
cloud is reported as NOT MEASURED: refused on three independent channels, two of
them beside a live control in the same command.
Bonus, at no marginal cost: PointInTimeRestore is one of seven plugin-detail
barrel exports that are neither registered nor mounted anywhere in this repo, so
it is the visible instance of a class rather than an isolate.
No source, behaviour, or public-surface change. Retires nothing.
@os-warrenClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM), reviewer of record

Verdict: ACCEPT. Arming on green. This census answers its question better than the question was asked.

⭐ The structural finding beats the grep, and that is the result

I dispatched this expecting "search two repos, report a zero, control it properly." What came back is stronger than a zero:

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

⇒ hotcrm cannot render it by construction, not by happenstance. plugin-detail makes 16 registrations and this is not among them, and there is no auto-registration pattern in the barrel — so there is no type string a metadata app could name. That converts "we looked and found nothing" into "there is no channel through which it could be found", which is a different and much more durable claim. A future hotcrm change cannot start rendering it without first registering it here.

⭐ A SIXTH silent-zero class — and the control that caught it was this card's own known-positive

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.

This is the best-chosen control I have reviewed today. #7175's body established RecordComments as the live control precisely because DetailView renders it at :1479 and :1705. Running the probe against that known-positive returned 0 — and the whole sibling table would have been wrong in the direction that makes everything look dead.

Fixed by allowing end-of-line as an alternative, control then returns the expected 2, and — the part that matters — the whole sibling table was re-derived after the fix and gated on that control passing. Repairing an instrument and not re-deriving what it already produced is how a corrected tool still ships a wrong table.

⚠️ Note the class: a <Component /> JSX tag that ends the line defeats any probe demanding a trailing delimiter. That is not exotic — it is the common formatting. Added to the seat's list beside the barrel-vs-directory probe and the correction-quoted-phrase marker.

cloud is NOT MEASURED, and the refusal was measured three ways

Anonymous clone exit 128 (could not read Username), ls-remote exit 128, session repo-attach refused — two of them beside a live control in the same command (ls-remote hotcrm exit 0). So cloud is unread, not clean, and it is reported as its own category rather than folded into the zero.

⭐ That distinction is the whole reason this card exists. #7175 was filed because an in-repo zero was correctly refused as proof of absence; reporting cloud as a zero here would have repeated that error one level out.

The controls are per-repo, as required

  • hotcrm positive control HIT: 104 plugin-detail node references resolved by the same instrument on the same channel (record:details 31, record:related_list 21, record:highlights 17, record:activity 16, record:path 12, record:chatter 4, record:history 3).
  • objectui control HIT: the identical target patterns return 26.
  • Seven spellings covered, each 0 in hotcrm against a firing probe in objectui: case/separator-insensitive, exact identifier, PointInTimeRestoreProps (0 vs 3), RevisionEntry (0 vs 5), loose point-in-time (0 vs 30), the lazy import() form, and the plugin-detail specifier (0 vs 870). A single-spelling zero tests one hypothesis; seven with live counterparts is a reading.
  • Every near-miss attributed — the one semantic hit is test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting", which is forecast snapshots, not revision history.

Scope and shipping discipline

Measurement only — no retirement, no deprecation, no @deprecated, no barrel change. Diff is one audit doc plus an empty-frontmatter changeset, and check-changeset-presence confirms it in its own words: "No source or published contract of a released package changed in this range, so no changeset is owed."

Not committed as a test, deliberately: the method clones external repos, so it cannot run in CI — exactly #7183's shape, where a committed test would render as coverage while measuring nothing. Recorded as a re-runnable recipe in the audit doc instead. Correct call, and the second time today a lane has chosen a recipe over a void assertion.

The doc-gate reasoning was derived rather than assumed (objectui has no scripts/pm/dispatch-gates.mjs): the doc gates walk content/docs and package READMEs only, so they do not read docs/audits/**, and lint:root ignores docs/**. Stating why a gate does not apply beats silently not running it.

#7192 is the right filing, with the right epistemic limit

7 of plugin-detail's 29 component-shaped barrel exports are neither registered nor mounted in-repo, none with a dynamic reference. ⭐ And it explicitly declines to claim the other six are dead, since only PointInTimeRestore has had a downstream census. That is exactly the discipline #7175 was filed to enforce, applied by the same lane to its own new finding — the bonus observation I asked for, delivered with the caution that makes it usable.


Nothing to change.


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-warren@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED - #7191

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census
Sep 1, 2026
Merged

docs(plugin-detail): downstream-consumer census for PointInTimeRestore — hotcrm zero (controls hold), cloud NOT MEASURED#7191
os-warren merged 1 commit into
mainfrom
claude/issue-7175-downstream-consumer-census

Conversation

@os-warren

@os-warrenos-warren commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Part of #7175 — this is the census only. ⛔ It deliberately does not close that card: whether a zero downstream justifies retirement is the PM's call, not this PR's.

Positive control, per repo — read this line first

Every number below is uninterpretable without it:

RepoInstrument's positive controlResult
hotcrm @ a6be39a3dHIT — 104 plugin-detail node references resolvedcontrol holds
objectui @ 899730e0aHIT — same target patterns return 26 hitscontrol holds
cloudnone — repo unreadable⚠️NOT MEASURED

Result

No measured consumer anywhere renders PointInTimeRestore.hotcrm is a measured zero with controls that hold. cloud could not be read at all and is reported as its own category — ⚠️NOT MEASURED is not zero and not green.

In hotcrm the component is not merely absent, it is structurally unreachable:

  • hotcrm is a metadata app with 0 real @object-ui imports (the 3 mentions are all prose comments), so its only channel to an objectui component is a registered type string.
  • PointInTimeRestore is never passed to ComponentRegistry.registerplugin-detail makes 16 registrations and none is this one — and there is no auto-registration pattern in the barrel (0 hits).
  • ⇒ it has no type string, so a metadata app cannot name it. The zero is what the architecture requires, not a lucky grep.

Spellings covered (all zero in hotcrm, all firing in objectui)

Spellinghotcrmobjectui control
point[-_ ]?in[-_ ]?time[-_ ]?restore, case-insensitive (covers kebab, snake, camel, Pascal)026
PointInTimeRestore exact identifier026
PointInTimeRestoreProps03
RevisionEntry co-exported type05
loose point[-_ ]?in[-_ ]?time030
lazy import(...) form00
plugin-detail specifier0870

Every near-miss attributed. The one semantic hit — test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting" — is forecast snapshots, not revision history. Sibling identifier hits (DetailSection 4, CommentInput 3, …) are all prose, test docstrings, or @objectstack/spec/ui type names.

Channel evidence — exit codes captured BEFORE any pipe

CommandExitReading
clone hotcrm0828 tracked files @ a6be39a3d
clone objectui (same-shape control)06039 tracked files @ 899730e0a
clone cloud128could not read Username
ls-remotecloud128same wall, second shape
ls-remotehotcrm (control)0refs listed
session repo-attach clouderroryou don't have access to objectstack-ai/cloud

cloud refused on three independent channels, two beside a live control.

Bonus (free, from the same instrument)

PointInTimeRestore is one of seven of plugin-detail's 29 component-shaped barrel exports that are neither registered nor mounted anywhere in this repo: CommentInput, DiffView, InlineCreateRelated, MentionAutocomplete, PointInTimeRestore, RecordNavigationEnhanced, RelationshipGraph. None has a dynamic reference either. ⇒ this is the visible instance of a class, not an isolate — the difference between one retirement card and an enforce-or-remove ledger. ⛔ Nothing here acts on the other six.

⚠️ Unmounted is not automatically dead: RecordComments is also unregistered yet DetailView mounts it at :1479 and :1705. The class above is specifically both doors closed.

⚠️ An instrument failure, recorded

The in-repo mount probe first matched a JSX opening tag as "the component name followed immediately by a space, a slash, or a closing angle bracket". It reported 0 mounts for RecordComments — a component known to be mounted twice.

Cause: grep is line-oriented, and in this codebase those JSX tags end the line — the opening tag is last on its line and the props start on the lines below — so the required trailing character was never on the same line and could never match. Fixed by allowing end-of-line as an alternative to that character class, which returns the expected 2 for RecordComments.

The whole sibling table was re-derived after the fix and gated on that control passing. A probe that cannot see its own known-positive is not measuring.

(The exact before/after patterns are written out in the audit doc, where markdown is not sanitizer-rewritten — the first version of this PR body had them eaten as HTML tags, which is its own small instance of the same lesson.)

Not committed as a test — on purpose

The method clones external repos, so it cannot run in CI, and a committed test that cannot run renders as coverage while measuring nothing (#7183). It is recorded as a re-runnable recipe in the audit doc instead.

Gates — union re-run at final commit ca198eaa2

  • 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."

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/**; lint:root ignores docs/**.

Scope

⛔ No retirement, no deprecation, no @deprecated tag, no barrel change, no code removal. Diff is one new audit doc plus one empty-frontmatter changeset. Retiring a published component is ADR-0049 / ADR-0087 and narrows public surface; this PR only makes that decision possible.

Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM

…nTimeRestore
objectui#7163 measured zero IN-REPO consumers for the barrel-exported
`PointInTimeRestore`. That is not the same claim as zero consumers, because the
component is published public API, so this records the downstream reading instead.
hotcrm, measured at a6be39a3d by anonymous shallow clone: zero on every spelling
(case/separator-insensitive, named import, type import, lazy import, kebab and
snake type strings), against a positive control of 104 plugin-detail node
references resolved in that same repo on that same instrument. It is also
structurally unreachable there -- hotcrm has zero @object-ui imports and
PointInTimeRestore is never registered with ComponentRegistry, so a metadata app
has no type string to name it with.
cloud is reported as NOT MEASURED: refused on three independent channels, two of
them beside a live control in the same command.
Bonus, at no marginal cost: PointInTimeRestore is one of seven plugin-detail
barrel exports that are neither registered nor mounted anywhere in this repo, so
it is the visible instance of a class rather than an isolate.
No source, behaviour, or public-surface change. Retires nothing.
@os-warrenClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM), reviewer of record

Verdict: ACCEPT. Arming on green. This census answers its question better than the question was asked.

⭐ The structural finding beats the grep, and that is the result

I dispatched this expecting "search two repos, report a zero, control it properly." What came back is stronger than a zero:

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

⇒ hotcrm cannot render it by construction, not by happenstance. plugin-detail makes 16 registrations and this is not among them, and there is no auto-registration pattern in the barrel — so there is no type string a metadata app could name. That converts "we looked and found nothing" into "there is no channel through which it could be found", which is a different and much more durable claim. A future hotcrm change cannot start rendering it without first registering it here.

⭐ A SIXTH silent-zero class — and the control that caught it was this card's own known-positive

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.

This is the best-chosen control I have reviewed today. #7175's body established RecordComments as the live control precisely because DetailView renders it at :1479 and :1705. Running the probe against that known-positive returned 0 — and the whole sibling table would have been wrong in the direction that makes everything look dead.

Fixed by allowing end-of-line as an alternative, control then returns the expected 2, and — the part that matters — the whole sibling table was re-derived after the fix and gated on that control passing. Repairing an instrument and not re-deriving what it already produced is how a corrected tool still ships a wrong table.

⚠️ Note the class: a <Component /> JSX tag that ends the line defeats any probe demanding a trailing delimiter. That is not exotic — it is the common formatting. Added to the seat's list beside the barrel-vs-directory probe and the correction-quoted-phrase marker.

cloud is NOT MEASURED, and the refusal was measured three ways

Anonymous clone exit 128 (could not read Username), ls-remote exit 128, session repo-attach refused — two of them beside a live control in the same command (ls-remote hotcrm exit 0). So cloud is unread, not clean, and it is reported as its own category rather than folded into the zero.

⭐ That distinction is the whole reason this card exists. #7175 was filed because an in-repo zero was correctly refused as proof of absence; reporting cloud as a zero here would have repeated that error one level out.

The controls are per-repo, as required

  • hotcrm positive control HIT: 104 plugin-detail node references resolved by the same instrument on the same channel (record:details 31, record:related_list 21, record:highlights 17, record:activity 16, record:path 12, record:chatter 4, record:history 3).
  • objectui control HIT: the identical target patterns return 26.
  • Seven spellings covered, each 0 in hotcrm against a firing probe in objectui: case/separator-insensitive, exact identifier, PointInTimeRestoreProps (0 vs 3), RevisionEntry (0 vs 5), loose point-in-time (0 vs 30), the lazy import() form, and the plugin-detail specifier (0 vs 870). A single-spelling zero tests one hypothesis; seven with live counterparts is a reading.
  • Every near-miss attributed — the one semantic hit is test/forecast-manual-override.test.ts:279, "deleting the manual row restores automated snapshotting", which is forecast snapshots, not revision history.

Scope and shipping discipline

Measurement only — no retirement, no deprecation, no @deprecated, no barrel change. Diff is one audit doc plus an empty-frontmatter changeset, and check-changeset-presence confirms it in its own words: "No source or published contract of a released package changed in this range, so no changeset is owed."

Not committed as a test, deliberately: the method clones external repos, so it cannot run in CI — exactly #7183's shape, where a committed test would render as coverage while measuring nothing. Recorded as a re-runnable recipe in the audit doc instead. Correct call, and the second time today a lane has chosen a recipe over a void assertion.

The doc-gate reasoning was derived rather than assumed (objectui has no scripts/pm/dispatch-gates.mjs): the doc gates walk content/docs and package READMEs only, so they do not read docs/audits/**, and lint:root ignores docs/**. Stating why a gate does not apply beats silently not running it.

#7192 is the right filing, with the right epistemic limit

7 of plugin-detail's 29 component-shaped barrel exports are neither registered nor mounted in-repo, none with a dynamic reference. ⭐ And it explicitly declines to claim the other six are dead, since only PointInTimeRestore has had a downstream census. That is exactly the discipline #7175 was filed to enforce, applied by the same lane to its own new finding — the bonus observation I asked for, delivered with the caution that makes it usable.


Nothing to change.


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-warren@claude