Skip to content

link-entity-taxonomy with basis='reporting' silently renders empty statements (no framework-match validation) #784

Description

@jfrench9

Summary

A tenant can link a custom_ontology / reporting_extension taxonomy as the reporting basis via link-entity-taxonomy (basis='reporting', is_primary=True) and the call succeeds — but it does not drive rendering. The renderer selects networks off Graph.reporting_style_id, never EntityTaxonomy, so the statements render empty with no error.

This is a latent UX trap: it bites whenever someone links a non-rs-gaap taxonomy as the reporting basis (the self-service / custom-framework path). It is independent of, and exists prior to, the post-launch custom-framework work tracked in local/RoboSystems/specs/taxonomy-block-framework-authoring.md.

Impact

Low (latent). No current rs-gaap user hits it; it surfaces as soon as a non-rs-gaap reporting taxonomy is linked. Failure mode is silent-empty — the worst kind: no error, just blank statements.

Environment

Production (code-level; present in all environments, reachable only via the non-standard link path).

Steps to Reproduce

  1. Author an in-graph taxonomy with a non-rs-gaap namespace (a custom_ontology / reporting_extension Taxonomy Block).
  2. Call link-entity-taxonomy with basis='reporting', is_primary=True for that taxonomy — it is accepted (no validation rejects it).
  3. Render the entity's financial statements (e.g. live-financial-statement / a report build).

Expected Behavior

Either the link is rejected (or render fails) with a clear, actionable error — e.g. "this taxonomy has no renderable Reporting Style / framework mismatch" — so the user understands why the statements can't render.

Actual Behavior

The link succeeds and the statements render empty, with no error or diagnostic. The renderer never consults the linked EntityTaxonomy; it walks reporting_style_networks for Graph.reporting_style_id (which still points at the rs-gaap default), and the rs-gaap namespace pins find nothing for the foreign framework.

Error Messages / Logs

(none — that is the bug: empty output, no error raised)

Additional Context

Evidence (verified against source):

  • link_entity_taxonomy checks only entity-exists / taxonomy-exists / dedup on (entity, taxonomy, basis) and clears the prior primary — there is no validation tying basis to the taxonomy's taxonomy_type: robosystems/operations/roboledger/commands/taxonomies.py (link_entity_taxonomy, ~:513-579).
  • basis CHECK ∈ ('reporting','chart_of_accounts','mapping','schedule'), with no taxonomy_type correlation: robosystems/models/extensions/entity_taxonomy.py:57-60.
  • The render path reads graphs.reporting_style_id from the platform DB and joins reporting_style_networks ⋈ structures on (reporting_style_id, statement_type) — it never consults EntityTaxonomy: robosystems/operations/roboledger/reports/network_picker.py:48-101.
  • Compounding factor: the renderer also has ~6 hardcoded rs-gaap namespace pins on its derivation paths (subtotal persistence, NetIncome/PP&E synthesis, cash-flow attribution, close-to-equity, reachability validation), so a foreign-namespace framework renders empty even if Style selection were wired — e.g. robosystems/operations/roboledger/reads/taxonomies.py:934-939 (_CANONICAL_ROOTS).

Suggested fix (small, standalone — does NOT require the custom-framework work): at link time and/or render time, validate that the render target's framework matches the active Reporting Style's framework, and surface a clear "framework not renderable / no matching reporting style for this taxonomy" error instead of returning empty output. A guard rail, not a feature. Same failure class as the reachability "looks fine but the report is empty" traps.

References: local/RoboSystems/specs/taxonomy-block-framework-authoring.md §1, §5, §8 (surfaced during the framework-authoring research).

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions