Pomavo now gives you explicit control over who can do what, where they can do it, and how public access is handled. Permissions and Public Sharing replaces broad assumptions with fine-grained grants that apply consistently across the UI, API, search, automation, and AI entry points.
Subject, action, resource is the core model
Pomavo permissions are expressed as Subject-Action-Resource tuples. The subject is the identity receiving access, the action is the capability being allowed, and the resource is the scope where that capability applies.
This model is simple enough to inspect but precise enough for multi-tenant work. A user can view one project without viewing every project. An integration can download attachments only where it has access. Anonymous visitors can receive read-only access to a public project without becoming organization members.
| Tuple part | Meaning | Example |
|---|---|---|
| Subject | The user, integration, guest, or anonymous identity | A member, machine identity, or sentinel anonymous user |
| Action | The operation being allowed | VIEW_ISSUE, ADD_COMMENT, DOWNLOAD_ATTACHMENT |
| Resource | The scope where the action applies | urn:pomavo:project:2 |
This is the same permission language described in Permissions and reinforced by the Security Model.
Authentication answers who you are. Permissions answer what you may do. Pomavo checks both for sensitive operations.
URN scopes make grants precise
Resource scopes use URNs so grants can target an organization, all resources of a type, or one specific resource. Wildcards make broad access possible when it is intentional, while specific IDs keep everyday grants narrow.
| Scope | Meaning |
|---|---|
urn:pomavo:org:* | Organization-wide scope |
urn:pomavo:project:* | All projects |
urn:pomavo:project:2 | One project |
urn:pomavo:template:* | All templates |
urn:pomavo:template:3 | One template |
Wildcard scope is powerful. Use it for administrators, broad automation, or shared read access only when the subject truly needs every resource of that type.
Specific scopes are better for project contributors, one-off integrations, public issue trackers, and guests who need access to one area but not the whole workspace.
55 permissions across 16 categories
This release documents and manages 55 permissions across 16 categories. The categories map to the product areas your team already uses, including organizations, projects, templates, workflows, integrations, agents, tickets, attachments, links, comments, users, automations, plugins, shared fields, and locks.
The catalog matters because every product area can be granted independently. A user who manages templates does not automatically receive attachment deletion. An integration that comments on bugs does not automatically create projects.
Permission-gated UI actions reduce dead ends
The UI now uses permissions to decide which actions and sections you can see or use. If you do not have the required permission, Pomavo can hide or disable the action instead of letting you click into an operation that the API will reject.
This improves both clarity and security. Users spend less time discovering forbidden operations through errors, while the API remains the final authority for every sensitive action.
| UI area | Permission impact |
|---|---|
| Project settings | Edit and delete actions depend on project permissions |
| Ticket actions | Field edits, transitions, moves, follows, links, comments, and attachments are gated |
| Integration pages | Machine identity and API key management depends on integration permissions |
| Template and workflow pages | Create, edit, and delete controls follow template and workflow grants |
| Organization settings | Settings, members, defaults, and anonymous access respect scoped grants |
Permission-gated UI is a guide, not the only protection. Direct API calls, MCP tools, query mutations, and automation all still pass through the same permission checks.
The quick grant dialog speeds project setup
The quick grant dialog helps administrators grant project permissions without building every tuple manually. It is designed for common project access tasks where you need to give a user the right set of project-scoped abilities quickly.
This is especially useful when onboarding a teammate to one project, giving a guest read access, or granting an integration the exact permissions it needs for a project-level workflow.
| Quick grant scenario | Result |
|---|---|
| Add a project contributor | Grant view, issue, comment, or transition permissions scoped to the project |
| Add a read-only reviewer | Grant viewing and comment listing without edit actions |
| Add a project automation | Grant create, update, or attachment powers only where needed |
| Prepare public access | Grant read permissions to the anonymous subject for one project |
Quick grants still produce normal permission grants. You can inspect and revoke them from the Permissions page.
Permissions page overhaul improves visibility and validation
The Permissions page in Organization Settings now serves as the central management surface for grants. Administrators can view grants, add permissions to specific subjects, revoke existing grants, inspect effective permissions, and configure anonymous access.
Scope validation helps keep grants well-formed. When a permission expects a project or template scope, the page can validate that the URN matches the action instead of saving an ambiguous grant.
| Management task | What the page supports |
|---|---|
| View grants | See who has which permissions and scopes |
| Grant access | Choose subject, action, and resource scope |
| Revoke access | Remove grants that are no longer needed |
| Inspect effective permissions | Understand what a subject can actually do |
| Configure anonymous access | Manage public-facing read permissions |
| Validate scope | Prevent mismatched or invalid resource grants |
This is the admin workflow counterpart to the SAR model. You do not need to memorize every tuple to manage access safely, but the tuple remains visible enough to audit.
Anonymous and guest access use the same permission system
Public sharing is built on the same permission model as member access. Pomavo can grant read permissions to a special anonymous identity, sometimes called a sentinel user, so unauthenticated visitors can view approved resources without receiving a real account.
Guest access also fits into the same model. A guest can be represented as an authenticated subject with limited grants, while anonymous access represents unauthenticated visitors.
| Access type | Identity | Typical permissions |
|---|---|---|
| Member | Authenticated organization user | Any grants appropriate to the role |
| Integration | Machine identity with API keys | Programmatic grants for API and MCP work |
| Guest | Limited authenticated user | Project or ticket read and collaboration grants |
| Anonymous | Sentinel anonymous user | Public read grants such as VIEW_ISSUE and LIST_COMMENT |
Because anonymous access is a permission grant, it can be scoped. You can make one project public without making every project public.
Public access should be granted deliberately. Review anonymous grants regularly and avoid wildcard scopes unless the entire resource type is meant to be public.
Middleware distinguishes 401 from 403
Public and guest access depend on clear authentication behavior. Pomavo middleware now distinguishes between unauthenticated requests and authenticated requests that lack permission.
A 401 response means the caller is not authenticated and authentication is required. A 403 response means the caller is known, or treated as the anonymous subject, but does not have permission for the requested action.
| Response | Meaning | User experience |
|---|---|---|
401 | Authentication is missing or required | Show sign-in or request access flow |
403 | Authentication exists but permission is denied | Explain that access is not allowed |
| Public allow | Anonymous subject has the right grant | Render the public resource |
| Guest allow | Guest subject has the right scoped grant | Render the limited workspace view |
This distinction prevents public links from behaving like broken sessions and prevents authenticated users from being sent through unnecessary sign-in loops when the real problem is missing permission.
Search, automation, API, and MCP all respect grants
Pomavo's security model is uniform. UI actions, API requests, query mutations, automations, and MCP tools all run through permission checks instead of relying on separate back doors.
That is especially important for the Query Language, because queries can find many tickets and mutations can affect many tickets. Permissions decide what the caller may read or change.
template = "Bug" and status not in ("Done", "Closed")
order by updated_at desc
limit 50A user or integration running this query still needs permission to view the matching tickets. If the query later becomes a mutation, the caller also needs the relevant edit, transition, link, comment, or attachment permission.
| Entry point | Permission behavior |
|---|---|
| UI | Actions and sections are gated before use |
| REST API | Controllers and services enforce specific actions |
| Query mutations | Matched tickets still require allowed operations |
| Automations | Background work carries organization and subject context |
| MCP tools | The assistant acts as its machine identity |
Multi-tenant isolation remains the boundary
Every permission check happens inside an organization context. Pomavo establishes tenant context at the edge of the request and threads it through the API, search index, worker jobs, and automation engine.
This means a grant is not just about action and resource. It is also bound to the organization where it was issued. A user, guest, anonymous visitor, or integration cannot use a grant from one tenant to read or write another tenant's data.
| Layer | Tenant behavior |
|---|---|
| API | Requests carry organization context |
| Search | Indexed data is scoped by organization |
| Jobs | Background work preserves the originating tenant |
| Automation | Executions run with tenant and subject context |
| Plugins | Sandboxed extensions receive scoped context |
Next, this permission foundation makes it easier to add more public and partner workflows while keeping least privilege visible and auditable.