-
Notifications
You must be signed in to change notification settings - Fork 486
spec: Content Analytics Mode (persist/read-only) for issue #37521 #37540
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
jcastro-dotcms
wants to merge
7
commits into
main
Choose a base branch
from
issue-37521-content-analytics-mode
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+231
−0
Open
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
eb0ee36
spec: Content Analytics Mode (persist/read-only) for issue #37521
jcastro-dotcms 0dd4eeb
Merge branch 'main' into issue-37521-content-analytics-mode
jcastro-dotcms 5159ed4
spec: address review feedback on Content Analytics Mode spec
jcastro-dotcms 91a8771
Merge remote-tracking branch 'origin/issue-37521-content-analytics-mo…
jcastro-dotcms 9c74ca9
spec: resolve enforcement-point and Experiments scope gaps
jcastro-dotcms 34c0c56
spec: address clustering, load-bearing-assumption, and measurability …
jcastro-dotcms 1edeea7
Merge branch 'main' into issue-37521-content-analytics-mode
jcastro-dotcms File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,231 @@ | ||
| # Feature Specification: Content Analytics Mode (Persist / Read Only) | ||
|
|
||
| **Feature Branch**: `37521-content-analytics-mode` | ||
|
|
||
| **Created**: 2026-09-14 | ||
|
|
||
| **Status**: Draft | ||
|
|
||
| **Type**: New Feature | ||
|
|
||
| **Input**: User description: "Specification work for ticket: https://github.com/dotCMS/core/issues/37521" | ||
|
|
||
| ## Clarifications | ||
|
|
||
| ### Session 2026-09-14 | ||
|
|
||
| - Q: Should changing Analytics Mode be recorded in an audit/activity log? → A: No special audit trail — matches existing Content Analytics app config save behavior (no App config field in dotCMS currently gets a dedicated audit-log entry on save). | ||
|
|
||
| ## User Scenarios & Testing *(mandatory)* | ||
|
|
||
| ### User Story 1 - Stop an instance from persisting analytics events (Priority: P1) | ||
|
|
||
| A customer runs a non-production dotCMS instance (e.g. UAT) that currently sends analytics | ||
| events into the same shared analytics dataset as their Production instance. They want to stop | ||
| that instance from writing data — without creating dedicated users or roles in Production, and | ||
| without anyone else's data being affected. | ||
|
|
||
| **Why this priority**: This is the entire reason the feature exists — it replaces a much more | ||
| complex cross-environment access model (epic #37349) with a single per-instance switch. Without | ||
| this story there is no feature. | ||
|
|
||
| **Independent Test**: On an instance already configured for Content Analytics, set Analytics | ||
| Mode to "Read Only", perform a tracked action (e.g. view a page), and confirm no new event | ||
| reaches the Content Analytics infrastructure while existing dashboard data for that | ||
| tenant/project is still visible. | ||
|
|
||
| **Acceptance Scenarios**: | ||
|
|
||
| 1. **Given** an instance configured for Content Analytics with Analytics Mode set to "Read & | ||
| Write", **When** an admin changes Analytics Mode to "Read Only" and saves, **Then** the | ||
| instance stops sending analytics events from that point forward. | ||
| 2. **Given** an instance with Analytics Mode set to "Read Only", **When** a site visitor | ||
| triggers a trackable action, **Then** no analytics event for that action is sent to the | ||
| Content Analytics infrastructure. | ||
| 3. **Given** an instance with Analytics Mode set to "Read Only", **When** an admin changes | ||
| Analytics Mode back to "Read & Write" and saves, **Then** the instance resumes sending | ||
| analytics events without requiring a restart. | ||
| 4. **Given** an instance with Analytics Mode set to "Read Only" whose content is consumed by a | ||
| headless/SPA application through the Content Analytics SDK (not a server-rendered page), | ||
| **When** that application triggers a tracked event, **Then** no event reaches the Content | ||
| Analytics infrastructure — the same guarantee holds for SDK-driven traffic as for | ||
| server-rendered page tracking. | ||
|
|
||
| --- | ||
|
|
||
| ### User Story 2 - Existing customers keep working unchanged after upgrade (Priority: P2) | ||
|
|
||
| A customer already has Content Analytics configured and events flowing today. After upgrading | ||
| to the version that introduces Analytics Mode, nothing should change for them unless they | ||
| deliberately act. | ||
|
|
||
| **Why this priority**: A silent behavior change on upgrade (events stopping without anyone | ||
| choosing that) would be a regression and a support incident. This must hold before the feature | ||
| can ship. | ||
|
|
||
| **Independent Test**: Take an instance with Content Analytics already configured and events | ||
| flowing, upgrade it, and confirm events continue flowing with no configuration change required. | ||
|
|
||
| **Acceptance Scenarios**: | ||
|
|
||
| 1. **Given** an instance that had Content Analytics configured before this feature existed, | ||
| **When** the instance is upgraded, **Then** its Analytics Mode is "Read & Write" and it | ||
| continues sending events exactly as before. | ||
|
|
||
| --- | ||
|
|
||
| ### User Story 3 - Dashboards keep working regardless of mode (Priority: P3) | ||
|
|
||
| An admin on a "Read Only" instance still wants to view that tenant/project's analytics | ||
| dashboards and reports. | ||
|
|
||
| **Why this priority**: Read Only must mean "no ingest," not "no access" — otherwise the feature | ||
| removes value (viewing analytics) instead of just removing risk (unwanted writes). | ||
|
|
||
| **Independent Test**: On an instance set to "Read Only", open the Content Analytics dashboard | ||
| and confirm existing data for the tenant/project renders normally. | ||
|
|
||
| **Acceptance Scenarios**: | ||
|
|
||
| 1. **Given** an instance with Analytics Mode set to "Read Only", **When** an admin opens the | ||
| Content Analytics dashboard, **Then** existing analytics data for that tenant/project | ||
| displays exactly as it would on a "Read & Write" instance. | ||
|
|
||
| --- | ||
|
|
||
| ### Edge Cases | ||
|
|
||
| - Switching Analytics Mode from "Read & Write" to "Read Only" does not delete, hide, or alter | ||
| any analytics events already persisted — it only stops new events going forward. | ||
| - "From that point forward" means no analytics event generated after the mode switch is saved | ||
| is submitted to the Content Analytics infrastructure — any event already queued or in flight | ||
| at the moment of the switch is not retroactively recalled once submission has started, but no | ||
| event generated after the switch is queued or sent. | ||
| - An instance that has never had the Content Analytics app configured shows no Analytics Mode | ||
| input and is unaffected by this feature. | ||
| - Analytics data for a tenant + project is never split or labeled by which environment produced | ||
| it — a "Read Only" instance and a "Read & Write" instance for the same tenant/project | ||
| contribute to (or read) the exact same dataset, with no environment distinction anywhere. | ||
| - An instance that the Platform Team has not enabled for Content Analytics access at all has no | ||
| Analytics Mode to set — that enablement gate is a precondition of this feature, not part of it. | ||
| - An instance running an active Experiment (A/B test) that is switched to "Read Only" stops | ||
| collecting new experiment result data for that instance, for the same reason it stops | ||
| collecting any other analytics data — this is expected, not a defect. | ||
|
jcastro-dotcms marked this conversation as resolved.
|
||
|
|
||
| ## Requirements *(mandatory)* | ||
|
|
||
| ### Functional Requirements | ||
|
|
||
| - **FR-001**: System MUST provide an "Analytics Mode" input in the Content Analytics app | ||
| configuration with exactly two selectable values: "Read & Write" and "Read Only". | ||
| - **FR-002**: System MUST default Analytics Mode to "Read & Write" for every instance that had | ||
| Content Analytics already configured before this feature existed, so no customer's event flow | ||
| changes as a side effect of upgrading. | ||
| - **FR-002a**: System MUST also default Analytics Mode to "Read & Write" when an admin | ||
| configures the Content Analytics app for the first time on an instance that never had it | ||
| configured before — new setups behave the same as upgraded ones; there is no scenario where | ||
| an instance ends up "Read Only" without an admin deliberately choosing it. | ||
| - **FR-003**: When Analytics Mode is "Read & Write", system MUST continue sending analytics | ||
| events to the Content Analytics infrastructure exactly as it does today. | ||
| - **FR-004**: When Analytics Mode is "Read Only", system MUST NOT forward any event to the | ||
| Content Analytics infrastructure's ingest endpoint. Every collection method — dotCMS's | ||
| built-in page/impression/click tracking on server-rendered pages, and the headless/SPA SDK | ||
| used by external applications — always submits events through this same dotCMS instance | ||
| first, never directly from the browser or an external app to the Content Analytics | ||
| infrastructure; gating that one instance-side ingest hand-off is therefore sufficient to cover | ||
| every collection method, with no separate client-side path left ungated. This is scoped | ||
| strictly to Content Analytics ingest traffic — it does not affect any other, unrelated | ||
| telemetry, health-check, or usage-reporting signal the instance emits. | ||
| - **FR-005**: System MUST apply an Analytics Mode change without requiring the dotCMS instance | ||
| to be restarted. On a clustered instance, the change MUST propagate to every node using the | ||
| same cluster-wide cache-invalidation mechanism every other Content Analytics app configuration | ||
| field already relies on — no new propagation mechanism, and no special same-node-only | ||
| guarantee, is introduced for this field. A brief window where a sibling node has not yet | ||
| received the change (matching that existing mechanism's normal propagation delay) is expected | ||
| and acceptable; nodes are not expected to diverge beyond it. | ||
| - **FR-006**: System MUST allow users to view existing analytics dashboards and reports | ||
| regardless of the instance's current Analytics Mode. | ||
| - **FR-007**: System MUST NOT classify, distinguish, or filter analytics data by originating | ||
| environment anywhere in the pipeline — all events for a given tenant and project are combined | ||
| with no environment dimension, superseding the environment-selector approach previously | ||
| proposed in epic #37349. | ||
| - **FR-008**: System MUST accept analytics events without requiring an environment identifier — | ||
| omitting it MUST NOT cause the event to be rejected, reversing the required-environment | ||
| validation introduced under #37407. | ||
| - **FR-009**: System MUST NOT require a dedicated audit/activity log entry for Analytics Mode | ||
| changes — it is saved like any other Content Analytics app configuration field, with no new | ||
| audit trail introduced by this feature. | ||
|
|
||
| ### Key Entities | ||
|
|
||
| - **Instance Analytics Configuration**: A per-dotCMS-instance setting living in the Content | ||
| Analytics app configuration. Holds the Analytics Mode value ("Read & Write" or "Read Only"). | ||
| Only meaningful on an instance the Platform Team has already enabled for Content Analytics | ||
| access. | ||
| - **Analytics Event**: A tracked user/content interaction submitted to the Content Analytics | ||
| infrastructure. Identified by tenant and project; carries no environment identity. | ||
|
|
||
| ## Success Criteria *(mandatory)* | ||
|
|
||
| ### Measurable Outcomes | ||
|
|
||
| - **SC-001**: An admin can change an instance's analytics-persistence behavior end-to-end | ||
| (open configuration, change mode, save) in under one minute, with no deployment or restart. | ||
| - **SC-002**: 100% of instances that were sending analytics data before this change continue | ||
| doing so immediately after upgrading, with zero customer action required — measured by | ||
| comparing each instance's analytics event count for a fixed window immediately before and | ||
| after upgrade and confirming neither drops to zero nor decreases unexpectedly. | ||
| - **SC-003**: An instance set to "Read Only" produces zero new analytics events in the shared | ||
| analytics dataset while retaining full, unchanged access to its existing dashboards and | ||
| reports — measured, on the instance side (since the shared dataset does not distinguish which | ||
| instance contributed a given event, per FR-007), by confirming no outbound event submission | ||
| occurs for any tracked action performed while Read Only is active, and that the same dashboard | ||
| queries return unchanged data before and after the switch. | ||
| - **SC-004**: Customers can control per-instance analytics persistence without creating or | ||
| managing any additional users or roles for cross-instance access — eliminating the operational | ||
| burden the original epic (#37349) set out to avoid. | ||
|
|
||
| ## Legacy Considerations *(dotCMS-specific — mandatory)* | ||
|
|
||
| - **Existing behavior touched**: The Content Analytics app configuration (a dotCMS Cloud | ||
| feature) and the analytics event submission path from a dotCMS instance to the Content | ||
| Analytics infrastructure. This is modern, actively-developed functionality — not legacy | ||
| `com.dotmarketing.*` surface — though the underlying Apps/Integrations configuration framework | ||
| it builds on predates it. Experiments (A/B testing) is a downstream consumer of the same | ||
| dataset (it queries the same analytics data to compute results) and is affected as a | ||
| consequence, though it is not itself modified by this feature. | ||
| - **Backward-compatibility expectations**: Every instance with Content Analytics already | ||
| configured must keep working exactly as before immediately after upgrade (default "Read & | ||
| Write"). The only contract change is relaxing the recently-introduced required `environment` | ||
| parameter on event submission back to optional — no other existing behavior changes. | ||
| - **Known related decisions**: Reverses the required, non-blank `environment` parameter decision | ||
| from epic #37349's 2026-09-09 amendment (formalized in the `dot-ca-event-manager` | ||
| constitution v1.2.0, Principle II, and specced under #37407). The `environment` column already | ||
| added to the ClickHouse schema is left in place, unused, with no migration performed. The plan | ||
| phase will formally consult `dotCMS/platform-adrs` (e.g. ADR-0022) for anything governing the | ||
| Content Analytics app configuration or event-submission contract. | ||
|
|
||
| ## Assumptions | ||
|
|
||
| - The Platform Team's existing mechanism for enabling which instances may access the Content | ||
| Analytics infrastructure at all is unchanged by this feature; Analytics Mode only governs | ||
| persist-vs-read-only behavior on top of that existing gate. | ||
| - "Content Analytics app" refers to the existing per-instance App/Integration configuration | ||
| screen for Content Analytics — this feature adds a field to it, not a new settings page. | ||
| - Read Only is enforced entirely on the dotCMS instance side, at the single point through which | ||
| every event — regardless of collection method — already passes on its way to the Content | ||
| Analytics infrastructure; the infrastructure itself requires no new rejection logic of its | ||
| own for this feature. **This is the assumption the whole feature depends on** — if any | ||
| collection method (present or future) were found to submit events directly to the Content | ||
| Analytics infrastructure instead of through the instance, Read Only would silently leak for | ||
| that path. `/speckit-plan` MUST re-trace the actual ingest path for every current collection | ||
| method (server-rendered tracking and the headless/SPA SDK) against the code at plan time, | ||
| rather than carrying this forward as an unverified assumption, and Acceptance Scenario 4 above | ||
| MUST be covered by a real test, not just server-rendered tracking. | ||
| - Experiments (A/B testing) results are computed from the same Content Analytics dataset this | ||
| feature gates. Setting an instance to Read Only is expected to also stop new experiment | ||
| result data from that instance — this is accepted, not treated as a gap to work around, since | ||
| an instance an admin has deliberately chosen not to persist analytics from cannot | ||
| simultaneously produce live experiment measurements. | ||
| - Users who can already edit the Content Analytics app configuration today are the same users | ||
| authorized to change Analytics Mode — no new permission model is introduced. | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.