Found while implementing #8. Filed unassigned — the fix is one line in objectstack.config.ts, which #8's file surface excludes and which AGENTS.md rule 2 makes a collision file, and it overturns a rule written in four places, so it wants a deliberate call rather than a rider on a security PR.
The claim
Four places in this repo say the same thing:
All four also say the ADR-0057 depth scopes "fall back to owner-only, silently, with no error" in this checkout.
What actually happens
Neither half holds on @objectstack/spec 17.2.0.
1. Authoring a hierarchy scope without the capability is a HARD ERROR, not a silent fallback.defineStack's validateHierarchyScopeCapability refuses to load the config:
✗ defineStack hierarchy-scope capability validation failed (3 issues):
✗ permission set 'duly_manager' grant on 'duly_task' uses readScope='unit_and_below', a HIERARCHY
scope. Declare `requires: ['hierarchy-security']` (provided by @objectstack/security-enterprise)
— the open edition cannot enforce it and would fail closed to owner-only.
The check fires for unit, unit_and_below and own_and_reports. (org and own are not hierarchy scopes and pass.) Because it runs inside defineStack(), every consumer trips it: pnpm validate, pnpm build, and the three tests that import objectstack.config.js.
2. Declaring the capability does NOT fail the boot. Measured on this checkout with requires: ['automation', 'hierarchy-security'] and readScope: 'unit_and_below' restored on the manager grant, @objectstack/security-enterprise NOT installed:
| gate | exit | result |
|---|
pnpm validate | 0 | ✓ Validation passed + one warning |
pnpm test | 0 | Test Files 8 passed (8) · Tests 278 passed (278), kernel logged ✅ Bootstrap complete |
pnpm build | 0 | ✓ Build complete, artifact written |
The warning, in full:
⚠ Capability "hierarchy-security" is provided by @objectstack/security-enterprise (ADR-0057 hierarchy scopes ship in the enterprise edition). Run pnpm add @objectstack/security-enterprise and add it to plugins[], or remove "hierarchy-security" from requires.
That is a warning on the capability-provider check (#3366). It does not fail anything.
Bounds of the measurement, stated so nobody over-reads it: this covers objectstack validate, objectstack build, and the in-process kernel boot the test suite performs (test/task-actions.test.ts and siblings boot a real kernel against the app's own config). It does not cover objectstack start against a production runtime, or a cloud deployment that may treat an unprovided capability more strictly. If someone knows of a stricter path, that is the thing to check before acting.
Why it matters right now
The two statements together are what make the manager model unauthorable. #8 specifies readScope: 'unit_and_below' for duly_manager on duly_task and duly_duty; a package that may not declare the capability has exactly two authorable read depths, own and org, and for this product org is a disclosure. So #8 ships those three grants at own — fail-closed, identical to what the open edition would have resolved anyway, but an under-declaration that a future enterprise deployment would silently inherit.
The platform's own behaviour here is coherent and worth keeping: refusing an undeclared hierarchy scope prevents exactly the silent degradation rule 7 tells us to live with, and the provider warning is the honest signal for a dev checkout. Nothing upstream looks broken. What is wrong is the belief in this repo.
What to decide
- Add
'hierarchy-security' to requires in objectstack.config.ts and correct the comment beside it. Authors the ADR-0057 scopes as specified, keeps all four gates green, and turns the silent open-edition fallback into a printed warning on every validate/build. Costs: one warning line in every dev run, and an accurate declaration that the product needs @objectstack/security-enterprise — which objectstack.config.ts already calls "a HARD product dependency" in its own security comment. - Leave
requires alone and accept owner-only manager grants until the deployment takes the enterprise package.
Whichever is chosen, AGENTS.md rule 7 needs rewriting: its operative instruction rests on a fact that is not true, and its "resolves to owner-only silently, not a bug to chase" framing is the opposite of what a dev now meets (a hard load failure at the first hierarchy scope they type). Also worth folding in: the depth check treats org as non-hierarchical, which is not obvious and is the trapdoor a dev reaching for "some visibility for managers" will fall through.
Cross-refs: #8 (blocked bullet, ships fail-closed), objectstack-ai/objectstack#14103 (the separate, genuine platform gap #8 also hit).
Found while implementing #8. Filed unassigned — the fix is one line in
objectstack.config.ts, which #8's file surface excludes and which AGENTS.md rule 2 makes a collision file, and it overturns a rule written in four places, so it wants a deliberate call rather than a rider on a security PR.The claim
Four places in this repo say the same thing:
AGENTS.mdrule 7: "do not addhierarchy-securitytorequires— that would fail an open-edition boot."objectstack.config.ts, besiderequires: ['automation']: "Declaring the capability would make an open-edition boot fail."All four also say the ADR-0057 depth scopes "fall back to owner-only, silently, with no error" in this checkout.
What actually happens
Neither half holds on
@objectstack/spec17.2.0.1. Authoring a hierarchy scope without the capability is a HARD ERROR, not a silent fallback.
defineStack'svalidateHierarchyScopeCapabilityrefuses to load the config:The check fires for
unit,unit_and_belowandown_and_reports. (organdownare not hierarchy scopes and pass.) Because it runs insidedefineStack(), every consumer trips it:pnpm validate,pnpm build, and the three tests that importobjectstack.config.js.2. Declaring the capability does NOT fail the boot. Measured on this checkout with
requires: ['automation', 'hierarchy-security']andreadScope: 'unit_and_below'restored on the manager grant,@objectstack/security-enterpriseNOT installed:pnpm validate✓ Validation passed+ one warningpnpm testTest Files 8 passed (8) · Tests 278 passed (278), kernel logged✅ Bootstrap completepnpm build✓ Build complete, artifact writtenThe warning, in full:
That is a warning on the capability-provider check (#3366). It does not fail anything.
Bounds of the measurement, stated so nobody over-reads it: this covers
objectstack validate,objectstack build, and the in-process kernel boot the test suite performs (test/task-actions.test.tsand siblings boot a real kernel against the app's own config). It does not coverobjectstack startagainst a production runtime, or a cloud deployment that may treat an unprovided capability more strictly. If someone knows of a stricter path, that is the thing to check before acting.Why it matters right now
The two statements together are what make the manager model unauthorable. #8 specifies
readScope: 'unit_and_below'forduly_manageronduly_taskandduly_duty; a package that may not declare the capability has exactly two authorable read depths,ownandorg, and for this productorgis a disclosure. So #8 ships those three grants atown— fail-closed, identical to what the open edition would have resolved anyway, but an under-declaration that a future enterprise deployment would silently inherit.The platform's own behaviour here is coherent and worth keeping: refusing an undeclared hierarchy scope prevents exactly the silent degradation rule 7 tells us to live with, and the provider warning is the honest signal for a dev checkout. Nothing upstream looks broken. What is wrong is the belief in this repo.
What to decide
'hierarchy-security'torequiresinobjectstack.config.tsand correct the comment beside it. Authors the ADR-0057 scopes as specified, keeps all four gates green, and turns the silent open-edition fallback into a printed warning on every validate/build. Costs: one warning line in every dev run, and an accurate declaration that the product needs@objectstack/security-enterprise— whichobjectstack.config.tsalready calls "a HARD product dependency" in its own security comment.requiresalone and accept owner-only manager grants until the deployment takes the enterprise package.Whichever is chosen, AGENTS.md rule 7 needs rewriting: its operative instruction rests on a fact that is not true, and its "resolves to owner-only silently, not a bug to chase" framing is the opposite of what a dev now meets (a hard load failure at the first hierarchy scope they type). Also worth folding in: the depth check treats
orgas non-hierarchical, which is not obvious and is the trapdoor a dev reaching for "some visibility for managers" will fall through.Cross-refs: #8 (blocked bullet, ships fail-closed), objectstack-ai/objectstack#14103 (the separate, genuine platform gap #8 also hit).