Skip to content

Company structure and financial class rules

Status: implemented in PR #766; local performance and consumer conformance gates pass; release is pending Date: 2026-09-13 Authority: the owner delegated the choice of approach on 2026-09-13.

Decision

Publish evidence-based classifications with an explicit rule version and an explanation of each match. Missing evidence remains unknown. A classification can be true, false, or unknown independently of the other classifications. These are collection-owned, deterministic read predicates. They are not credit scores, investment advice, an award register, or an inferred legal opinion. The limits below are product choices, not limits attributed to Lasso or to a public authority.

This decision makes a narrow exception to the charter's exclusion of product analysis: these fixed predicates run in collection because #615 requires server-owned search and exact counts. The charter is amended with this ADR. Other analysis and product decisions remain outside collection.

Holding company

Scope is_holding to registered holding activity. Use the current main and secondary CVR industries with their declared classification version:

Classification Holding industry codes
DB07 642010, 642020, 642030
DB25 642110, 642120, 642130

True means at least one current industry is in the applicable set. False requires a complete, readable current industry collection with a known classification version and no matching code. Missing or conflicting data is unknown. Do not infer the classification version from the code alone.

The company name, an ownership edge, and a keyword in its purpose are not sufficient. An operating company can own another company. Conversely, a registered holding activity can remain recorded while ownership data is incomplete. The public label must be “Registered holding activity”, so the boolean does not claim that every legal holding arrangement is identified.

Group roles

group_role is a set: parent, subsidiary, and independent. Parent and subsidiary may both apply to the same company. There is no priority order.

Use current registry evidence of majority voting control between legal entities. A link qualifies when all possible values in the source's stated voting-right interval exceed 50%. Exactly 50%, an interval crossing 50%, or an unknown value does not prove majority control. Preserve the source's interval boundaries and units. Do not substitute capital ownership for voting rights or infer control from a person's role.

A company with a qualifying outgoing link is a parent; one with a qualifying incoming link is a subsidiary. Follow qualifying control links for indirect relationships, preserving the path. Do not multiply ownership percentages: control through a chain is different from economic ownership. A cycle or contradictory direct controlling-parent evidence makes the affected component unknown until corrected. A contradiction includes overlapping assertions of more than 50% direct voting control by different entities, or conflicting current intervals for the same direct relationship. Multiple indirect ancestors in a valid chain are expected and are not a contradiction. An unresolved legal entity keeps its registry identity and can still establish the target's subsidiary role if its voting control is proved; it must not be discarded because its CVR row is absent.

independent means no observed group link in a declared complete registry coverage snapshot. It requires complete incoming and outgoing coverage, with no unresolved control assertions. Its public label is “No registered majority-control link”. An empty local edge query is not enough. Other forms of legal control are outside this stated scope. Companies owned by natural persons do not acquire a company parent from those ownership records.

Four financial classes

Use the public labels and identifiers below. Replace the requested Gazelle and cash-cow labels before publication: our data does not establish receipt of the Børsen award or the market-share position in the BCG definition.

Let CA be current assets, CL short-term liabilities, C cash, E equity, P annual result, and GP gross profit. Monetary comparisons require the same entity, statement scope, currency, and compatible fact periods.

Identifier and public label Rule
high_growth — High gross-profit growth Four consecutive comparable annual periods. The first GP is at least DKK 500,000. GP rises in each following period, and the final GP is at least twice the first. All four GP values must be in DKK; no currency conversion is inferred.
liquid — Current assets cover short-term liabilities In the latest eligible annual statement, CL > 0 and CA >= 1.5 * CL. If CL = 0, require CA > 0. Both values must be nonnegative. CA = CL = 0 is unknown.
profitable_cash_rich — Profitable with cash coverage Positive annual result in each of the latest two consecutive comparable annual periods. In the latest period, E > 0, C > 0, CL >= 0, and C >= CL.
financially_challenged — Negative equity or a loss with a current-asset shortfall In the latest eligible annual statement, E < 0, OR all of P < 0, CA >= 0, CL > 0, and CA < CL.

The 50% liquidity buffer reduces borderline matches. The two-year profit requirement excludes a single profitable year from the cash-rich class. The cash coverage test measures the balance sheet, not operating cash flow. The challenged class identifies a stated accounting condition; it does not predict insolvency or replace a credit assessment.

The classes can overlap. A company with negative equity and enough current assets can be both liquid and financially challenged. OR applies within a selected set of classes; AND applies across different filter keys.

Evidence, time, and unknown values

Use only a company's own annual statement. Do not substitute group totals, segment facts, comparative columns from another period, or mixed contexts. The latest annual filing is selected by period end, then publication time, then load ID, using the established deterministic order. Never skip a newer unreadable annual filing to make an older classification look current.

An eligible annual period ends one calendar year minus one day after its start, as in ADR-0022. Consecutive periods meet without a gap or overlap. The latest period end must not be in the future and must be no more than 18 calendar months before the evaluation date in UTC. This is a product freshness limit, not a statement about statutory filing deadlines.

Retain fact-level evidence for every input: report and load identifiers, entity, scope, unit/currency, fact period, and source locator. A numeric column alone does not prove that two values can be compared. Retain the original fetch time, evaluation date, rule version, inputs, and reasons. Re-extraction does not extend source freshness.

Use three-valued logic. For an OR rule, one proved true branch is sufficient; false requires every branch to be proved false. For an AND rule, one proved false condition is sufficient; true requires every condition to be proved true. Remaining cases are unknown. No unknown value becomes zero or false.

Publication and delivery

Compute the classifications when source data changes and publish them with the source revision. Re-evaluate effective dates and financial expiry at the UTC date boundary. Search and facets must use the same publication version. A facet ignores its own selected values, applies all other keys, and counts each CVR once per value. A multi-role company may appear in both role buckets.

Use a set-based classification projection and count queries. Do not add one financial-history query or recursive graph traversal per company to a search request. Measure the complete query at the 2.26-million-company fixture before claiming the requested p95 of at most 500 ms. Update the registered sales consumer and pass its live Contract conformance suite before release.

PR #766 adds explicit industry versions, legal-entity voting intervals and coverage, and fact-level financial context for every class input. It publishes stored classifications with their source revision. Existing rows require a normal CVR refresh or financial re-extraction; missing evidence stays unknown. No compatibility fallback is permitted. The complete index in #770 meets the 500 ms p95 target across all eight measured contexts at 2.26 million companies with populated control and financial evidence. All six sales conformance tests pass against these migrations (consumer PR #189, issue #190). Consumer CI must pass against producer main after the producer contract is merged. See the recorded measurements.

Sources and alternatives

  • Virksomhedsguiden: holdingselskab explains the ownership purpose of a holding company. The industry-based predicate above is a narrower, observable product definition.
  • Statistics Denmark: DB07 and DB25 supply the classification-specific holding codes.
  • Erhvervsstyrelsen: company groups and controlling influence discusses majority voting rights and other bases for control. The product uses the stated majority-voting scope rather than claiming all legal control.
  • Børsen Gazelle is the award source. Its criteria page could not be retrieved during this review. The high-growth rule is our own definition, not a claimed copy.
  • BCG: growth-share matrix bases cash cows on market share and market growth. Balance-sheet cash and profit cannot establish that market position, so use the explicit cash coverage label instead.

Name matching and unversioned industry codes would be easier but could give false holding results. Capital shares would reuse the current graph but would silently change the meaning of control. One exclusive financial label would hide valid combinations. All three alternatives are rejected.