Uh oh!
There was an error while loading. Please reload this page.
docs(core): retract the config-validation claim that never ran, and record its retirement - #12905
Conversation
…ecord its retirement REFACTORING_SUMMARY.md section 5 claimed PluginConfigValidator had been integrated into PluginLoader and that validatePluginConfig performed real schema validation. Measured on this repository's whole recorded history, it never did: the loader's only call site passed one argument, so the method always returned from its `config === undefined` branch before reaching the validator, and no plugin ever declared a PluginMetadata.configSchema for the enclosing guard to fire on. Rewriting the section as merely "later retired" would have preserved the false claim that it once worked, so the correction answers both defects: the fix never took effect, AND the surface was retired under ADR-0049 on 2026-08-27. The section is corrected in place rather than deleted, mirroring the tombstones the retirement deliberately left in plugin-loader.ts and security/index.ts. The adjacent `## Verification` line is deliberately untouched and reported to the PM instead: its counts have drifted (380/22 claimed, 1015/41 measured now), but unlike section 5 they were accurate when written. Part of #12688 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LZbWd2jNV1FErXTPSS4Dry
📓 Docs Drift Check
What this run could not see
Coarse fallback — 23 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
os-zhuang
commented
Aug 28, 2026
Reviewer-of-record: both open questions ruled. Neither goes to the maintainer. 1. The |
Uh oh!
There was an error while loading. Please reload this page.
os-zhuang
commented
Aug 28, 2026
Standing down: dequeued four times on a failure that is not this PR's — holding until |
| queue build | run | at |
|---|---|---|
pr-12905-fcb30dbf | 33155570089 | 08:29Z |
pr-12905-94320187 | 33156029840 | 08:36Z |
pr-12905-48ba87bf | 33156604925 | 08:45Z |
pr-12905-aef1b7e6 | 33157190078 | 08:54Z |
✗ check-adr-anchors --self-test — 1 failure(s) of 106 assertion(s)
• live-decision-letters-are-green-today
ADR-0006 D4 is cited by 1 file(s), but ADR-0006 declares no D4 —
it decides: D1, D1.1, D1.2, D1.3, D2, D3
packages/spec/src/data/object.zod.ts
33157190078's job log, not inferred from the earlier PRs — my expecting this cause did not make it measured.
Why it is not this PR's — three independent legs
- The named file is not in the diff. This PR changes exactly one file,
packages/core/REFACTORING_SUMMARY.md(+20/−4).packages/spec/src/data/object.zod.tsis untouched, and a Markdown file inpackages/corecannot reach apackages/specsource citation. mainis red on its own. Atorigin/mainaef1b7e64,grep -c 'ADR-0006 D4'onpackages/spec/src/data/object.zod.ts→ 1. Thedomain:devxseat reproduced--self-testEXIT=1 in a throwaway worktree checked out at that ref with nothing applied.- The same check fails identically on other lanes' PRs —
pr-12864,pr-12878,pr-12895,pr-12897,pr-12901. Five other PRs, five different diffs, one failure.
⛔ No re-run spent
This is a deterministic content defect on the base, not a flake — the same assertion renders byte-identically across four queue builds of this PR and five other PRs. Re-running would consume CI to reproduce a known-red base. "Flake" is not a root cause.
⛔ Also not done, and not available to this seat: the fix is on packages/spec (spec seat's surface) and possibly docs/adr/** (governed). Skipping, loosening, or quarantining check-adr-anchors is excluded outright — the gate's own text is right that "a letter that resolves to nothing is the defect it exists to name."
The remedy is already in flight
- [finding] The merge queue is blocked repo-wide:
check-adr-anchorsis red onmain—object.zod.tscitesADR-0006 D4, which no ADR-0006 file declares #12913 — the p0 tracking card (priority:p0·domain:spec), filed by this seat and since graded and re-measured by triage. - fix(spec): namespace tombstone stops citing ADR-0006 D4 — unblocks the merge queue's check-adr-anchors red #12917 — the one-string unblock, currently at the front of the merge queue (
gh-readonly-queue/main/pr-12917-aef1b7e641…). It drops the phantom letter citation without substituting another unbacked one, per the gate's own case (c). - [finding] The namespace retirement is enforced but UNWRITTEN — no ADR declares it, and three live spellings cite the phantom "ADR-0006 D4" #12918 — the deeper half: the
namespaceretirement is enforced but never written into any ADR. ⛔ Not a blocker for this PR.
What happens next
This seat re-queues #12905 once main carries #12917 and is green — no change to this PR, no rebase needed for correctness (the queue rebuilds against the new base itself). Until then it is held rather than re-thrown at a base known to reject it.
Generated by Claude Code
Uh oh!
There was an error while loading. Please reload this page.
Fixes#12688
packages/core/REFACTORING_SUMMARY.mdsection 5 recorded a configuration-validation fix that never took effect, and named a mechanism that has since been retired. Rewriting it as merely "later retired" would have preserved the false claim that it once worked, so the correction answers both defects.What this document is for, and why the section is corrected in place
It is an internal historical record of one refactoring episode — titled Kernel Refactoring Summary, present since the repository's root commit, and it ships in no package (verified below). Its value is the record, which argues against deleting the section: a gap where section 5 sat teaches a later reader nothing and leaves the same false claim free to be re-added by someone who finds the scaffold and assumes it was never wired.
So the section keeps its slot and heading and is corrected in place. That mirrors what the retirement itself chose to do in code — it left tombstones in
src/plugin-loader.tsandsrc/security/index.tsrather than deleting silently. The doc layer now matches the code layer.Defect 1 — the claimed fix never ran (measured, not assumed)
Two independent legs, both over this repository's whole recorded history:
Reachability. The only production call site was
plugin-loader.ts:157,this.validatePluginConfig(metadata)— one argument, soconfig === undefined. The method returned from itsconfig === undefinedbranch, loggingconfig validation postponed, before reachingthis.configValidator.validatePluginConfig(...). The code's own comment conceded it: "In loadPlugin, we often don't have the config yet ... let's keep the logging behavior". Searching all refs for changes tothis.validatePluginConfig(returns exactly three commits — the root import and the two retirement commits — so the call site was never rewired in between.The enclosing guard. That call sat under
if (metadata.configSchema). No plugin ever declared aPluginMetadata.configSchema: the only declarations anywhere were documentation examples (ADVANCED_FEATURES.md,content/docs/guides/plugins.mdx) and unrelatedconfigSchemaconcepts (DataSource connection config, a manifest path string). Positive control on the same ref and query shape —startupTimeout, the live sibling — finds real code declarations inkernel.test.tsandexamples/kernel-features-example.ts.Both legs agree with two sources written independently of this card: the retirement commit ("the loader's one call site passed no config"; "the always-early-returning
validatePluginConfigpath") and ADR-0025 section 3.7 ("the mechanism could never run").Defect 2 — the retirement landed
Verified independently rather than taken on trust. At HEAD the surviving mentions in
packages/coreare all tombstones: theconfigSchemafield comment inplugin-loader.ts, the barrel comment insecurity/index.ts, andplugin-loader.retired-fields.pin.test.ts. A correct ADR-0049 retirement leaves tombstones, so these are the expected shape, not residue. Before this PR,REFACTORING_SUMMARY.mdwas the only place left inpackages/corenamingPluginConfigValidatorandplugin.configSchemaas live. Positive control:PluginMetadatastill reads 26 files at HEAD.Deliberately NOT touched: the adjacent
## VerificationlineLeft alone and reported to the PM instead of fixed, because it is a different class of defect and widening a doc card is not mine to decide.
It claims
100% Pass rate (380/380 tests) across 22 test suites. Measured at716185a98:Test Files 41 passed (41),Tests 1015 passed (1015). However, at the root commitpackages/corehad exactly 22 top-leveldescribe()blocks — an exact match for "22 test suites". So unlike section 5, this line was accurate when written and has merely drifted since. It is stale, not false, and the "100% pass rate" half still holds.Changeset
None, and
skip-changesetis applied.@objectstack/coreis public (v17.2.0), but itsfilesfield is["dist", "README.md", "CHANGELOG.md"], andnpm pack --dry-runconfirmsREFACTORING_SUMMARY.mdis absent from the tarball. The file ships in no package, so this change is not user-visible and gives release notes nothing to compile.Verification
Gate family derived from the real changeset with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(not from a hand-written diff), all run at716185a98, every exit code captured before any pipe:check:page-declaration-shapecheck:published-files✓ check:published-files --self-testcheck:slot-lookup✓ slot-lookup ratchet holdscheck:test-source-aliascheck-test-source-alias OKcheck:type-source-resolutioncheck-type-source-resolution OKcheck-comment-mask-adoption.mjsOK check:comment-mask-adoptioncheck-plugin-teardown-shape.mjs✓ check:plugin-teardown-shapedocs-audit/check-affected-docs.mjsdocs-audit/check-drift-comment.mjs✓ check-drift-comment: 56 cases passcheck-nul-bytes.mjscheck-nul-bytes: OK (scanned 7169 text file(s))pnpm --filter @objectstack/core testat716185a98, through the shared verify lock:Test Files 41 passed (41),Tests 1015 passed (1015),VERDICT command-exit 0.Scope: one file, documentation only. Nothing under
packages/core/srcis touched — the retirement's tombstones are correct as they stand.Generated by Claude Code
Generated by Claude Code