Skip to content

Label-scoped artifact grants

Enterprise accounts can assign a reviewer or agent access to transcripts and documents with specific artifact labels. The feature is off by default. It requires a core version that supports artifact read predicates and request guards. An older installation shows the control but refuses enablement and reviewer assignment until the core submodule is updated.

In Settings > Users > Artifact read grants, enable the account setting, select a user, managed agent or API key by its ID, enter the exact site label, and select Transcripts and/or Documents. Grant management requires manage_users, manage_agents, and search_session_content; changing the account setting requires manage_account and search_session_content. No account-wide grant or public MCP management tool is provided.

Assign the Works council reviewer system role (works_council_reviewer) through Manage roles. A reviewer can read the session list's metadata and matching artifacts. The role is a restrictive ceiling, including when inherited from a team or combined with another role. It does not permit writes, agent control, model inference, MCP invocation, session content search, timelines, or evidence exports. Existing API keys and OAuth credentials remain subject to this ceiling. Session metadata may describe other sites; artifact content, search results, counts and facets are label-filtered.

Grant shape and matching

The account metadata stores explicit subjects under artifact_grants, for example:

{
  "artifact_grants_enabled": true,
  "artifact_grants": {
    "users": {
      "00000000-0000-0000-0000-000000000001": {
        "artifact_read_scope": {
          "labels": {"site": ["north"]},
          "kinds": ["transcript", "document"]
        }
      }
    }
  }
}

Labels use exact, case-sensitive string matching. Different label keys must all match; any permitted value of each key may match. Kinds also must match. Applicable user, key and managed-agent scopes intersect. Empty or malformed scopes deny all. Reviewer accounts without an assigned scope see no artifacts. There is no wildcard, label inheritance, or cross-account hierarchy access.

Managed-agent and API-key assignments also write tool_grants["artifact_search.account_scope"] in the existing subject governance store. This allows account-scope artifact search, narrowed by the assigned predicate. Ordinary subjects without artifact grants keep their existing behavior. A grant never changes account membership or bypasses session-bound credentials.

Revocation and audit

Revoke stores artifact_read_scope: null and refuses account-scope tool search for the subject. The explicit deny is retained so ambient access or another grant cannot restore visibility. The next read after the transaction commits uses the new database state, without a governance cache. Reads already in flight may finish; downloaded bytes cannot be recalled.

Revocation remains available while the feature is disabled or core has been rolled back. A revoked assignment stays denied when the feature is re-enabled.

Disabling the account setting hides artifacts from assigned subjects and reviewers. Re-enabling restores unrevoked assignments. Unrelated governance writes preserve the grant bucket and the known account-scope tool grant.

Grant creation, revocation and setting changes write audit rows in the same transaction as the change. Each returned artifact is audited with its ID, labels, kind and authenticated subject. An audit failure prevents disclosure. Hierarchy-aware reads are deferred; all reads remain within one account.

The core policy resolver uses None only for an unassigned subject. An empty list denies all; assigned scopes intersect and malformed scopes deny all. Artifact text in session-search results follows the same label predicate.

Administrators can remove reviewer role assignments even while the feature is disabled or core has been rolled back. New assignments still require enablement.

A direct account owner who also holds the reviewer role can recover with DELETE /api/v1/users/me/reviewer-role using their existing authenticated session. This removes only their direct reviewer assignment and their own memberships in reviewer teams; it leaves other users, team roles and unrelated memberships unchanged. Recovery is audited and works while the feature is disabled or core has been rolled back. Non-owner reviewers cannot use this path.