Skip to content

AGENTS.md rule 7 and objectstack.config.ts claim declaring hierarchy-security fails an open-edition boot — measured false, and the claim is what blocks the manager read scopes #46

Description

@os-warren

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

  1. 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.
  2. 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).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions