Skip to content

Limits & quirks

This page collects the rules that are intentional but not always obvious from the UI. If you hit something surprising, it’s probably listed here.

Division-level analytics (engagement, violations, acknowledgement rates) only display when the Division has at least 5 assigned users. Smaller Divisions are hidden entirely; a footer note says how many teams were suppressed.

Why: violation and engagement metadata must remain non-user-linkable per our public privacy commitment. With fewer than 5 people in a group, summary statistics can effectively identify individuals.

In practice:

  • A tenant with a 3-person “Legal” Division won’t see that Division in team analytics until it grows.
  • Reorgs that drop a Division below 5 retroactively hide that Division’s metrics.
  • Tenant-wide rollups (KPIs, Top Policies table, by-Area and by-Severity charts) always display regardless of team size.

The threshold is hard-coded, not configurable. See Privacy & the 5-person floor.

Analytics events do not carry a userId. You cannot ask “who triggered violation X?” — the data model does not support that question, by design.

The Export CSV button on the Analytics dashboard produces a comprehensive CSV covering all policies in the current date range. PDF export and scheduled email reports are not shipped.

The dashboard re-fetches every minute. Violation events are written synchronously, so the round-trip from “user dismissed a violation” to “the dismiss count ticks up on the dashboard” is typically well under a minute.

Policies shorter than 10 characters of body text can’t be saved. Intentional — a 3-word policy is unlikely to be a real policy.

No body maximum, but very long policies get slow

Section titled “No body maximum, but very long policies get slow”

There’s no hard maximum on body length. In practice, policies over ~50 KB of body text start to slow down violation detection in the extension. Split very long policies into multiple related policies in the same Policy Area.

Confidence slider: 0–100% displayed, 0–1 stored

Section titled “Confidence slider: 0–100% displayed, 0–1 stored”

The editor shows a 0–100% slider (in 10-percent steps) for the confidence threshold. Internally this maps to a 0.0–1.0 value. Don’t be thrown by the API or a CSV export showing 0.8 where the UI said 80%.

Severity: 1–5 in UI, 1–10 in analytics

Section titled “Severity: 1–5 in UI, 1–10 in analytics”

Policy severity is set 1–5 in the editor. Analytics buckets severity 1–10 (leaving room to expand the scale). Values above 5 appear in analytics today only as residue from older policies or imports.

If you leave the title blank, InPolicy auto-extracts the first ~12 words of the body as the title. This is convenient for imports but sometimes produces awkward titles — override manually for anything you’ll keep.

Every publish triggers an async embedding job (used for violation detection). Rapid publish → edit → publish → edit cycles can leave the extension briefly unaware of your latest changes. Typically resolves in under a minute.

Editing or re-publishing a policy does not require anyone to re-acknowledge it. Acknowledgement workflows are not shipped in the current release.

PDF, DOCX, TXT. Larger files fail to upload. Split externally.

If the PDF is a scanned image without an OCR text layer, parsing cannot extract any text. Run it through an OCR pass first.

The daily-rescan watch mode fetches the URL server-side with no cookies or credentials. Auth-gated URLs (internal wikis, Notion pages, Google Docs) cannot be watched.

Dismissed suggestions stay dismissed across rescans

Section titled “Dismissed suggestions stay dismissed across rescans”

Content-hashing plus dismissal state means a suggestion you dismissed won’t resurface on re-scan even if the source still contains the matching text. If you change your mind, restore it from the Dismissed section at the bottom of the Inbox.

The extension is Manifest V3 Chrome. Edge untested. Firefox and Safari are not planned.

Text is only checked 800ms after you stop typing. Fast typers won’t see flags until they pause.

You’ll stay signed in for up to 30 days of continuous use. Explicit sign-out or account deactivation kills the next refresh, so the session ends when the access JWT next expires (within 7 days, often sooner if the extension refreshes ahead of schedule).

Chrome profiles are independent. Sign in once per profile you use.

Even on a red-severity violation, the extension does not prevent you from sending or submitting. It displays a card — acting on it is your choice.

Well-known password-manager bundle IDs and password-typed inputs are never observed. This is built-in and the defaults cover most cases.

Invitation tokens expire in 7 days, single-use

Section titled “Invitation tokens expire in 7 days, single-use”

After 7 days, the link shows “invitation expired” and the admin must resend. Each token is single-use.

No scheduled or automatic sync. Re-run an import by hand when your directory changes.

Policy Leads, Policy Editors, and Users cannot see the Users page. Role management is centralized.

Policy area-level role scoping is fully supported

Section titled “Policy area-level role scoping is fully supported”

Policy Lead and Policy Editor roles can be scoped to specific Policy Areas from a user’s page via the Add role to Policy Area button — a user can hold different roles in different areas. See Per-area role scoping for the full model.

The /settings page is a placeholder. No payment processing is live. Do not treat any “subscription” or “plan” messaging as functional.

When adding a new entry:

  1. Lead with the rule in plain English (a sentence a customer success rep could read aloud).
  2. Explain why the rule exists — a legal constraint, a technical limit, a deliberate product choice.
  3. Describe what the user will actually see when they hit it, so support can recognize the symptom.