[OPIK-7532] [QA] Proposed taxonomy changes from app surface - #8144
Draft
CometActions wants to merge 1 commit into
Draft
[OPIK-7532] [QA] Proposed taxonomy changes from app surface#8144CometActions wants to merge 1 commit into
CometActions wants to merge 1 commit into
Conversation
Proposed by the nightly taxonomy-discovery job. Draft: the denominator is a reviewed file, so this needs a human decision before it lands.
Contributor
📋 PR Linter Failed❌ Missing Section. The description is missing the ❌ Missing Section. The description is missing the ❌ Missing Section. The description is missing the ❌ Missing Section. The description is missing the ❌ Missing Section. The description is missing the |
Contributor
⏱️ pre-commit per-hook timingNo linted files changed — nothing to run. ⏭️ 44 skipped (no matching files changed)
|
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 join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Proposed by nightly taxonomy discovery
Read the app's route/nav/tab surface and compared it against
taxonomy.yaml.Baseline before this change: 19 areas, 203 functional capabilities.
Taxonomy discovery — proposal
Target:
opik/tests_end_to_end/coverage/taxonomy.yamlDate: 2026-09-04
Measured against
4ef186c6c7— OPIK-8192 [BE] fix: drop undecodable scoring stream messages instead of wedging the stream (#8089)git status --porcelainempty)./surface.json, pre-generated by the caller — 60 routes, 20 nav items, 8 tab components, 1 unmatched surfaceThe single unmatched surface matches the documented baseline exactly
(
/$workspaceName/home, the known borderline). The proposal below thereforecomes not from
unmatched_surfacesbut from the tab diff, whichsurface.pydoes not do for you.1. What changed
One capability added. One line inserted;
git diff --statis1 insertion(+).traces.messages-tab— new,covered: false, no tierEvidence.
The surface.
src/v2/pages-shared/traces/TraceDetailsPanel/TraceDataViewer/TraceDataViewer.tsx:271-277renders a
<TabsTrigger value="messages">Messages</TabsTrigger>, with content at:309-317delegating to a dedicated 281-lineMessagesTab.tsxin the samedirectory. This is not a view/format toggle — it is one of five sibling tabs
in the trace details panel, each rendering different content.
It is the default tab for LLM traces.
TraceDataViewer.tsx:98—const defaultTab = canShowMessagesTab ? "messages" : "details";canShowMessagesTab(:84-96) is content-conditional: true when the trace'sinput or output parses as LLM messages via
detectLLMMessages, and neitherside fails to parse. So for a chat/LLM trace, Messages is the first thing the
user sees on opening the panel.
Its four siblings are all already capabilities; it is the only one missing.
The functional block enumerates the panel's tabs individually rather than
folding them into one entry:
TraceDataVieweropen-trace-panelmanual-feedback-scoreprompts-tabagent-graph-tabThe visual dimension of the same area already enumerates all five
(
taxonomy.yaml:283-288):trace-sidebar-messages,-details,-feedback,-prompts,-agent-graph. So the functional dimension is missing exactly theone tab the visual dimension has. That asymmetry is what this fixes.
Not already covered under another name.
grep -nEi 'message|conversation|llm|chat'over the whole taxonomy returns only: the visual
trace-sidebar-messagesentry,
threads.thread-message-count/thread-level-metrics(a differentarea — the Threads list and the thread panel, not the trace panel),
prompts.create-chat-prompt-ui, and unrelated comments.Not already covered by
open-trace-panel. That capability's only taggedspec is
trace-explore/trace-explore-smoke.spec.ts:48, which assertspanel.inputSection/panel.outputSection/inputValue/outputValue—i.e. the Details tab. Its fixture is a plain
@opik.trackleaf functionwhose I/O does not parse as LLM messages, so
canShowMessagesTabis false andthe Messages tab is not rendered at all in that run. No functional spec
touches it.
Altitude. Placed deliberately adjacent to
agent-graph-tabandprompts-tab— same component, same conditional-tab shape, same granularity.Worth flagging honestly: this makes
tracesthe largest area at 22capabilities, above the 5-15 guide. I judged that the guide's own carve-out
applies (
configurationlegitimately carries 19) —tracesis a genuinelywide surface, and the alternative, folding Messages into
open-trace-panel,would be inconsistent with how the file already models the other four tabs.
If a reviewer disagrees, the right fix is a conversation about all three
*-tabentries, not about this one.cloud_only: not set. The tab is gated by nothing but trace content —no
usePluginsStorecomponent, noFeatureToggleKey. Per the skill's rule,cloud_onlyis omitted entirely rather than written asfalse.2. Coverage arithmetic
Recounted from the file, before and after, per dimension.
rules.cloud_only_separate_viewis true, so the self-hosted denominator (excluding the 2 cloud-only areas and 4
cloud-only capabilities) is shown alongside.
Functional coverage drops 57.6% → 57.4%. That is the point: the Messages tab
has been in the product untested this whole time, and the denominator was hiding
it. Nothing here asserts a new test exists — the entry lands
covered: falsewith no
tier:, forreconcile.pyto fill in if and when a spec is tagged.2b. Rejected surfaces
Everything considered and ruled out, with the evidence that ruled it out.
From
unmatched_surfaces(1 of 1 rejected)/$workspaceName/home→HomePage— rejected: it is a redirect, not a page.src/v2/pages/HomePage/HomePage.tsxis 21 lines whose entire body is auseEffectcallingnavigate({ to: "/$workspaceName/projects", replace: true }),rendering
<Loader />while it does.router.tsx:157labels it in a comment:"home (redirects to the workspace Projects tab)". It has no UI of its own and
no behaviour a test could assert beyond "landing lands on Projects", which is
the existing
projectsarea.This is the
kind: redirectclass the skill says to skip;surface.pyclassified it as
surfacebecause it is implemented as auseEffect+navigatecomponent rather than a
beforeLoadredirect or a*Redirect-named component,which the classifier recognises. Worth a note to whoever next touches
surface.py.Correcting one
surface.jsonfield: it reportshas_nav_entry: trueforthis route. That is a false positive from suffix-matching
/home. The "Home"nav item is
getMenuItems.ts:70→path: projectPath("/home")→ resolves to/projects/$projectId/home→ProjectHomePage, which is a different componentalready owned by the taxonomy (
projectsarea, route/projects/$projectId/home,capability
project-home). The workspace-level/$workspaceName/homehas nonav entry of its own, and
has_api_client: false. Relatedly, thePROJECT_HOMEPAGE_ENABLEDtoggle innav_gating.flags.showHomePagegates thatproject home nav item, not this route.
It does have many inbound links (
SideBar.tsx:13 HOME_PATH, the quickstart<Navigate>s,NoAccessPageGuard, thecometplugin's workspace selectors).That confirms it is a real, load-bearing entry-point URL — it just confirms it as
plumbing, which is exactly why it is not a capability.
From the tab diff (7 of 8 tab components rejected)
unmatched_surfacescovers routes only, so all 8 entries intabswere openedand judged by hand.
TraceDataViewer.tsxopen-trace-panel, feedback→manual-feedback-score, graph→agent-graph-tab, prompts→prompts-taball exist.AgentRunnerEmptyState.tsx:65-75switches oneCodeSnippetbetween two renderings of the same entrypoint. One feature with a switch.CreateDatasetSidebar.tsxdatasets.create-dataset-sdk.AnnotationQueuePage.tsxannotation-queues.queue-configuration-tabexists (covered: false); the items tab is the default content, covered byscore-queue-item/skip-item/score-with-reason.TrialSidebarContent.tsxoptimization-studio.trial-detail(covered) andbest-trial-prompt(covered: false) already span both.PromptPage.tsxprompts.experiments-tabexists, with the note "prompt detail -> Experiments tab". The prompt tab is the default view.DatasetItemsPage.tsxdatasets.view-itemsanddatasets.version-history-viewboth exist.ThreadDetailsPanel.tsxthreads.open-thread-panel,turn-order-io(the messages content) andthread-feedback-scoreall exist. Note this is the thread panel, a different area from the trace panel in §1.From the nav diff (20 of 20 rejected)
All 20
nav_itemsresolve to an existing area: Home→projects.project-home,Opik Connect→
ollie, Logs→traces/threads, Diagnostics→diagnostics,Dashboards→
dashboards, Prompt library→prompts, Agent playground→agent-playground, Prompt playground→playground, Optimization runs→optimization-studio, Test suites→test-suites, Datasets→datasets,Experiments→
experiments, Annotation queues→annotation-queues, Onlineevaluation→
online-evaluation, Alerts→alerts, Workspace/Projects→projects,Configuration→
configuration/workspace-roles. No new area is warranted.3. Removals
None.
I checked the reverse direction as well — every
routes:entry across all 19areas against the 60 routes in
surface.json. One apparent miss, and it is nota removal:
annotation-queuesdeclares/annotation-queues/$id; the app mounts/$workspaceName/projects/$projectId/annotation-queues/$annotationQueueId(
AnnotationQueuePage). The surface is present — only the param is written inshorthand in the taxonomy's informational
routes:field. No edit made;correcting it would add diff noise for zero denominator effect. Flagging it
for a human in case the exactness of
routes:matters to them.No capability's surface is gone from the app, so nothing shrinks the
denominator. (A removal is the one change that raises coverage without a test
being written, so the bar for proposing one is deliberately high, and nothing
met it.)
4. Rename notes for a human
None. No key was renamed and none needs to be — the one addition is new, so
no
@cap:tag is orphaned andreconcile.pyhas nothing to fail on.Two naming observations, offered as notes only, with no action taken:
tracescarriesspec_dir: trace-exploreagainst product vocabulary "Logs".This is already deliberate and documented in the file's own comment. Left alone.
messages-tabsits besideagent-graph-tabandprompts-tab, so the-tabsuffix is consistent within the area — but it is inconsistent with thevisual dimension's
trace-sidebar-*prefix for the same five tabs. Not worthchurning either set of keys over; noted so nobody "fixes" it into a rename.
5. The blind spot
surface.json's owncaveatssays the same thing, and it is visible in thetree:
src/plugins/comet/contains real components (SidebarWorkspaceSelector,UserMenuAppLinks,WorkspaceSelector) that link into routes this sweep cannotenumerate.
nav_gating.plugin_componentslistsAssistantSidebar,SidebarWorkspaceSelectorComponentandsidebarSectionsas plugin-supplied.Two further limits specific to this run, so nobody reads it as exhaustive:
surface.pyunder-classifies redirects. As shown in §2b, auseEffect+navigateredirect component is reported askind: surface. Other suchredirects would also surface as false candidates — and, more importantly, the
reverse error is possible in principle too.
has_nav_entrymatches by path suffix and produced a confirmed falsepositive here (§2b). It is corroboration, not a gate — I judged it by opening
getMenuItems.tsdirectly.Status
No commit, no branch, no PR — as instructed, later steps do that.
The working tree now carries exactly one modified file:
python3 -c "import yaml; yaml.safe_load(...)"→ valid.Why this is a draft
The denominator is a reviewed file — adding a capability lowers coverage
until a test exists, and removing one raises it. Both need a human.
New capabilities land
covered: falsewith notier:;reconcile.pyfills those in once a tagged spec exists.
Run: https://github.com/comet-ml/comet-automation-tests/actions/runs/33839963538