The platform checklist item platform-core.activation-ledger-row-contract
(docs/qa/platform-checklist/areas/platform-core.json) is written around a column that
no longer exists, so several of its steps are now impossible to execute as written.
What changed underneath it
PR for #15024 drops the reserved organization_id column from sys_metadata_activation:
the object declares systemFields: { tenant: false }, the declared unique index states
unique: 'global' over (metadata_type, name), and
ObjectStoreMetadataActivationStore no longer filters reads to NULL-organization rows or
skips org-carrying ones. The table never shipped with the column (it landed after the
@objectstack/account@17.2.0 tag), so this is a plain removal.
What is now stale in the item
Measured against the item's own text:
- Step 2 tells the runner each row "carries the five declared columns (metadata_type,
name, package_id, organization_id, active) and organization_id is NULL on every row" —
there are now four columns and no tenant column. - Step 6 (uniqueness probe) describes the refusal as coming from "the COALESCE'd unique
index (ADR-0120 D3 NULL-collapse)". The index is now a plain 'global' unique over the two
real key parts. The probe still works and should still refuse; only the stated mechanism is wrong. - Step 7 (org-row-skip probe) instructs the runner to
INSERT a row with
organization_id set into the sqlite file. That INSERT can no longer succeed — there is no
such column — so the leg cannot be run at all, and the clause it verifies
("org-carrying rows are SKIPPED on read, never merged") no longer describes the platform. - The
ref lines cite unique:'organization', "organization_id reserved-NULL" and
"org-row skip on read (the wall)" in sys-metadata-activation.object.ts and
metadata-activation-store.ts. None of those are in either file any more. access-security.activation-write-operator-gate is affected more lightly: it asks the runner
to read the row back and see organization_id NULL. The operator gate itself is unchanged
and its pins pass unchanged; only that one read-back detail is stale.
Why this was not fixed in the #15024 PR
Rewriting it is not mechanical. Step 7 does not have a drop-in replacement — the honest
question is whether the org-skip clause is replaced by a "the table has no tenant column"
probe, or simply retired along with the behaviour it tested — and that is a judgement about
what the checklist should assert, which belongs with the checklist's own authoring pass rather
than riding on a code PR.
⚠️ Not urgent for CI: pnpm check:platform-checklist is deliberately NOT wired into the lint
workflow (maintainer decision, noted in .github/workflows/lint.yml — it is run by hand), and it
already reports 4 unrelated UNCLASSIFIED coverage problems on origin/main today
(batch_endpoints, crud_endpoints, metadata_endpoints, route_generation), verified
byte-identical at fcc42e6c1 before any of this work. So this item's staleness blocks nothing
mechanically — it misleads a human runner, which is the whole cost.
Refs: #15024 · branch claude/issue-15024-activation-ledger-tenantless
🤖 Generated with Claude Code
The platform checklist item
platform-core.activation-ledger-row-contract(
docs/qa/platform-checklist/areas/platform-core.json) is written around a column thatno longer exists, so several of its steps are now impossible to execute as written.
What changed underneath it
PR for #15024 drops the reserved
organization_idcolumn fromsys_metadata_activation:the object declares
systemFields: { tenant: false }, the declared unique index statesunique: 'global'over(metadata_type, name), andObjectStoreMetadataActivationStoreno longer filters reads to NULL-organization rows orskips org-carrying ones. The table never shipped with the column (it landed after the
@objectstack/account@17.2.0tag), so this is a plain removal.What is now stale in the item
Measured against the item's own text:
name, package_id, organization_id, active) and organization_id is NULL on every row" —
there are now four columns and no tenant column.
index (ADR-0120 D3 NULL-collapse)". The index is now a plain
'global'unique over the tworeal key parts. The probe still works and should still refuse; only the stated mechanism is wrong.
INSERTa row withorganization_idset into the sqlite file. That INSERT can no longer succeed — there is nosuch column — so the leg cannot be run at all, and the clause it verifies
("org-carrying rows are SKIPPED on read, never merged") no longer describes the platform.
reflines citeunique:'organization', "organization_id reserved-NULL" and"org-row skip on read (the wall)" in
sys-metadata-activation.object.tsandmetadata-activation-store.ts. None of those are in either file any more.access-security.activation-write-operator-gateis affected more lightly: it asks the runnerto read the row back and see
organization_id NULL. The operator gate itself is unchangedand its pins pass unchanged; only that one read-back detail is stale.
Why this was not fixed in the #15024 PR
Rewriting it is not mechanical. Step 7 does not have a drop-in replacement — the honest
question is whether the org-skip clause is replaced by a "the table has no tenant column"
probe, or simply retired along with the behaviour it tested — and that is a judgement about
what the checklist should assert, which belongs with the checklist's own authoring pass rather
than riding on a code PR.
pnpm check:platform-checklistis deliberately NOT wired into the lintworkflow (maintainer decision, noted in
.github/workflows/lint.yml— it is run by hand), and italready reports 4 unrelated
UNCLASSIFIEDcoverage problems onorigin/maintoday(
batch_endpoints,crud_endpoints,metadata_endpoints,route_generation), verifiedbyte-identical at
fcc42e6c1before any of this work. So this item's staleness blocks nothingmechanically — it misleads a human runner, which is the whole cost.
Refs: #15024 · branch
claude/issue-15024-activation-ledger-tenantless🤖 Generated with Claude Code