One sorting dimension (company size, deployment, price tier) that frames the question without fixing the answer.
A classification axis is a single dimension along which entities get sorted: company size, product maturity, deploymentDeploymentEngineeringA deployment eventView reference → model, price tier. It defines the question ("how big is the company?") without committing to any one answer.
The axis comes from positioningPositioningGo-To-MarketProduct positioning statementView reference → theory and the perceptual map. Al Ries and Jack Trout's *Positioning: The Battle for Your Mind* (1981) made the case that a brand occupies a coordinate in the customer's mind, which presumes dimensions to be positioned along. Those dimensions are classification axes.
The rigorous version is older, drawn from psychometrics. Perceptual mapping borrows multidimensional scaling and factor analysis, developed in the 1950s and 1960s by researchers such as Warren Torgerson and Joseph Kruskal. The technique derives the axes statistically from how customers rate similarity between brands, rather than letting a strategist assert them. The map then shows distance as perceived interchangeability: brands close together are seen as substitutes.
The popular form collapsed all this into the 2x2: two axes, four quadrants, every competitorCompetitorMarket IntelligenceA competing product or companyView reference → placed. Convenient, and easy to rig. The same companies rearrange depending on which two axes you pick, and the temptation is to choose the pair that puts you alone in the top-right. The honest practice treats axis selection as the real analytical work, choosing dimensions that buyers care about and that genuinely discriminate.
A team mapping the project-management market starts with the lazy pair, price against featuresFeatureProduct SpecificationA product capability or featureView reference →, and learns nothing: everyone clusters in a diagonal smear. They switch axes. The first becomes deployment model, from self-serve to sales-assisted. The second becomes target team size, from solo through enterprise.
Now the field separates. One cluster is self-serve and built for small teams; another is sales-led and enterprise-only; a sparse top-left, self-serve but enterprise-grade, holds two players and a gap. The axes did the work. The same competitors that looked identical on price-versus-features now sit in distinct regions, and the empty quadrant is a positioning opportunityOpportunityDiscoveryA validated gap worth solvingView reference → the team can argue about with evidenceEvidenceValidationData supporting or refuting a hypothesisView reference →.
In the Unified Product Graph, a classification axis is the dimension node of a taxonomy, and it hangs off whatever owns that taxonomy. A Productdimensioned byClassification Axishierarchy edge makes it a product-wide axis; product_dimensioned_by_classification_axisCompetitive Analysisdimensioned byClassification Axishierarchy scopes it to a single analysis. Until 0.32.0 only the second existed, and an axis whose only possible parent was a competitive analysis read as a positioning device rather than the general grouping mechanism it is. The product parent is what lets one axis serve the whole graph. Below it, competitive_analysis_dimensioned_by_classification_axisClassification AxisincludesClassification Valuehierarchy enumerates the discrete positions along it, and nodes take a position through the polymorphic node_classified_as_classification_value edge. Separating the axis from its values, as two node types joined by an edge, lets the graph reuse one axis everywhere and classify competitors, segments, and personasPersonaUserAn archetype representing a user segmentView reference → against the same shared scale, so a "company size" axis means the same thing wherever it appears.classification_axis_includes_classification_value
Worked example: Trellis
Two classification axes separate the competitive field for Trellis: generation approach (freeform code output versus a structured, inspectable system) and governance (ungoverned versus previewed and human-approved). Each axis is a distinct dimension, meaningful only because it connects to a real needNeedUserA user need, pain, desire, or constraintView reference →, the need for governed autonomy that Nora names and that the Safe Change featureFeatureProduct SpecificationA product capability or featureView reference → addresses.
Type-specific fields on BaseNode
axis_kindenumStructural kind of values on this axis. `categorical` = discrete, unordered (most common; CMS architectures). `ordinal` = discrete, ordered (maturity tiers, T-shirt sizes). `continuous` = numeric range (latency budget, price points).
cardinalityenumHow many values a subject may hold on this axis at once. `single` (the default) means re-classifying SUPERSEDES the prior value; `multi` means it ADDS one.
Under `single` the classify writer retires the old same-axis edge and records the move in the reclassification history, so the change is traceable rather than silent. `multi` suits an axis like "supported frameworks", where holding several values at once is the truth. A separate axis from `axis_kind`: an axis can be `categorical` (unordered) yet single-select, or `categorical` yet multi-select. The two answer different questions and neither implies the other.
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
4 edge types connected to this entity.
product_dimensioned_by_classification_axiscompetitive_analysis_dimensioned_by_classification_axisclassification_axis_includes_classification_valueclassification_axis_owned_by_product