Repository navigation
feat(dashboard): add an Identity section, with Codex and Antigravity accounts - #395
Merged
Merged
Conversation
The account field reached the trail, but nothing showed it. Reading a domain out of raw events is not something a security team does during a case, so the dashboard now has an Identity section. It lists reported accounts as personal or corporate, with their agents, hosts, OS accounts, sessions and detections, backed by GET /api/v1/audit/identity. A detection opens the existing investigation page. An agent that reports nothing is shown as unknown, each with its own reason, so a blank does not read as clean. Coverage counts from an agent's first report, because events recorded before this field existed would otherwise make every agent look partly broken. One domain is one row: only Claude reports an organization, which split the same domain in two. Personal means the domain is on a built-in list of public email providers. Corporate means only that it is not on that list, so somebody's own domain reads as corporate, and the page says so. Look-alikes such as outlook.company.com stay corporate. Codex hook input has no account field, but it names the session file, whose first line carries creator_account_id and creator_user_id. Those arrive as account_id and user_id with source session_meta. They name no domain or address, so Codex accounts sit in their own section rather than being guessed at, and can be matched against an approved list. Only a file under Codex's home is opened, and auth.json is never read. Antigravity stays unknown, because nothing safe to read names it. The schema stays additive. The fingerprint is unchanged at 15846a0915769d4a. No real Codex session has produced these IDs through a live hook yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the newest event Antigravity showed as unknown because its hook input has no account field and an earlier search missed `app_storage.json`. Its `jetski.onboarding.lastLoginUsername` key is not a credential, so the domain now comes from there, labelled `local_config`. Like Claude's file, it means the account last signed in on the machine, and the key can change between versions. Only the Windows path has been run. Claude read as "Partly reporting" because of 23 events from a few minutes when the live hooks sat on another branch, and it would have stayed that way until they aged out of the window. Status now follows the newest event, and the sentence keeps the gap visible rather than hiding it. ZCode stays unknown: no account setting was found, only addresses in conversation content. Its explanation now says that. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"Personal accounts: 1" read as one person when the row is one domain, and "outside any company tenant" was simply false: a Gmail login can belong to an organization, and the maintainer's own row shows one. The totals now say domains, and the note says several people can share one and to review it against the approved list. The top of the page gave five equal cards and a long notice before any evidence. It now leads with personal domains and the approved list, keeps the unknown counts in one visible line, and moves the lesser limits under an expander. "Not verified identity" and the last-sign-in warning stay visible. Columns moved between sections because each table sized itself, which slowed comparison, so they now share fixed widths. A long agent list shows two names and a count, with the rest in the details. Timestamps name their timezone, full IDs have copy buttons, and editing the approved list now confirms that it applied. From an outside design review. Phone layout, search and filters were left out: the page is read on a desktop and holds a handful of rows on one machine. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
#394 put the reported account on the trail, but nothing showed it. This adds an Identity section to the existing dashboard, and adds Codex account IDs and the Antigravity account domain so those two stop being blank.
The maintainer decided on 2026-11-07 to build this as an exception to the feature stop.
What the section shows
Decisions worth checking
core/audit/personal_domains.pycannot be complete, and somebody's own domain reads as corporate. The page says so. Look-alikes such asoutlook.company.comandgmail.com.evil.teststay corporate. This label exists only on the dashboard, and events sent to a SIEM carry the domain alone..jsonlfile underCODEX_HOMEor~/.codexis opened, and nothing past the first line is read.auth.jsonis never touched. The format is not a stable interface, and an ID says nothing about whether an account is personal.jetski.onboarding.lastLoginUsernamein its undocumentedapp_storage.json, labelledlocal_config. It means the account last signed in on the machine, the key can change between versions, and only the Windows path has been run.15846a0915769d4a.Checks
Run from this branch on Windows:
pytest -q: 2251 passed, 7 skippedruff check agentmetry tests: cleanagentmetry benchmark: 0 missed, 0 false positivesNot proven
🤖 Generated with Claude Code