Skip to content

refactor(spec)!: api is code-only — withdraw a runtime create door the endpoint matcher could never read (#5488) - #7040

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-5488-allowruntimecreate-false
Aug 9, 2026
Merged

refactor(spec)!: api is code-only — withdraw a runtime create door the endpoint matcher could never read (#5488)#7040
os-zhuang merged 3 commits into
mainfrom
claude/issue-5488-allowruntimecreate-false

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Fixes #5488
Closes #5311 (subsumed per the 2026-08-09 triage designation)

DEFAULT_METADATA_TYPE_REGISTRY's api entry declared allowRuntimeCreate: true and the
runtime never honoured it. This flips it to false, which makes api code-only, and
lets the existing #5086 inlet refuse the write loudly. ADR-0049 remove side.

PUT /api/v1/meta/api/e8_backdoor    → 200 {"success":true,…,"message":"Saved …"}
GET /api/v1/apps/showcase/backdoor  → 404      (anonymous AND authenticated)

…and no [EndpointMatcher] … EXCLUDED line anywhere in the boot log: the endpoint was not
gated out, it was never in the index at all. IMetadataService.matchEndpoint
EndpointMatcherMetadataManager.listForIndex('api') reads the manager's own registry
plus its registered loaders (["filesystem","memory"] on dev/serve). A runtime write lands
in sys_metadata, which is in neither.

Ruling this implements (verbatim, 2026-08-07T16:59Z)

Decision: Option B — flip the api registry entry to allowRuntimeCreate: false and
make the write inlet reject loudly
(the existing #5086 mechanism). ADR-0049 remove side,
with the corresponding retirement bookkeeping. […] Re-entry path recorded: if #2657 Part B
ever promotes apis to a registered type with a real consumption path, re-enable then
— implementation first, declaration second.

Lane and shape are the 2026-08-09T08:37:07Z triage designation: domain:spec owns it, one
coordinated PR, because a spec-first split is mechanically unsound — the inlet derives from
the spec constant, ignores mode, and rejects drafts too.

⚠️ Deliberate retirement of gateApiDraftsForPublish — a recorded overturn, not a silent delete

gateApiDraftsForPublish (metadata-protocol/src/protocol.ts) landed two days before
this PR
, in PR #5279, as #5206 step 2 / ADR-0121's publish gate on
publishPackageDrafts. It is removed here on purpose, with its nine tests and the
PUBLISH_DRAFTS_NAMESPACE_REMEDY string only it appended.

Why it can go: it judged whether an api draft was fit to be promoted draft→active in
sys_metadata. No such row is ever served — that is this issue. It was a correct verdict
about a state with no consumer.

Why it must go rather than sit unreached: with api code-only, the #5086 inlet refuses
before persistence and before the draft/publish branch (it does not read mode), so no
api draft can be authored at all and the gate could never again see one. Leaving it would
leave unreachable code asserting a rule about a row that cannot exist — a phantom check.

The reasoning is recorded in place at the old call site, not only here. The three
bullets of the original "CODE-ONLY was considered and rejected" decision block in
metadata-plugin.zod.ts are likewise kept verbatim with what became of each, so the
reversal is auditable rather than silently contradicted. Its second bullet predicted this
exact mechanism, and was correct.

What still judges endpoints, unchanged: validateApiEndpointDeclarations /
identityFreeEndpointGateFailure on the route that actually serves — the stack schema,
publishPackage (#5189), and again at load in buildEndpointIndex (PR #5203). ADR-0121's
"publish REJECTS" ruling is intact on that route.

Full file surface (exception-path condition 1)

file what
packages/spec/src/kernel/metadata-plugin.zod.ts api entry → allowRuntimeCreate: false; decision block rewritten as a RECORDED OVERTURN; ADR-0088 admission clause 2 corrected
packages/spec/src/kernel/metadata-type-api-registration.test.ts the two #5271 tripwire pins → retirement pins (+ a filePatterns pin so the 403 can prescribe)
packages/spec/src/kernel/metadata-type-schemas.ts which door the schema stands in, corrected in both the header and the api entry
packages/spec/src/kernel/metadata-create-seeds.ts api create seed removed (a pre-filled form whose save can only 403)
packages/spec/src/kernel/metadata-create-seeds.test.ts api joins KNOWN_UNSEEDED, on capability's precedent
packages/spec/src/migrations/registry.ts ADR-0087 SemanticMigration api-runtime-create-withdrawn in step 17
packages/spec/spec-changes.json, docs/protocol-upgrade-guide.md regenerated (see below)
packages/metadata-protocol/src/protocol.ts gateApiDraftsForPublish retired + call-site note; orphaned spec/api import and remedy constant removed
packages/metadata-protocol/src/protocol-publish-drafts-endpoint-gate.test.ts 9 gate tests → refusal/retirement pins (code AND status)
packages/metadata-protocol/src/protocol.code-only-types.test.ts api probe added; derived code-only set now agent, api, capability, job
packages/objectql/src/protocol-meta.test.ts beyond the declared surface — see below
packages/objectql/src/sys-metadata-repository.test.ts beyond the declared surface — see below
packages/objectql/src/metadata-validation-sweep.test.ts beyond the declared surface — see below
.changeset/api-runtime-create-withdrawn.md spec major + metadata-protocol major + objectql major

The declared two-package surface was short by one package

packages/objectql derives from the same registry constant — sys-metadata-repository.ts
has its own RUNTIME_CREATE_ALLOWED_TYPES, and protocol-meta.test.ts pins the api
write door. Swept in the #6218 direction (by the RULE's consumers, not by the edited
package: '…@objectstack/spec' + '…@objectstack/metadata-protocol'), which is how it
surfaced. This is inside the change's completion scope — those tests go red on the flag flip
alone — so they are fixed here rather than filed.

A fourth objectql site needed the opposite treatment: metadata-validation-sweep.test.ts
sweeps DEFAULT_METADATA_TYPE_REGISTRY.filter(e => e.allowRuntimeCreate), so api leaves
that suite silently and its fixture would have sat there looking like coverage while
asserting nothing. The fixture is removed deliberately, with the reason in place.

Measured blast radius vs the 2026-08-07 prediction

Prediction on record: 23 red — spec 2 + metadata-protocol 21. Re-measured by flipping
only the one-line flag on top of origin/main:

package predicted measured verdict
packages/spec 2 2 of 9110 exact — the two #5271 tripwire pins, by name
packages/metadata-protocol 21 21 of 831 exact — gateApiDraftsForPublish's 9 + 12 auto-enrolled code-only cases
packages/objectql not covered 3 of 2783 the consumption-radius gap above
total 23 26 the prediction holds exactly for its own two packages

The three objectql reds: accepts a spec-valid api item, refuses a spec-INVALID api item with 422, put accepts statically-registered api with intent=runtime-only (#5271).

Verification

All commands under the shared verification lock, NODE_OPTIONS=--max-old-space-size=4096.

suite result
pnpm --filter @objectstack/spec test 350 files / 9110 tests passed
pnpm --filter @objectstack/metadata-protocol test 65 files / 827 tests passed
pnpm --filter @objectstack/objectql test 162 files / 2783 tests passed

⚠️ The first objectql run was invalid and discarded: @objectstack/metadata-protocol
had no dist on disk, so 56 files failed to resolve the package and 0 tests ran while
the summary said "56 failed". That is the §9 stale/missing-artefact trap wearing the costume
of a real red. Re-run after building '@objectstack/objectql^...'; the number above is from
the valid run, and the script now asserts the dist is present before believing any result.

Reverse verification — direction predicted before running

Recorded in advance: ordinary RED, not one of the inverted shapes (#5046's
more-diagnostics, #5009's canonical-first inversion), because the new pins assert a refusal
that exists only while the flag is false. Config C keeps the whole change and flips the
flag back to true:

  • packages/spec2 red: both new retirement pins.
  • packages/metadata-protocol6 red: all 5 new refusal pins + the derived code-only
    set assertion (agent, api, capability, job loses api).

Predicted set, predicted direction, no surprises.

Generated artifacts — expectation recorded before reading the instrument

This change is neither shape the retirement playbook tabulates: not an enum-value
narrowing, not a whole-def deletion. It is a boolean value in a platform constant array,
so no Zod def changes and no authorable key moves. Predicted: the four ratchets byte-identical,
and spec-changes.json + the upgrade guide the ONLY things that must move.

check:generated reported exactly 2 of 10 stale:

  ✗ check:spec-changes         spec-changes.json
  ✗ check:upgrade-guide        docs/protocol-upgrade-guide.md
  ✓ check:authorable-surface   ✓ check:api-surface   ✓ check:docs   ✓ check:react-blocks
  ✓ check:skill-docs  ✓ check:skill-refs  ✓ check:strictness-ledger  ✓ check:test-typecheck

Regenerated with check:generated --fix (only the two proven stale, never the whole set).
A zero reading on the four ratchets is the correct result for this shape, not a sign the
generators were skipped — the self-evidencing signal is the opposite one, and it fired.

ADR-0087 disposition

✓ check-adr-0087-registration: 1 declared-breaking changeset(s), each carrying a disposition.
    .changeset/api-runtime-create-withdrawn.md  [major+bang]  registered api-runtime-create-withdrawn

Registered as a SemanticMigration, not a MetadataConversion: there is no authored source
to rewrite. allowRuntimeCreate is a platform registry value, and the artifact route is
byte-for-byte unaffected — what changed is a runtime HTTP verdict, the
BatchOptions.validateOnly disposition.

⚠️ Sequencing — PR #6973 region check, re-run against its real diff

The earlier assessment checked protocol.ts only, and that part holds: #6973's +157 is the
org-scoped-write refusal path, disjoint from the inlet/gate regions here. But #6973 also
touches two files this PR touches:

The intersection is benign and composable, in the same direction: #6973's own comment
says an org-scoped api write "is refused BEFORE the schema is consulted"; after this PR
api is refused regardless of org scope. Resolution on the merge lap keeps #6973's env-wide
spelling and this PR's 403 expectation. #6973 lands first; this PR merge-laps over it and
re-runs metadata-protocol + objectql on the merged tree before it goes ready.

Notes

  • Docs and skills needed no edit, and that is a finding rather than an omission: nothing
    in content/docs/** or skills/** ever taught PUT /api/v1/meta/api/:name. Every
    endpoint-authoring doc teaches apis: on the stack artifact — the route that always
    served, and the route this change leaves untouched.
  • PR fix(rest): 两个端点契约面只宣告匹配器实际会服务的集合 (#5224) #5487's served-endpoint filter stays load-bearing: it still has to hide any api rows
    a deployment already has in sys_metadata from /meta/api and /openapi.json.
  • deleteMetaItem stays ungated so those rows can be cleaned up. OS_METADATA_WRITABLE=api
    remains the single operator escape hatch; it unlocks the write only — the endpoint
    still will not be served, which is why it is a diagnostic and not a workaround.

Generated by Claude Code

claude added 2 commits August 9, 2026 09:51
…the matcher could never read (#5488)

`DEFAULT_METADATA_TYPE_REGISTRY`'s `api` entry declared `allowRuntimeCreate: true`
and the runtime never honoured it: `PUT /api/v1/meta/api/{name}` answered 200
"Saved" and the declared route then 404'd forever, with no `EXCLUDED` log line —
the endpoint was never in the matcher's index at all. `matchEndpoint` reads
`MetadataManager.listForIndex('api')` (the manager's registry plus its
filesystem/memory loaders); a runtime write lands in `sys_metadata`, in neither.

ADR-0049 remove side, per the maintainer ruling of 2026-08-07T16:59Z (Option B).
The flip makes `api` code-only, so the existing #5086 inlet refuses with
`NOT_CREATABLE` / 403 before persistence, in draft mode as well as active.

Deliberate, recorded retirements that come with it:
  - `gateApiDraftsForPublish` (PR #5279) and its 9 tests — it gated a promotion
    into a state the matcher can never read, and no `api` draft can now exist.
  - the `api` create seed — a form whose save can only 403.
  - the decision block at metadata-plugin.zod.ts is rewritten as a RECORDED
    OVERTURN, keeping its three original bullets verbatim.

The two #5271 tripwire pins are replaced by retirement pins; every rejection
case asserts `code` AND `status`. The artifact route (`**/*.api.ts` →
`publishPackage`) is untouched.

Closes #5311 (subsumed per the 2026-08-09 triage designation).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PiRUoQkTSBBmpyXBY3cVn2
… entry (#5488)

`check:generated` proved exactly two artifacts stale — the two the new
`api-runtime-create-withdrawn` SemanticMigration feeds. Regenerated with
`check:generated --fix` (only the proven-stale ones, never the whole set).

The four ratchets (api-surface, authorable-surface, json-schema.manifest,
api-surface-signatures) are byte-identical, which is the CORRECT reading for
this shape: the change is a boolean value in a platform constant array, not an
enum narrowing and not a def deletion, so no authorable key and no export moved.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PiRUoQkTSBBmpyXBY3cVn2
@vercel

vercel Bot commented Aug 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 9, 2026 11:05am

Request Review

@os-zhuang os-zhuang closed this Aug 9, 2026
@os-zhuang os-zhuang reopened this Aug 9, 2026
Merge-lap onto current main. One conflict, in the shared ADR-0087 retirement
registry (`packages/spec/src/migrations/registry.ts`): main's
`import-run-automations-declared-default-corrected` (#6190) and this branch's
`api-runtime-create-withdrawn` (#5488) both append a SemanticMigration into
step 17's array, sharing the brace above and below.

Resolved UNION-KEEP — neither entry may be lost (#6526). Recounted from the
merged file: 43 step-17 semantic entries, with both #42
(`api-runtime-create-withdrawn`) and #43
(`import-run-automations-declared-default-corrected`) present.

The two generated artifacts were NOT text-merged (the os-regen merge driver
refuses to): `spec-changes.json` and `docs/protocol-upgrade-guide.md` were
regenerated from the merged tree, and both entries are present in each.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PiRUoQkTSBBmpyXBY3cVn2
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/metadata-protocol, @objectstack/spec.

106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/metadata-protocol, packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/metadata-protocol, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/permissions/system-context.mdx (via packages/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/metadata-protocol, @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

7 release-owned page(s) also reference the affected code. These are read-only:

  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/metadata-protocol, @objectstack/spec)

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

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling labels Aug 9, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 9, 2026 11:20
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 9, 2026
Merged via the queue into main with commit debe2f6 Aug 9, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5488-allowruntimecreate-false branch August 9, 2026 11:35
os-zhuang pushed a commit that referenced this pull request Aug 9, 2026
#7040 (#5488) appended `api-runtime-create-withdrawn` to step17.semantic while
this branch appended `plugin-manifest-loading-retired`; the conflict was purely
additive and BOTH are kept. Recounted from the file (#6526):
RETIRED_KEYS_BY_MAJOR[17] = 12 entries, RETIRED_DEFS_BY_MAJOR[17] = 45 —
every sibling's registrations survive. Generated artifacts regenerated from the
merged tree.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PiRUoQkTSBBmpyXBY3cVn2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xl tests tooling

Projects

None yet

2 participants