You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Observation-class finding, measured while verifying the record-view auditing docs page against the implementation (#9540 / PR #9860). Cheap to lose, and it is exactly the kind of edge a compliance evaluation trips over.
Measurement
The record_views list view — the shipped surface for the read action, reachable in the Setup app under Diagnostics via the Audit Logs entry — declares five columns (packages/plugins/plugin-audit/src/objects/sys-audit-log.object.ts:85):
The record-view writer's buildRow (read-audit.ts) stamps action, created_at, user_id, object_name, record_id, old_value, new_value, tenant_id, and conditionally organization_id and actor. It never stamps ip_address, and ReadAuditEvent carries no field that could — the hook reads session.isSystem, session.userId, session.actor and session.organizationId only.
⇒ ip_address is stamped only on login / logout rows. Because this view filters to action: 'read', the column is empty for every row it can ever show.
Why it might matter, stated narrowly
Nothing is false and nothing breaks: an empty column renders empty. The cost is that the one shipped screen for "who viewed this record" presents an IP column, and an evaluator reading that screen concludes viewer IP is on the trail. It is not, and the docs page in PR #9860 says so positively ("No IP address and no user agent") rather than describing the column — so the page and the screen currently point different directions.
Two honest dispositions
Drop ip_address from the record_views columns. One-line change, makes the screen agree with what the writer produces. Cheapest, and correct if viewer IP is deliberately out of scope for views.
Observation-class finding, measured while verifying the record-view auditing docs page against the implementation (#9540 / PR #9860). Cheap to lose, and it is exactly the kind of edge a compliance evaluation trips over.
Measurement
The
record_viewslist view — the shipped surface for thereadaction, reachable in the Setup app under Diagnostics via the Audit Logs entry — declares five columns (packages/plugins/plugin-audit/src/objects/sys-audit-log.object.ts:85):The record-view writer's
buildRow(read-audit.ts) stampsaction,created_at,user_id,object_name,record_id,old_value,new_value,tenant_id, and conditionallyorganization_idandactor. It never stampsip_address, andReadAuditEventcarries no field that could — the hook readssession.isSystem,session.userId,session.actorandsession.organizationIdonly.⇒
ip_addressis stamped only onlogin/logoutrows. Because this view filters toaction: 'read', the column is empty for every row it can ever show.Why it might matter, stated narrowly
Nothing is false and nothing breaks: an empty column renders empty. The cost is that the one shipped screen for "who viewed this record" presents an IP column, and an evaluator reading that screen concludes viewer IP is on the trail. It is not, and the docs page in PR #9860 says so positively ("No IP address and no user agent") rather than describing the column — so the page and the screen currently point different directions.
Two honest dispositions
ip_addressfrom therecord_viewscolumns. One-line change, makes the screen agree with what the writer produces. Cheapest, and correct if viewer IP is deliberately out of scope for views.afterFindtime needs checking, and the audit: no read/view audit — "who viewed which record" is unanswerable, blocking regulated-industry deals #8992 ruling's MVP scope pins were deliberate, so widening the row is a decision rather than a fix. Note the module header's argument for recording as little as possible about a view.⛔ Deliberately not fixed inside PR #9860 — that is a docs card, and this is a metadata change with a scope question attached.
Refs: #9540 / PR #9860 (where it was measured) · #8992 / PR #9515 (the capability and its MVP scope ruling).