You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Part of #14122 · blocks #14512 · split out of #15210 (the by-shape sweep record — read it for the sweep method and the triaged false positives) · acceptance pin is #15004.
Reader half of the program ruled on #14512 (comment 5528589044). The artifact stays additive through this card.
Why this one carries priority:p2 while the rest of the program is p3
Every other reader card loses a capability. This one loses the verification itself, and reports success while doing it.
file:line
Reads
What an option-B artifact does to it
packages/verify/src/derive.ts:176
config.objects
deriveCrudCases derives ZERO CRUD round-trip cases
packages/verify/src/derive.ts:180
config.datasources
the datasource-by-name map is empty, so every derived case loses its datasource
packages/verify/src/rls.ts:134
config.positions
declaredPositionNames returns [] — no persona is built for any declared position
packages/verify/src/rls.ts:346
config.objects
rlsProbePermissionSet builds an EMPTY probe permission set — the persona that makes an RLS run a probe grants nothing and narrows nothing
Reached today from packages/cli/src/commands/verify.ts:155 (declaredPositionNames(config) on the loaded config; rlsProbeSecurity / deriveCrudCases run off the same object).
So a multi-package app under option B would get a passing os verify that asserts nothing about any of its objects. A missing collection is at least missing — someone eventually notices the gap. Zero derived cases dressed as a green run is the failure mode #15004 exists to make loud, arriving in the one place where a false green is most expensive: the command whose entire job is to tell you the app works.
The pin, already on main
#15004 merged. Read all three before writing implementation:
⚠️Neither @objectstack/verify site has a row in OPTION_B_LOSSES today — which is exactly why the by-shape sweep, and not the pin, is what found them. So this card does both halves: add the rows that ledger the loss, then fix the readers and delete them. Do it in that order and say so in the PR, because a row that never existed is a row nobody can check you against.
The pin asserts by set equality: adding a row for a loss that is already fixed goes red just as surely as leaving a row for one that is not. ⛔ Never weaken the pin to pass — do not relax set equality, stop asserting a subsystem, or add rows to silence a red.
Part of #14122 · blocks #14512 · split out of #15210 (the by-shape sweep record — read it for the sweep method and the triaged false positives) · acceptance pin is #15004.
Reader half of the program ruled on #14512 (comment 5528589044). The artifact stays additive through this card.
Why this one carries
priority:p2while the rest of the program is p3Every other reader card loses a capability. This one loses the verification itself, and reports success while doing it.
file:linepackages/verify/src/derive.ts:176config.objectsderiveCrudCasesderives ZERO CRUD round-trip casespackages/verify/src/derive.ts:180config.datasourcespackages/verify/src/rls.ts:134config.positionsdeclaredPositionNamesreturns[]— no persona is built for any declared positionpackages/verify/src/rls.ts:346config.objectsrlsProbePermissionSetbuilds an EMPTY probe permission set — the persona that makes an RLS run a probe grants nothing and narrows nothingReached today from
packages/cli/src/commands/verify.ts:155(declaredPositionNames(config)on the loaded config;rlsProbeSecurity/deriveCrudCasesrun off the same object).So a multi-package app under option B would get a passing
os verifythat asserts nothing about any of its objects. A missing collection is at least missing — someone eventually notices the gap. Zero derived cases dressed as a green run is the failure mode #15004 exists to make loud, arriving in the one place where a false green is most expensive: the command whose entire job is to tell you the app works.The pin, already on main
#15004 merged. Read all three before writing implementation:
packages/cli/test/fixtures/option-b-collection-zoo.tspackages/cli/test/fixtures/option-b-reader-probe.tspackages/cli/test/option-b-reader-acceptance.pin.test.ts@objectstack/verifysite has a row inOPTION_B_LOSSEStoday — which is exactly why the by-shape sweep, and not the pin, is what found them. So this card does both halves: add the rows that ledger the loss, then fix the readers and delete them. Do it in that order and say so in the PR, because a row that never existed is a row nobody can check you against.The pin asserts by set equality: adding a row for a loss that is already fixed goes red just as surely as leaving a row for one that is not. ⛔ Never weaken the pin to pass — do not relax set equality, stop asserting a subsystem, or add rows to silence a red.
Acceptance
resolveArtifactPackageOrder(@objectstack/core, ADR-0130 D4+D5, since fix(metadata): register a packages[] artifact per package at the metadata door so every object has one owner across every door (#14599) #14643) — flattened top level first, so today's additive artifact answers bit-identically andpackages[]only supplies what the top level lacks. That ordering is what makes this card revertible on its own and safe before the emitter half.config.packagesdirectly — a second traversal is a second ordering.composeStacks,packages/spec/src/stack.zod.ts, or what any command emits.content/docs/releases/.Sibling cards: #15005 (
@objectstack/runtime), #15006 (@objectstack/cli), #15007 (@objectstack/plugin-security, landed as PR #15226), 6/4 (@objectstack/plugin-dev). Emitter half: #14512.