Split out of #13637, whose dispatched half was editorial only: objectql's PLATFORM_NAMESPACE docblock asserted an invariant that #13491 had made false, and that docblock has been rewritten to describe reality. This card carries the half that was deliberately left out of it, because it is a decision about rows already written to disk, not a repair.
Recording only — no severity asserted, routing is triage's.
The state of the tree, measured on origin/main at dda969cd71
Three sites cut the platform namespace /^(sys_|cloud_|ai_)/. After #13491 (PR #13635) they no longer decide the same way:
| site |
how it decides today |
the runtime write path (Engine.resolveSystemInsertOrganization, packages/objectql/src/engine.ts) |
per object, via isPlatformObjectOutOfTenantAuditScope — the hand-adjudicated PLATFORM_OBJECT_TENANCY ledger in packages/objectql/src/tenancy/platform-object-tenancy.ts |
packages/metadata-protocol/src/seed-loader.ts |
still the namespace regexp, at its fallbackOrgId decision |
packages/metadata-protocol/src/migrations/seed-tenancy-backfill.ts |
still the namespace regexp (its own PLATFORM_NAMESPACE) |
The divergence is deliberate: #13491's re-ruling (2026-08-31, 联案 #13497) scoped itself to the runtime control.
The question
Should the two seed paths re-cut per object as well?
Why it is a decision and not a task
Both seed paths WRITE. Changing their cut changes what future seeds and backfills stamp, and says nothing by itself about rows already on disk under the old namespace-wide reading. So an answer has to cover two populations, and the second one is existing data — the manual floor.
⚠️ #13491's re-ruling execution point 3 (⛔ 永不静默改写行为) applies to every answer here, including "leave them as they are". The do-nothing answer is still a decision that has to be written down: the tree currently documents the divergence without recording that anyone chose it.
Options
A. Leave both seed paths on the namespace regexp, and record the choice. No code change; the divergence stops being an unadjudicated state and becomes a recorded decision. Cheapest, and it keeps existing rows consistent with the path that wrote them. Cost: two write paths disagree with the runtime one permanently, and every future reader re-asks this question.
B. Re-cut both seed paths per object, for FUTURE writes only. The three converge again for anything written from here on. Existing rows are left exactly as they are and are NOT re-stamped. Cost: one object can then hold rows stamped under both readings, with nothing recording which is which.
C. Re-cut, and repair existing rows. Reaches consistency on disk too. This is the option that hits the manual floor hardest — a migration over existing tenant data, unfixable after release — and #8686's own posture (already-minted duplicates are REPORTED, never rewritten) argues against it.
No recommendation is offered: choosing among these needs the maintainer's knowledge of deployed installs, which this repository cannot supply.
What this card does NOT claim
⛔ No assertion that rows the seed paths wrote are wrong. ⛔ No assertion that anything should be re-stamped. ⛔ No severity asserted. The measurement is only that the three cuts now differ, and that no card records a decision about the two that did not move.
Related
#13637 (the finding this was split out of) · #13491 / PR #13635 (where the divergence arose, deliberately) · #13636 (an adjacent gap in the same classification) · #8686 · #8672 · #8844
Generated by Claude Code
Split out of #13637, whose dispatched half was editorial only:
objectql'sPLATFORM_NAMESPACEdocblock asserted an invariant that #13491 had made false, and that docblock has been rewritten to describe reality. This card carries the half that was deliberately left out of it, because it is a decision about rows already written to disk, not a repair.Recording only — no severity asserted, routing is triage's.
The state of the tree, measured on
origin/mainatdda969cd71Three sites cut the platform namespace
/^(sys_|cloud_|ai_)/. After #13491 (PR #13635) they no longer decide the same way:Engine.resolveSystemInsertOrganization,packages/objectql/src/engine.ts)isPlatformObjectOutOfTenantAuditScope— the hand-adjudicatedPLATFORM_OBJECT_TENANCYledger inpackages/objectql/src/tenancy/platform-object-tenancy.tspackages/metadata-protocol/src/seed-loader.tsfallbackOrgIddecisionpackages/metadata-protocol/src/migrations/seed-tenancy-backfill.tsPLATFORM_NAMESPACE)The divergence is deliberate: #13491's re-ruling (2026-08-31, 联案 #13497) scoped itself to the runtime control.
The question
Should the two seed paths re-cut per object as well?
Why it is a decision and not a task
Both seed paths WRITE. Changing their cut changes what future seeds and backfills stamp, and says nothing by itself about rows already on disk under the old namespace-wide reading. So an answer has to cover two populations, and the second one is existing data — the manual floor.
Options
A. Leave both seed paths on the namespace regexp, and record the choice. No code change; the divergence stops being an unadjudicated state and becomes a recorded decision. Cheapest, and it keeps existing rows consistent with the path that wrote them. Cost: two write paths disagree with the runtime one permanently, and every future reader re-asks this question.
B. Re-cut both seed paths per object, for FUTURE writes only. The three converge again for anything written from here on. Existing rows are left exactly as they are and are NOT re-stamped. Cost: one object can then hold rows stamped under both readings, with nothing recording which is which.
C. Re-cut, and repair existing rows. Reaches consistency on disk too. This is the option that hits the manual floor hardest — a migration over existing tenant data, unfixable after release — and #8686's own posture (already-minted duplicates are REPORTED, never rewritten) argues against it.
No recommendation is offered: choosing among these needs the maintainer's knowledge of deployed installs, which this repository cannot supply.
What this card does NOT claim
⛔ No assertion that rows the seed paths wrote are wrong. ⛔ No assertion that anything should be re-stamped. ⛔ No severity asserted. The measurement is only that the three cuts now differ, and that no card records a decision about the two that did not move.
Related
#13637 (the finding this was split out of) · #13491 / PR #13635 (where the divergence arose, deliberately) · #13636 (an adjacent gap in the same classification) · #8686 · #8672 · #8844
Generated by Claude Code