Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ Because tenancy is enforced at the graph rather than in application predicates,

### Identity & Access

Programmatic access uses `X-API-Key`; the browser apps use short-lived JWTs. How a person *logs in* is a deployment decision — password, WebAuthn passkey, or an enterprise identity provider — published at `GET /v1/auth/providers`, so one frontend build renders whichever posture the backend is configured for.
Programmatic access uses `X-API-Key`; the browser apps use short-lived JWTs. How a person _logs in_ is a deployment decision — password, WebAuthn passkey, or an enterprise identity provider — published at `GET /v1/auth/providers`, so one frontend build renders whichever posture the backend is configured for.

Enterprise SSO (OIDC) and SCIM 2.0 provisioning ship in the repository, off by default — available to any fork without a license gate. Provisioning is link-only: SCIM creates accounts and OIDC only resolves already-provisioned ones, so the identity provider owns the account lifecycle in both directions.

Expand Down Expand Up @@ -341,7 +341,7 @@ pip install robosystems-client

## Documentation

### Documentation
### Technical Documentation

**Getting Started & Platform:**

Expand All @@ -367,7 +367,7 @@ pip install robosystems-client

- [RoboLedger Demo Walkthrough](https://robosystems.ai/docs/technical/roboledger-demo-walkthrough) · [SEC XBRL Pipeline](https://robosystems.ai/docs/technical/sec-xbrl-pipeline) · [Custom Graph Schema](https://robosystems.ai/docs/technical/custom-graph-schema)

### Developer Documentation (Codebase)
### Codebase Documentation

Each package documents itself — read the README for a directory before working in it.

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ dependencies = [
"pandas>=2.3.0,<3.0",
"pyarrow>=24.0.0,<25", # hold: 25 is a fresh major feeding the duckdb/ladybug arrow seams; bump deliberately, paired with icebug 13
"rdflib>=7.0.0,<8.0",
"xbrlkit>=0.18.0,<0.19.0",
"xbrlkit>=0.18.1,<0.19.0",
# External API Integrations
"intuit-oauth>=1.2.0,<2.0",
"python-quickbooks>=0.9.0,<1.0",
Expand Down
11 changes: 5 additions & 6 deletions robosystems/models/api/extensions/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -569,12 +569,11 @@ class ReportBundleDownloadResponse(BaseModel):
"`disclosure_notes`: the XBRL 2.1 zip ships statements only — "
"tenant-authored disclosure notes render on screen and ride the "
"Tavi and holon flavors, but are excluded from this file. "
"The Tavi compiled model carries the statements and notes but has no "
"home for `ib_envelopes` (the per-Network Information Block "
"payloads), `definition_links` (equivalence, general-special, "
"essence-alias and mapping arcs), `reporting_style`, "
"`framework_pins`, `fact_sets` (the FactSet partition and each "
"fact's structure pin) or `filing_lifecycle` (filing status, "
"The Tavi compiled model carries the statements, notes, reporting "
"style and FactSet partition but has no home for `ib_envelopes` "
"(the per-Network Information Block payloads), `definition_links` "
"(equivalence, general-special, essence-alias and mapping arcs), "
"`framework_pins` or `filing_lifecycle` (filing status, "
"supersession, share provenance); all of it rides the holon flavor."
),
)
Expand Down
5 changes: 2 additions & 3 deletions robosystems/operations/serialization/xbrl/tavi.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,12 @@

TAVI_MEDIA_TYPE = "application/json"

# The holon keeps all of it.
# The holon keeps all of it. The reporting style and the fact-set partition
# ride the Tavi as `rs:` properties since xbrlkit 0.18.1.
TAVI_OMITTED_CONTENT: tuple[str, ...] = (
"ib_envelopes",
"definition_links",
"reporting_style",
"framework_pins",
"fact_sets",
"filing_lifecycle",
)

Expand Down
37 changes: 36 additions & 1 deletion tests/operations/serialization/test_tavi_emitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,13 @@ def test_envelope_is_a_compiled_model_scoped_on_the_report() -> None:
@pytest.mark.unit
def test_entity_is_named_under_its_scheme_and_labelled() -> None:
document = _document()
assert document["xbrlModel"]["entities"] == [{"name": "entity:ent_01"}]
# The legal name differs from the name, so it rides as a property.
assert document["xbrlModel"]["entities"] == [
{
"name": "entity:ent_01",
"properties": [{"property": "rs:legalName", "value": "Test Co LLC"}],
}
]
assert _labels_of(document, "entity:ent_01") == {"xbrl:label": "Test Co"}
assert _fact(document, "rs-gaap:Assets")["factDimensions"]["xbrl:entity"] == (
"entity:ent_01"
Expand Down Expand Up @@ -160,6 +166,32 @@ def test_serialization_is_compact_deterministic_and_dispatched() -> None:
assert json.loads(first)["documentInfo"]["documentType"] == DOCTYPE_COMPILED


@pytest.mark.unit
def test_the_reporting_style_and_fact_set_partition_ride_as_rs_properties() -> None:
"""What `omitted_content` no longer names has to be in the file."""
bundle = _bundle()
document = json.loads(serialize_to_tavi(bundle))
model = document["xbrlModel"]
assert document["documentInfo"]["namespaces"]["rs"] == "https://robosystems.ai/vocab/"
assert {"property": "rs:reportingStyle", "value": bundle.reporting_style} in model[
"properties"
]
network_properties = {
p["property"]: p["value"]
for n in model["networks"]
for p in n.get("properties", [])
}
assert network_properties["rs:structureId"] in {"struct_bs", "struct_note1"}
assert "rs:blockType" in network_properties
pins = [
p["value"]
for f in model["facts"]
for p in f.get("properties", [])
if p["property"] == "rs:structureId"
]
assert len(pins) == sum(1 for f in bundle.facts if f.structure_id)


@pytest.mark.unit
def test_description_and_omitted_content_name_what_the_file_lacks() -> None:
assert tavi_description(
Expand All @@ -169,3 +201,6 @@ def test_description_and_omitted_content_name_what_the_file_lacks() -> None:
).startswith("RoboLedger live snapshot (Test Co)")
assert "ib_envelopes" in TAVI_OMITTED_CONTENT
assert "definition_links" in TAVI_OMITTED_CONTENT
# Carried as `rs:` properties since xbrlkit 0.18.1.
assert "reporting_style" not in TAVI_OMITTED_CONTENT
assert "fact_sets" not in TAVI_OMITTED_CONTENT
8 changes: 4 additions & 4 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading