UI Log JSON (json/)
The json/ directory is the log viewer contract.
Bublik’s UI loads these files directly by URL to render the run log tree and per-node log pages.
Data Contract
Node JSON files should conform to the schema maintained in the Test Environment (TE) repository
Files
json/tree.json
- Purpose: navigation index for the UI.
- Key fields:
main_package: filename of the root node JSON (commonlynode_1_0.json).tree: mapping offilename -> entry, where package entries may includechildren(filenames of child nodes).
json/node_*.json
- Purpose: per-node log payload (root package, packages, and tests).
- File envelope (top-level shape):
{
"version": "v1",
"root": [
{
"type": "te-log",
"content": [
{ "type": "te-log-meta", "entity_model": {}, "meta": {} },
{ "type": "te-log-entity-list", "items": [] },
{ "type": "te-log-table", "data": [] }
]
}
]
}
- Blocks:
te-log-meta: entity id/name/result/duration and optional params/verdicts/artifacts.te-log-entity-list: present when the node has child iterations (nested entities for tree navigation). May be omitted when there are no children.te-log-table: hierarchical log rows indata.
Table rows (minimum fields)
Each row in te-log-table.data should include:
line_numberlevelentity_nameuser_nametimestamplog_content
Rows may contain nested children (recursively).
Levels (common)
Typical levels used by the UI:
ERRORWARNINFOVERBPACKETRING
Custom string levels are allowed; MI is commonly used for measurement rows (parents with an MI descendant are expanded automatically).
user_name conventions (recommended)
Common user_name values used in the ecosystem:
TAPI Jumps(main test navigation marker)Step(scenario action)StepPush/StepPop(step nesting)Artifact(artifact/measurement summary rows)Verdict(verdict rows)Self(ordinary lines for the current entity)Run(often used together withentity_name: "Tester"for run-level summary rows)
#Scenario and #Test mapping
The UI detects the main test entity from the first log row where:
user_name == "TAPI Jumps"
The entity_name of that row becomes the main test entity for the page.
How #Test works
#Test shows rows where:
entity_name == <main test entity>
How #Scenario works
#Scenario commonly includes rows such as:
<main test entity>:Step
<main test entity>:Artifact
<main test entity>:Self
<main test entity>:Verdict
Tester:Run
Recommended mapping rules
- Emit at least one row with
user_name: "TAPI Jumps"for each test page where#Scenario/#Testshould work. - Set that row's
entity_nameto the logical main test entity for the page. - Keep ordinary test lines under that same entity with
user_name: "Self". - Keep scenario actions under that same entity with
user_namevalues such asStep,StepPush, andStepPop. - Keep verdict and artifact rows under that same entity with
user_namevalues such asVerdictandArtifact. - Keep run-level summary rows under
entity_name: "Tester"anduser_name: "Run"so they are available asTester:Run. - Keep helper or secondary logs under their real source entities instead of moving everything under the main test entity just to satisfy filters.
Common failure mode
If no TAPI Jumps row is present, the UI may not detect the main test entity,
and #Scenario / #Test can remain disabled or incomplete.