Skip to content

fix(plugin-security,plugin-hono-server): ADR-0090 live-test fixes + permission-model test suite - #2910

Merged
os-zhuang merged 1 commit into
mainfrom
claude/permission-model-testing-d5a460
Jul 14, 2026
Merged

fix(plugin-security,plugin-hono-server): ADR-0090 live-test fixes + permission-model test suite#2910
os-zhuang merged 1 commit into
mainfrom
claude/permission-model-testing-d5a460

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Summary

Live-tested docs/design/permission-model.md (ADR-0090) end-to-end against examples/app-showcase — 49 REST assertions + 11 Playwright cases including real console UI runs with evidence screenshots. Testing surfaced two engine defects, both fixed here with regression tests.

Engine fixes

1. plugin-security — write-time check policies dropped position applicability (checklist G4)

computeWriteCheckFilter called collectRLSPolicieswithout the caller's held positions, so a check policy declaring a positions domain never fired for its holders — an owner transfer that ADR-0058 D4 post-image validation should reject was silently allowed, diverging from the read path (using). Fixed by passing context.positions; +3 regression tests.

2. plugin-hono-server — /auth/me/permissions identity-resolution drift → console fake read-only (checklist L5)

resolveCtx hand-rolled identity resolution and skipped sys_user_position / sys_position_permission_set, violating the invariant documented in packages/core/src/security/resolve-authz-context.ts (every HTTP entry point must use the shared resolver). Position-granted capability never reached GET /api/v1/auth/me/permissions: the console rendered fully read-only forms for users whose writes the data plane (which uses the shared resolver) accepted. Fixed by delegating to resolveAuthzContext, return shape aligned with @objectstack/rest; +2 regression tests.

Test artifacts (kept, repeatable)

ArtifactPath
Test checklist (A–M vs design doc)examples/app-showcase/docs/test/permission-model-test-checklist.md
Test report (findings + evidence index + rerun steps)examples/app-showcase/docs/test/permission-model-test-report.md
49-assertion REST suite + env setupexamples/app-showcase/docs/test/scripts/perm-{setup,test}.sh
Playwright suite (REST representative + console UI w/ screenshots)examples/app-showcase/e2e/permission-model.spec.ts
Opt-in Playwright config (excluded from default smoke via testIgnore)examples/app-showcase/playwright.permission.config.ts
Console UI evidence (L1–L5)examples/app-showcase/docs/test/screenshots/L*.png

UI evidence highlights

  • L1/L2 — RLS narrows ada's task/invoice lists to her own rows.
  • L3 — audrey (viewAllRecords) sees all inquiries and foreign private notes.
  • L4 — newbie (baseline only) sees an empty inquiry list (private OWD).
  • L5 — ada's edit dialog: budget/spent disabled by FLS while status/dates stay editable — this is the case that exposed fix✨ Set up Copilot instructions #2 (before the fix the whole form was disabled).

Verification

  • pnpm -C packages/plugins/plugin-security test → 329/329 ✅
  • pnpm -C packages/plugins/plugin-hono-server test → 66/66 ✅ (incl. 5 new regression tests across both packages)
  • REST suite 49/49 ✅ and Playwright 11/11 ✅ against a live :3777 dev server after the fixes (report §2)

Changeset included (patch × 2).

@vercel

vercelBot commented Jul 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJul 14, 2026 10:51am

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation tests tooling size/xl labels Jul 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/plugin-hono-server, @objectstack/plugin-security.

13 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/getting-started/cli.mdx(via @objectstack/plugin-security)
  • content/docs/getting-started/your-first-project.mdx(via @objectstack/plugin-hono-server)
  • content/docs/permissions/access-recipes.mdx(via packages/plugins/plugin-security)
  • content/docs/permissions/authentication.mdx(via @objectstack/plugin-hono-server)
  • content/docs/permissions/authorization.mdx(via packages/plugins/plugin-security)
  • content/docs/permissions/explain.mdx(via @objectstack/plugin-security)
  • content/docs/permissions/permissions-matrix.mdx(via packages/plugins/plugin-security)
  • content/docs/permissions/sharing-rules.mdx(via @objectstack/plugin-security)
  • content/docs/plugins/index.mdx(via @objectstack/plugin-hono-server, @objectstack/plugin-security)
  • content/docs/plugins/packages.mdx(via @objectstack/plugin-hono-server, @objectstack/plugin-security)
  • content/docs/releases/implementation-status.mdx(via @objectstack/plugin-hono-server, @objectstack/plugin-security)
  • content/docs/ui/audience-based-interfaces.mdx(via packages/plugins/plugin-security)
  • content/docs/ui/dashboards.mdx(via @objectstack/plugin-security)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.

import { Plugin, PluginContext, IHttpServer, IDataEngine } from '@objectstack/core';
import { Plugin, PluginContext, IHttpServer, IDataEngine, resolveAuthzContext } from '@objectstack/core';
@os-zhuang
os-zhuang merged commit 0e13513 into mainJul 14, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the claude/permission-model-testing-d5a460 branch July 14, 2026 10:55
…ermission-model test suite
Live testing of docs/design/permission-model.md against app-showcase
(49 REST assertions + 11 Playwright cases incl. console UI evidence)
surfaced two engine defects, both fixed with regression tests:
- plugin-security: computeWriteCheckFilter dropped the caller's held
positions, so position-scoped write-time `check` policies (ADR-0058 D4)
never fired — an owner transfer that should be rejected was allowed.
- plugin-hono-server: resolveCtx hand-rolled identity resolution and
skipped sys_user_position / sys_position_permission_set, so
/auth/me/permissions under-reported position-granted capability and
the console rendered read-only forms while the data plane accepted
the same writes. Now delegates to the shared resolveAuthzContext.
Test artifacts kept under examples/app-showcase:
- docs/test/permission-model-test-checklist.md (A–M matrix)
- docs/test/permission-model-test-report.md (findings + evidence)
- docs/test/scripts/perm-setup.sh / perm-test.sh (49-assertion REST suite)
- e2e/permission-model.spec.ts + playwright.permission.config.ts
(opt-in config; excluded from the default smoke run via testIgnore)
- docs/test/screenshots/L1–L5 console UI evidence
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xlteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ Set up Copilot instructions

3 participants

@baozhoutao@github-advanced-security@os-zhuang