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 collectRLSPolicies without 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)

Artifact Path
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 setup examples/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

vercel Bot commented Jul 14, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 14, 2026 10:51am

Request Review

@github-actions github-actions Bot 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 main Jul 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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ Set up Copilot instructions

3 participants