{"schemaVersion":"1.0","product":{"name":"sporttech.io J3 OVS","description":"Event, scoring, start-list, scoreboard, and results server for gymnastics and related sports."},"runtime":{"version":"v0.8-1905-g33f28bb15","app":"TRA","rulesCode":"TRA.FIG.2022.2026-06-27","apiBase":"/api"},"metadataSources":[{"id":"runtime-generated","description":"Discovered from the live urest resource/model graph at server startup.","trust":"Best source for entities, endpoints, methods, fetch flags, and registered route availability."},{"id":"code-derived","description":"Generated or maintained next to backend code from gogen annotations, AddAction registrations, constants, or export formatting.","trust":"Best source for machine-readable backend mechanics when runtime discovery cannot expose item-level details."},{"id":"curated","description":"Developer-maintained backend metadata that clarifies parameters, effects, deprecations, and examples.","trust":"Best source for practical usage details; verify high-risk mutations against runtime availability and permissions."},{"id":"manual","description":"Static general guidance maintained by developers for API principles and common field semantics.","trust":"Useful for orientation; prefer generated/code-derived entries for exact current model shape."},{"id":"external","description":"Human task recipes in external skill repositories.","trust":"Use for federation/task-specific workflows after reading this built-in machine reference."}],"recommendedWorkflow":{"source":"curated","description":"Recommended preparation and execution order for every OVS task.","steps":[{"id":"read-machine-reference","instruction":"Read the current server's /api/ai document before planning requests. Treat runtime-generated and code-derived metadata as the source of truth for available entities, fields, methods, actions, parameters, and constants.","required":true},{"id":"select-external-skill","instruction":"Use skillSources to find and read the relevant external skill pack for federation-specific or task-specific workflow rules.","appliesWhen":"A relevant source or recipe is listed in skillSources.","required":true},{"id":"load-canonical-helpers","instruction":"Load the canonical scripts and helpers referenced by the selected workflow. Resolve one exact repository revision and do not combine files from different revisions.","appliesWhen":"The selected workflow references canonical scripts or helpers.","required":true},{"id":"inspect-helper-interface","instruction":"Inspect each canonical script or helper interface, including its --help output when available, before preparing commands or data.","appliesWhen":"Canonical scripts or helpers will be used.","required":true},{"id":"prepare-workflow-draft","instruction":"Follow the selected workflow to prepare the next draft, including planned requests, interpreted input data, and expected effects.","required":true},{"id":"execute-approved-step","instruction":"Execute a workflow step only after any confirmation required by that workflow has received explicit approval.","required":true},{"id":"verify-result","instruction":"Refetch affected resources after mutations and verify the resulting server state against the approved draft.","required":true}],"approvalPolicy":{"draftBeforeConfirmation":true,"waitForExplicitApproval":true,"instruction":"Before every workflow-defined confirmation point, show the draft for that step and wait for explicit approval. Do not treat approval of an earlier step as approval of later checkpoints."}},"principles":[{"id":"entity-maps","description":"Most collection responses are JSON objects keyed by numeric IDs. Linked fields usually contain numeric IDs or arrays of IDs.","examples":["Athletes[\"254\"]","Stages[\"12\"].Groups"]},{"id":"root-event","description":"The event document is the main graph entry point. Use fetch flags to expand linked collections into the same response.","examples":["/api/event?fetch_event_competitions=true\u0026fetch_competition_stages=true"]},{"id":"partitioned-graph-reads","description":"For large events, read the graph in stages: first fetch competitions and stages from the event, then fetch only the selected stage IDs with deeper group/performance/athlete expansions.","examples":["/api/event?fetch_event_competitions=true\u0026fetch_competition_stages=true","/api/stages/{stageID}?fetch_stage_groups=true\u0026fetch_group_performances=true\u0026fetch_performance_athletes=true"]},{"id":"graph-links","description":"Common event graph links are Competition.Stages -\u003e Stages, Stage.Groups -\u003e Groups, Group.Performances -\u003e Performances, and Performance.Athletes -\u003e Athletes.","examples":["Competitions[id].Stages","Stages[id].Groups","Groups[id].Performances","Performances[id].Athletes"]},{"id":"avoid-full-event-expansion","description":"Avoid expanding all groups, performances, and athletes for the whole event unless the event is known to be small. Prefer partitioned reads by competition, stage, or another selected subset.","examples":["Avoid broad event reads with fetch_group_performances=true and fetch_performance_athletes=true when only one stage is needed."]},{"id":"collections","description":"Collections live under plural endpoints. A trailing slash addresses the collection; a numeric suffix addresses one entity.","examples":["/api/athletes/","/api/athletes/254"]},{"id":"reference-constants","description":"Use constants returned by /api/ai instead of hard-coded numeric or string values. Constants include common values such as SexNames and model-specific values such as CompetitionTypes or StageKinds when available.","examples":["Constants.CompetitionTypes.TRA","Constants.StageKinds.Final2","Constants.SexNames.S_MALE"]},{"id":"created-location-id","description":"Successful collection POST requests return HTTP 201 with Location pointing to the created resource. Use the last path segment as the new numeric ID.","examples":["Location: /api/competitions/26","competitionID = 26"]},{"id":"post-resource-action","description":"REST command actions are POST requests on an existing resource path with the action name as the final path segment. Action parameters are usually query/form fields.","examples":["/api/stages/65/draw?seed=123"]},{"id":"action-status","description":"Actions can be marked available, deprecated, or disabled. Do not call deprecated or disabled actions unless the notes explicitly say the legacy behavior is required; prefer the replacement when present.","examples":["Actions[id].deprecated","Actions[id].replacement"]},{"id":"field-formatting","description":"Some API fields store internal units. Use fieldFormats to convert values for display instead of guessing from field names.","examples":["Performance.MarkTTT_G 63110 -\u003e 63.110"]},{"id":"field-docs","description":"Use fieldDocs for developer-maintained semantic hints about fields. They explain purpose, read/write conventions, constants, and caveats; exact entity and field names are generated from code.","examples":["fieldDocs[].entity","fieldDocs[].field","fieldDocs[].writeFormat"]},{"id":"import-formats","description":"CSV/XLSX participant import is described in importFormats. Use importFormats for header names, required columns, parsers, defaults, workflow effects, and examples.","examples":["importFormats[id].entities[].columns","importFormats[id].workflows"]},{"id":"streaming","description":"GET requests can be used as event-source streams by sending Accept: text/event-stream. This is useful for live scoreboards."}],"auth":{"tokenEndpoint":"/api/access_tokens/","headerFormat":"Authorization: token \u003cuuid\u003e","roles":["observer","oc","judge","scoreboard","marshal","inquiry_officer","session_manager"],"example":{"method":"POST","path":"/api/access_tokens/","body":{"Password":"\u003cpassword\u003e","Role":"oc"}},"notes":["GET endpoints are usually public on local event servers.","Mutation requests require a role with the needed permissions."]},"methods":[{"method":"GET","purpose":"Read one resource or a collection. Add fetch_* query flags to expand linked resources.","authRequired":false,"example":{"method":"GET","path":"/api/event","query":["fetch_event_competitions=true","fetch_competition_stages=true"]}},{"method":"POST","purpose":"Create a child resource in a collection or call a command endpoint.","authRequired":true,"example":{"method":"POST","path":"/api/performances/","headers":{"Authorization":"token \u003cuuid\u003e"},"body":{"ParentID":123}}},{"method":"PATCH","purpose":"Update fields on an existing resource.","authRequired":true,"example":{"method":"PATCH","path":"/api/athletes/254","headers":{"Authorization":"token \u003cuuid\u003e"},"body":{"ExternalID":35628}}},{"method":"DELETE","purpose":"Delete an existing resource when the resource supports deletion.","authRequired":true,"example":{"method":"DELETE","path":"/api/performances/123","headers":{"Authorization":"token \u003cuuid\u003e"}},"notes":["Delete only after verifying backlinks and event state."]}],"model":{"app":"TRA","rulesCode":"TRA.FIG.2022.2026-06-27","metadataSources":[{"id":"runtime-generated","description":"Discovered from the live urest resource/model graph at server startup.","trust":"Best source for entities, endpoints, methods, fetch flags, and registered route availability."},{"id":"code-derived","description":"Generated or maintained next to backend code from gogen annotations, AddAction registrations, constants, or export formatting.","trust":"Best source for machine-readable backend mechanics when runtime discovery cannot expose item-level details."},{"id":"curated","description":"Developer-maintained backend metadata that clarifies parameters, effects, deprecations, and examples.","trust":"Best source for practical usage details; verify high-risk mutations against runtime availability and permissions."},{"id":"manual","description":"Static general guidance maintained by developers for API principles and common field semantics.","trust":"Useful for orientation; prefer generated/code-derived entries for exact current model shape."},{"id":"external","description":"Human task recipes in external skill repositories.","trust":"Use for federation/task-specific workflows after reading this built-in machine reference."}],"entityTypes":[{"id":"athletes","endpoint":"/api/athletes/","itemEndpoint":"/api/athletes/{athleteID}","description":"Athlete/person entries used by performances.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH"],"commonLinks":["Performances"],"collection":true,"source":"runtime-generated"},{"id":"competitions","endpoint":"/api/competitions/","itemEndpoint":"/api/competitions/{competitionID}","description":"Competition categories or divisions.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"actions":["command"],"commonLinks":["Stages"],"collection":true,"source":"runtime-generated"},{"id":"event","endpoint":"/api/event","description":"Root event settings and links to event-level collections.","methods":["GET","HEAD","PATCH"],"commonLinks":["Competitions","Sessions","JudgesPanels","Videos","Resources"],"source":"runtime-generated"},{"id":"frames","endpoint":"/api/frames/","itemEndpoint":"/api/frames/{frameID}","description":"Scoring/run instances connected to performances, sessions, and panels.","methods":["HEAD"],"itemMethods":["GET","HEAD","PATCH","POST"],"actions":["deduct","edit","fail","finish","go","inquiry_approve","inquiry_deduct","inquiry_edit","inquiry_mark","inquiry_override_deduct","inquiry_override_mark","inquiry_reject","inquiry_start","inquiry_submit","ready","reset"],"commonLinks":["Performances","Sessions"],"collection":true,"source":"runtime-generated"},{"id":"groups","endpoint":"/api/groups/","description":"Start-list groups inside stages.","methods":["HEAD","POST"],"commonLinks":["Stages","Sessions","Performances"],"collection":true,"source":"runtime-generated"},{"id":"judges","endpoint":"/api/judges/","itemEndpoint":"/api/judges/{judgeID}","description":"Judges used inside judges panels.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH"],"collection":true,"source":"runtime-generated"},{"id":"judgespanels","endpoint":"/api/judgespanels/","description":"Panels of judges assigned to stages.","methods":["GET","HEAD","POST"],"commonLinks":["Judges"],"collection":true,"source":"runtime-generated"},{"id":"panels","endpoint":"/api/panels/","itemEndpoint":"/api/panels/{panelID}","description":"Live judging/scoring panels.","methods":["GET"],"itemMethods":["GET","HEAD","PATCH"],"commonLinks":["Frames"],"collection":true,"source":"runtime-generated"},{"id":"performances","endpoint":"/api/performances/","itemEndpoint":"/api/performances/{performanceID}","description":"Athlete/team performance entries.","methods":["HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"actions":["swapframes"],"commonLinks":["Athletes","Groups","Frames","Sessions"],"collection":true,"source":"runtime-generated"},{"id":"resources","endpoint":"/api/resources/","itemEndpoint":"/api/resources/{resourceID}","description":"Uploaded or configured event resources.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH"],"collection":true,"source":"runtime-generated"},{"id":"scoreboards","endpoint":"/api/scoreboards/","itemEndpoint":"/api/scoreboards/{scoreboardID}","description":"Scoreboard display state.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"commonLinks":["Panels"],"collection":true,"source":"runtime-generated"},{"id":"sessions","endpoint":"/api/sessions/","itemEndpoint":"/api/sessions/{sessionID}","description":"Schedule sessions and their frames/groups.","methods":["HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"actions":["addRef","generate","removeRef","reorderRef"],"commonLinks":["Groups","Frames"],"collection":true,"source":"runtime-generated"},{"id":"stages","endpoint":"/api/stages/","itemEndpoint":"/api/stages/{stageID}","description":"Rounds or phases of a competition.","methods":["HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"actions":["advance","advance_","advance_teams","assign_numbers_in_teams","draw","duplicate","ensure_present","mix_teams"],"commonLinks":["Competitions","Groups","JudgesPanels"],"collection":true,"source":"runtime-generated"},{"id":"videos","endpoint":"/api/videos/","itemEndpoint":"/api/videos/{videoID}","description":"Video resources linked to the event.","methods":["HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH"],"collection":true,"source":"runtime-generated"}],"fetchFlags":[{"flag":"fetch_event=true","description":"Enable fetch expansion: event.","source":"code-derived"},{"flag":"fetch_panels=true","description":"Enable fetch expansion: panels.","source":"code-derived"},{"flag":"fetch_event_competitions=true","description":"Enable fetch expansion: event -\u003e competitions.","source":"code-derived"},{"flag":"fetch_event_sessions=true","description":"Enable fetch expansion: event -\u003e sessions.","source":"code-derived"},{"flag":"fetch_event_judges_panels=true","description":"Enable fetch expansion: event -\u003e judges -\u003e panels.","source":"code-derived"},{"flag":"fetch_event_videos=true","description":"Enable fetch expansion: event -\u003e videos.","source":"code-derived"},{"flag":"fetch_competition_stages=true","description":"Enable fetch expansion: competition -\u003e stages.","source":"code-derived"},{"flag":"fetch_stage_competitions=true","description":"Enable fetch expansion: stage -\u003e competitions.","source":"code-derived"},{"flag":"fetch_stage_medalists=true","description":"Enable fetch expansion: stage -\u003e medalists.","source":"code-derived"},{"flag":"fetch_stage_groups=true","description":"Enable fetch expansion: stage -\u003e groups.","source":"code-derived"},{"flag":"fetch_stage_judges_panels=true","description":"Enable fetch expansion: stage -\u003e judges -\u003e panels.","source":"code-derived"},{"flag":"fetch_group_stages=true","description":"Enable fetch expansion: group -\u003e stages.","source":"code-derived"},{"flag":"fetch_group_sessions=true","description":"Enable fetch expansion: group -\u003e sessions.","source":"code-derived"},{"flag":"fetch_group_performances=true","description":"Enable fetch expansion: group -\u003e performances.","source":"code-derived"},{"flag":"fetch_session_groups=true","description":"Enable fetch expansion: session -\u003e groups.","source":"code-derived"},{"flag":"fetch_session_frames=true","description":"Enable fetch expansion: session -\u003e frames.","source":"code-derived"},{"flag":"fetch_performance_groups=true","description":"Enable fetch expansion: performance -\u003e groups.","source":"code-derived"},{"flag":"fetch_performance_frames=true","description":"Enable fetch expansion: performance -\u003e frames.","source":"code-derived"},{"flag":"fetch_performance_athletes=true","description":"Enable fetch expansion: performance -\u003e athletes.","source":"code-derived"},{"flag":"fetch_performance_sessions=true","description":"Enable fetch expansion: performance -\u003e sessions.","source":"code-derived"},{"flag":"fetch_frame_performances=true","description":"Enable fetch expansion: frame -\u003e performances.","source":"code-derived"},{"flag":"fetch_frame_sessions=true","description":"Enable fetch expansion: frame -\u003e sessions.","source":"code-derived"},{"flag":"fetch_frame_tmd_data=true","description":"Enable fetch expansion: frame -\u003e tmd -\u003e data.","source":"code-derived"},{"flag":"fetch_frame_judge_deducts=true","description":"Enable fetch expansion: frame -\u003e judge -\u003e deducts.","source":"code-derived"},{"flag":"fetch_frame_judge_stats=true","description":"Enable fetch expansion: frame -\u003e judge -\u003e stats.","source":"code-derived"},{"flag":"fetch_scoreboard_panels=true","description":"Enable fetch expansion: scoreboard -\u003e panels.","source":"code-derived"},{"flag":"fetch_scoreboard_tasks=true","description":"Enable fetch expansion: scoreboard -\u003e tasks.","source":"code-derived"},{"flag":"fetch_panel_frames=true","description":"Enable fetch expansion: panel -\u003e frames.","source":"code-derived"},{"flag":"fetch_athlete_performances=true","description":"Enable fetch expansion: athlete -\u003e performances.","source":"code-derived"},{"flag":"fetch_judges_panel_judges=true","description":"Enable fetch expansion: judges -\u003e panel -\u003e judges.","source":"code-derived"},{"flag":"fetch_event_resources=true","description":"Enable fetch expansion: event -\u003e resources.","source":"code-derived"}],"actions":[{"id":"competitions.command","entity":"competitions","action":"command","method":"POST","pathTemplate":"/api/competitions/{competitionID}/command","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.deduct","entity":"frames","action":"deduct","method":"POST","pathTemplate":"/api/frames/{frameID}/deduct","authRequired":true,"status":"available","permission":"CanJudge","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.edit","entity":"frames","action":"edit","method":"POST","pathTemplate":"/api/frames/{frameID}/edit","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.fail","entity":"frames","action":"fail","method":"POST","pathTemplate":"/api/frames/{frameID}/fail","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.finish","entity":"frames","action":"finish","method":"POST","pathTemplate":"/api/frames/{frameID}/finish","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.go","entity":"frames","action":"go","method":"POST","pathTemplate":"/api/frames/{frameID}/go","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_approve","entity":"frames","action":"inquiry_approve","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_approve","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_deduct","entity":"frames","action":"inquiry_deduct","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_deduct","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_edit","entity":"frames","action":"inquiry_edit","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_edit","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_mark","entity":"frames","action":"inquiry_mark","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_mark","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_override_deduct","entity":"frames","action":"inquiry_override_deduct","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_override_deduct","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_override_mark","entity":"frames","action":"inquiry_override_mark","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_override_mark","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_reject","entity":"frames","action":"inquiry_reject","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_reject","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_start","entity":"frames","action":"inquiry_start","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_start","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_submit","entity":"frames","action":"inquiry_submit","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_submit","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.ready","entity":"frames","action":"ready","method":"POST","pathTemplate":"/api/frames/{frameID}/ready","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.reset","entity":"frames","action":"reset","method":"POST","pathTemplate":"/api/frames/{frameID}/reset","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"performances.swapframes","entity":"performances","action":"swapframes","method":"POST","pathTemplate":"/api/performances/{performanceID}/swapframes","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"sessions.addRef","entity":"sessions","action":"addRef","method":"POST","pathTemplate":"/api/sessions/{sessionID}/addRef","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"GroupID","in":"body","required":true,"type":"integer","description":"Target group ID for a session exercise reference. A session reference links one scheduled exercise/routine to a group and routine frame."},{"name":"GroupFrame","in":"body","required":true,"type":"integer","description":"Zero-based exercise/routine frame index inside the referenced group.","minimum":0,"maximum":4}],"response":"204 No Content on success.","source":"code-derived"},{"id":"sessions.generate","entity":"sessions","action":"generate","method":"POST","pathTemplate":"/api/sessions/{sessionID}/generate","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"mode","in":"body","required":true,"type":"string","description":"`create` replaces generated session frames from current session references; `append` keeps existing frames and appends new ones. Session references are links to scheduled exercises/routines.","enum":["create","append"]}],"response":"204 No Content on success.","source":"code-derived"},{"id":"sessions.removeRef","entity":"sessions","action":"removeRef","method":"POST","pathTemplate":"/api/sessions/{sessionID}/removeRef","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"GroupID","in":"body","required":true,"type":"integer","description":"Target group ID for a session exercise reference. A session reference links one scheduled exercise/routine to a group and routine frame."},{"name":"GroupFrame","in":"body","required":true,"type":"integer","description":"Zero-based exercise/routine frame index inside the referenced group.","minimum":0,"maximum":4}],"response":"204 No Content on success.","source":"code-derived"},{"id":"sessions.reorderRef","entity":"sessions","action":"reorderRef","method":"POST","pathTemplate":"/api/sessions/{sessionID}/reorderRef","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"GroupID","in":"body","required":true,"type":"integer","description":"Target group ID for the session exercise reference being moved."},{"name":"GroupFrame","in":"body","required":true,"type":"integer","description":"Zero-based exercise/routine frame index inside the referenced group.","minimum":0,"maximum":4},{"name":"n","in":"body","required":true,"type":"integer","description":"Zero-based target position inside the session reference list. Session references are links to scheduled exercises/routines.","minimum":0,"maximum":9999}],"response":"204 No Content on success.","source":"code-derived"},{"id":"stages.advance","entity":"stages","action":"advance","method":"POST","pathTemplate":"/api/stages/{stageID}/advance","authRequired":true,"status":"deprecated","deprecated":true,"permission":"CanCommandEvent","replacement":"Use client-side or agent-side finalist selection workflows; use stages.advance_ only for legacy server-side advancement.","effects":["Compatibility no-op for event log hash chain behavior."],"response":"204 No Content on success.","notes":["Deprecated and retained for backward compatibility. Current clients do not rely on this endpoint for real advancement."],"source":"curated"},{"id":"stages.advance_","entity":"stages","action":"advance_","method":"POST","pathTemplate":"/api/stages/{stageID}/advance_","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"n","in":"query","required":true,"type":"integer","description":"Number of ranked performances to advance.","example":8}],"effects":["Copies top ranked performances from this stage into the next suitable stage group."],"response":"204 No Content on success.","notes":["This is the legacy server-side advancement action. Prefer explicit client/agent selection workflows when federation rules require manual control."],"source":"curated"},{"id":"stages.advance_teams","entity":"stages","action":"advance_teams","method":"POST","pathTemplate":"/api/stages/{stageID}/advance_teams","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"n","in":"query","required":true,"type":"integer","description":"Number of teams to advance.","example":4}],"effects":["Copies ranked team performances into the next team semi-final or final stage group."],"response":"204 No Content on success.","source":"curated"},{"id":"stages.assign_numbers_in_teams","entity":"stages","action":"assign_numbers_in_teams","method":"POST","pathTemplate":"/api/stages/{stageID}/assign_numbers_in_teams","authRequired":true,"status":"available","permission":"CanCommandEvent","effects":["Assigns NumberInTeam values for team performances in all stage groups."],"response":"204 No Content on success.","source":"curated"},{"id":"stages.draw","entity":"stages","action":"draw","method":"POST","pathTemplate":"/api/stages/{stageID}/draw","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"seed","in":"query","required":true,"type":"integer","description":"Use -1 to keep collected performance order; any other integer deterministically shuffles the start list.","example":123}],"effects":["Collects performances from all groups in the stage.","Optionally shuffles them using the seed.","Redistributes performances across stage groups and updates each Performance.GroupID."],"response":"204 No Content on success.","notes":["Fails when the stage has no groups or seed is missing/not an integer."],"source":"curated"},{"id":"stages.duplicate","entity":"stages","action":"duplicate","method":"POST","pathTemplate":"/api/stages/{stageID}/duplicate","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"StageID","in":"query","required":false,"type":"id","description":"Existing target stage ID to merge into."},{"name":"CompetitionID","in":"query","required":false,"type":"id","description":"Existing target competition ID; creates a new stage there."}],"effects":["Duplicates stage setup and performances into a target stage, target competition, or a new copied competition."],"response":"204 No Content on success.","source":"curated"},{"id":"stages.ensure_present","entity":"stages","action":"ensure_present","method":"POST","pathTemplate":"/api/stages/{stageID}/ensure_present","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"Athletes","in":"query","required":true,"type":"id-list","description":"Athlete IDs that must be present in this stage."}],"effects":["Creates a performance in the first group when the requested athlete set is not already present."],"response":"204 No Content on success.","source":"curated"},{"id":"stages.mix_teams","entity":"stages","action":"mix_teams","method":"POST","pathTemplate":"/api/stages/{stageID}/mix_teams","authRequired":true,"status":"available","permission":"CanCommandEvent","effects":["Reorders grouped performances to mix team entries inside each group."],"response":"204 No Content on success.","source":"curated"}],"constants":[{"id":"SexNames","mapName":"SexNames","localizationPath":"/static/l10n/{locale}.l20n","source":"manual","values":[{"name":"S_MALE","value":"male","localizationTokens":["male"],"mapTo":["male"]},{"name":"S_FEMALE","value":"female","localizationTokens":["female"],"mapTo":["female"]},{"name":"S_MIX","value":"mix","localizationTokens":["mix"],"mapTo":["mix"]}]},{"id":"CompetitionTypes","mapName":"CompetitionNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"TRA","value":0,"localizationTokens":["DisciplineNameTRA","TRA","DCodeTRA"],"mapTo":["DisciplineNameTRA","TRA","10","1","DCodeTRA"]},{"name":"SYN","value":1,"localizationTokens":["DisciplineNameSYN","SYN","DCodeSYN"],"mapTo":["DisciplineNameSYN","SYN","10","2","DCodeSYN"]},{"name":"DMT","value":2,"localizationTokens":["DisciplineNameDMT","DMT","DCodeDMT"],"mapTo":["DisciplineNameDMT","DMT","2","1","DCodeDMT"]},{"name":"TUM","value":3,"localizationTokens":["DisciplineNameTUM","TUM","DCodeTUM"],"mapTo":["DisciplineNameTUM","TUM","8","1","DCodeTUM"]},{"name":"TEAM","value":4,"localizationTokens":["DisciplineNameTEAM","TEAM","DCodeTEAM"],"mapTo":["DisciplineNameTEAM","TEAM","0","1","DCodeTEAM"]}]},{"id":"CompetitionPresets","mapName":"CompetitionPresetNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"PresetAdult","value":0,"localizationTokens":["PresetAdult"],"mapTo":["PresetAdult"]},{"name":"PresetYouth","value":1,"localizationTokens":["PresetYouth"],"mapTo":["PresetYouth"]},{"name":"Preset2026AgeGroups","value":2,"localizationTokens":["Preset2026AgeGroups"],"mapTo":["Preset2026AgeGroups"]}]},{"id":"StageKinds","mapName":"StageKindNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"Qualification","value":0,"localizationTokens":["StageKindQualification","StageKindQualificationShort"],"mapTo":["StageKindQualification","StageKindQualificationShort"]},{"name":"QuarterFinal","value":1,"localizationTokens":["StageKindQuarterFinal","StageKindQuarterFinalShort"],"mapTo":["StageKindQuarterFinal","StageKindQuarterFinalShort"]},{"name":"SemiFinal","value":2,"localizationTokens":["StageKindSemiFinal","StageKindSemiFinalShort"],"mapTo":["StageKindSemiFinal","StageKindSemiFinalShort"]},{"name":"Final","value":3,"localizationTokens":["StageKindFinal","StageKindFinalShort"],"mapTo":["StageKindFinal","StageKindFinalShort"]},{"name":"TeamSemiFinal","value":4,"localizationTokens":["StageKindTeamSemiFinal","StageKindTeamSemiFinalShort"],"mapTo":["StageKindTeamSemiFinal","StageKindTeamSemiFinalShort"]},{"name":"TeamFinal","value":5,"localizationTokens":["StageKindTeamFinal","StageKindTeamFinalShort"],"mapTo":["StageKindTeamFinal","StageKindTeamFinalShort"]},{"name":"Qualification2","value":6,"localizationTokens":["StageKindQualification2","StageKindQualification2Short"],"mapTo":["StageKindQualification2","StageKindQualification2Short"]},{"name":"Final2","value":7,"localizationTokens":["StageKindFinal2","StageKindFinal2Short"],"mapTo":["StageKindFinal2","StageKindFinal2Short"]},{"name":"Final1","value":8,"localizationTokens":["StageKindFinal1","StageKindFinal1Short"],"mapTo":["StageKindFinal1","StageKindFinal1Short"]}]},{"id":"CalcGroups","mapName":"CalcGroupNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"CalculationGroup","value":0,"localizationTokens":["OptionsCalcGroup"],"mapTo":["OptionsCalcGroup"]},{"name":"TeamCalculationGroup","value":1,"localizationTokens":["OptionsTeamCalcGroup"],"mapTo":["OptionsTeamCalcGroup"]},{"name":"TiebreaksGroup","value":2,"localizationTokens":["OptionsTiebreaksGroup"],"mapTo":["OptionsTiebreaksGroup"]},{"name":"VisualGroup","value":3,"localizationTokens":["OptionsVisualGroup"],"mapTo":["OptionsVisualGroup"]},{"name":"ExperimentalGroup","value":4,"localizationTokens":["ExperimentalGroup"],"mapTo":["ExperimentalGroup"]}]},{"id":"CalcKinds","mapName":"CalcKindNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"CalcDefault","value":0,"localizationTokens":["CalcDefault"],"mapTo":["CalcDefault","CalcGroups.CalcGroupMax"]},{"name":"CalcMax2SumQ2F1F2","value":1,"localizationTokens":["CalcMax2SumQ2F1F2"],"mapTo":["CalcMax2SumQ2F1F2","CalcGroups.CalculationGroup"]},{"name":"CalcAddRefJudgesToResult","value":2,"localizationTokens":["CalcAddRefJudgesToResults"],"mapTo":["CalcAddRefJudgesToResults","CalcGroups.ExperimentalGroup"]},{"name":"CalcCroppedAvg","value":3,"localizationTokens":["CalcCroppedAvg"],"mapTo":["CalcCroppedAvg","CalcGroups.CalculationGroup"]},{"name":"CalcAddPrevStageResult","value":4,"localizationTokens":["StageAddPrevStageResult"],"mapTo":["StageAddPrevStageResult","CalcGroups.CalculationGroup"]},{"name":"CalcBestRoutineAsResult","value":5,"localizationTokens":["CalcBestRoutineAsResult"],"mapTo":["CalcBestRoutineAsResult","CalcGroups.CalculationGroup"]},{"name":"CalcLastRoutineAsResult","value":6,"localizationTokens":["CalcLastRoutineAsResult"],"mapTo":["CalcLastRoutineAsResult","CalcGroups.ExperimentalGroup"]},{"name":"Calc2017Scores","value":7,"localizationTokens":["Calc2017Scores"],"mapTo":["Calc2017Scores","CalcGroups.VisualGroup"]},{"name":"CalcUseRanksForTeamScores","value":8,"localizationTokens":["CalcUseRanksForTeamScores"],"mapTo":["CalcUseRanksForTeamScores","CalcGroups.TeamCalculationGroup"]},{"name":"CalcShowMedalists","value":9,"localizationTokens":["CalcShowMedalists"],"mapTo":["CalcShowMedalists","CalcGroups.VisualGroup"]},{"name":"CalcQualifyFirstInGroup","value":10,"localizationTokens":["CalcQualifyFirstInGroup"],"mapTo":["CalcQualifyFirstInGroup","CalcGroups.CalculationGroup"]},{"name":"UseE1AsReferenceForHL","value":11,"localizationTokens":["CalcUseE1AsReferenceForHL"],"mapTo":["CalcUseE1AsReferenceForHL","CalcGroups.VisualGroup"]},{"name":"UseWAGCTieBreaks","value":12,"localizationTokens":["CalcUseWAGCTieBreaks"],"mapTo":["CalcUseWAGCTieBreaks","CalcGroups.TiebreaksGroup"]},{"name":"CalcIgnoreToFFromHDTMD","value":13,"localizationTokens":["CalcIgnoreToFFromHDTMD"],"mapTo":["CalcIgnoreToFFromHDTMD","CalcGroups.ExperimentalGroup"]},{"name":"CalcUsePerSkillDiff","value":14,"localizationTokens":["CalcUsePerSkillDiff"],"mapTo":["CalcUsePerSkillDiff","CalcGroups.CalculationGroup"]},{"name":"CalcUse7forDMT1Skill","value":15,"localizationTokens":["CalcUse7forDMT1Skill"],"mapTo":["CalcUse7forDMT1Skill","CalcGroups.ExperimentalGroup"]},{"name":"CalcAvgX2","value":16,"localizationTokens":["CalcAvgX2"],"mapTo":["CalcAvgX2","CalcGroups.CalculationGroup"]},{"name":"CalcAvgX3","value":17,"localizationTokens":["CalcAvgX3"],"mapTo":["CalcAvgX3","CalcGroups.CalculationGroup"]},{"name":"CalcUseGuestStyleUnranked","value":18,"localizationTokens":["CalcUseGuestStyleUnranked"],"mapTo":["CalcUseGuestStyleUnranked","CalcGroups.ExperimentalGroup"]},{"name":"CalcAddSumAllRoutinesAsFirstTiebreak","value":19,"localizationTokens":["CalcAddSumAllRoutinesAsFirstTiebreak"],"mapTo":["CalcAddSumAllRoutinesAsFirstTiebreak","CalcGroups.TiebreaksGroup"]},{"name":"CalcShowSumWithPrevStage","value":20,"localizationTokens":["CalcShowSumWithPrevStage"],"mapTo":["CalcShowSumWithPrevStage","CalcGroups.ExperimentalGroup"]},{"name":"CalcUseDTextInputs","value":21,"localizationTokens":["CalcUseDTextInputs"],"mapTo":["CalcUseDTextInputs","CalcGroups.CalculationGroup"]},{"name":"Calc2DigitsToFCut","value":22,"localizationTokens":["Calc2DigitsToFCut"],"mapTo":["Calc2DigitsToFCut","CalcGroups.CalculationGroup"]},{"name":"CalcShowSumOfRoutines","value":23,"localizationTokens":["CalcShowSumOfRoutines"],"mapTo":["CalcShowSumOfRoutines","CalcGroups.VisualGroup"]},{"name":"CalcNoTiebreaks","value":24,"localizationTokens":["CalcNoTiebreaks"],"mapTo":["CalcNoTiebreaks","CalcGroups.TiebreaksGroup"]},{"name":"CalcUseTotalsForTeamScores","value":25,"localizationTokens":["CalcUseTotalsForTeamScores"],"mapTo":["CalcUseTotalsForTeamScores","CalcGroups.TeamCalculationGroup"]},{"name":"CalcAllowManualHDInput","value":26,"localizationTokens":["CalcAllowManualHDInput"],"mapTo":["CalcAllowManualHDInput","CalcGroups.ExperimentalGroup"]},{"name":"CalcForceLandingDeduction","value":27,"localizationTokens":["CalcForceLandingDeduction"],"mapTo":["CalcForceLandingDeduction","CalcGroups.ExperimentalGroup"]},{"name":"CalcUseBestScoresMaxOneFromAthlete","value":28,"localizationTokens":["CalcUseBestScoresMaxOneFromAthlete"],"mapTo":["CalcUseBestScoresMaxOneFromAthlete","CalcGroups.TeamCalculationGroup"]},{"name":"CalcUseRanks2025ForTeamScores","value":29,"localizationTokens":["CalcUseRanks2025ForTeamScores"],"mapTo":["CalcUseRanks2025ForTeamScores","CalcGroups.TeamCalculationGroup"]},{"name":"CalcUse8forDMT1Skill","value":30,"localizationTokens":["CalcUse8forDMT1Skill"],"mapTo":["CalcUse8forDMT1Skill","CalcGroups.CalculationGroup"]},{"name":"CalcUseCustomTiebreaks","value":31,"localizationTokens":["CalcUseCustomTiebreaks"],"mapTo":["CalcUseCustomTiebreaks","CalcGroups.TiebreaksGroup"]},{"name":"CalcUseLastRoutineAsCountingForTiebreaks","value":32,"localizationTokens":["CalcUseLastRoutineAsCountingForTiebreaks"],"mapTo":["CalcUseLastRoutineAsCountingForTiebreaks","CalcGroups.TiebreaksGroup"]},{"name":"CalcUseMedianETotalsX2ForE","value":33,"localizationTokens":["CalcUseMedianETotalsX2ForE"],"mapTo":["CalcUseMedianETotalsX2ForE","CalcGroups.ExperimentalGroup"]},{"name":"CalcRoundE2Digits","value":34,"localizationTokens":["CalcRoundE2Digits"],"mapTo":["CalcRoundE2Digits","CalcGroups.CalculationGroup"]},{"name":"CalcRoundDownE2Digits","value":35,"localizationTokens":["CalcRoundDownE2Digits"],"mapTo":["CalcRoundDownE2Digits","CalcGroups.CalculationGroup"]},{"name":"CalcPickBestFromCurrentAndPrevStage","value":36,"localizationTokens":["CalcPickBestFromCurrentAndPrevStage"],"mapTo":["CalcPickBestFromCurrentAndPrevStage","CalcGroups.ExperimentalGroup"]},{"name":"CalcUseCustomTeamTiebreaks","value":37,"localizationTokens":["CalcUseCustomTeamTiebreaks"],"mapTo":["CalcUseCustomTeamTiebreaks","CalcGroups.TiebreaksGroup"]}]},{"id":"Tiebreakers","mapName":"TiebreakerNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"TiebreakerNone","value":0,"localizationTokens":["TiebreakerNone"],"mapTo":["TiebreakerNone"]},{"name":"TiebreakerCountingHighestTS","value":1,"localizationTokens":["TiebreakerCountingHighestTS"],"mapTo":["TiebreakerCountingHighestTS"]},{"name":"TiebreakerCountingHighestH","value":2,"localizationTokens":["TiebreakerCountingHighestH"],"mapTo":["TiebreakerCountingHighestH"]},{"name":"TiebreakerCountingHighestD","value":3,"localizationTokens":["TiebreakerCountingHighestD"],"mapTo":["TiebreakerCountingHighestD"]},{"name":"TiebreakerCountingHighestSumOfAllE","value":4,"localizationTokens":["TiebreakerCountingHighestSumOfAllE"],"mapTo":["TiebreakerCountingHighestSumOfAllE"]},{"name":"TiebreakerAllExercisesHighestSumOfScores","value":5,"localizationTokens":["TiebreakerAllExercisesHighestSumOfScores"],"mapTo":["TiebreakerAllExercisesHighestSumOfScores"]},{"name":"TiebreakerAllExercisesHighestSumOfAllD","value":6,"localizationTokens":["TiebreakerAllExercisesHighestSumOfAllD"],"mapTo":["TiebreakerAllExercisesHighestSumOfAllD"]},{"name":"TiebreakerAllExercisesHighestSumOfAllE","value":7,"localizationTokens":["TiebreakerAllExercisesHighestSumOfAllE"],"mapTo":["TiebreakerAllExercisesHighestSumOfAllE"]},{"name":"TiebreakerAllExercisesLowestSumOfCjpP","value":8,"localizationTokens":["TiebreakerAllExercisesLowestSumOfCjpP"],"mapTo":["TiebreakerAllExercisesLowestSumOfCjpP"]},{"name":"TiebreakerAllExercisesHighestMaxD","value":9,"localizationTokens":["TiebreakerAllExercisesHighestMaxD"],"mapTo":["TiebreakerAllExercisesHighestMaxD"]},{"name":"TiebreakerPrevStageHighestRanking","value":10,"localizationTokens":["TiebreakerPrevStageHighestRanking"],"mapTo":["TiebreakerPrevStageHighestRanking"]},{"name":"TiebreakerQStageHighestRanking","value":11,"localizationTokens":["TiebreakerQStageHighestRanking"],"mapTo":["TiebreakerQStageHighestRanking"]},{"name":"TiebreakerCountLowestSumOfDeductions","value":12,"localizationTokens":["TiebreakerCountLowestSumOfDeductions"],"mapTo":["TiebreakerCountLowestSumOfDeductions"]},{"name":"TiebreakerAllExercisesWithPrevStageHighestSumOfScores","value":13,"localizationTokens":["TiebreakerAllExercisesWithPrevStageHighestSumOfScores"],"mapTo":["TiebreakerAllExercisesWithPrevStageHighestSumOfScores"]},{"name":"TiebreakerLastExerciseHighestTS","value":14,"localizationTokens":["TiebreakerLastExerciseHighestTS"],"mapTo":["TiebreakerLastExerciseHighestTS"]},{"name":"TiebreakerLastExerciseHighestH","value":15,"localizationTokens":["TiebreakerLastExerciseHighestH"],"mapTo":["TiebreakerLastExerciseHighestH"]},{"name":"TiebreakerLastExerciseHighestD","value":16,"localizationTokens":["TiebreakerLastExerciseHighestD"],"mapTo":["TiebreakerLastExerciseHighestD"]}]},{"id":"TeamTiebreakers","mapName":"TeamTiebreakerNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"TeamTiebreakerNone","value":0,"localizationTokens":["TeamTiebreakerNone"],"mapTo":["TeamTiebreakerNone"]},{"name":"TeamTiebreakerSumT","value":1,"localizationTokens":["TeamTiebreakerSumT"],"mapTo":["TeamTiebreakerSumT"]},{"name":"TeamTiebreakerSumH","value":2,"localizationTokens":["TeamTiebreakerSumH"],"mapTo":["TeamTiebreakerSumH"]},{"name":"TeamTiebreakerSumD","value":3,"localizationTokens":["TeamTiebreakerSumD"],"mapTo":["TeamTiebreakerSumD"]},{"name":"TeamTiebreakerSumE","value":4,"localizationTokens":["TeamTiebreakerSumE"],"mapTo":["TeamTiebreakerSumE"]},{"name":"TeamTiebreakerBestD","value":5,"localizationTokens":["TeamTiebreakerBestD"],"mapTo":["TeamTiebreakerBestD"]},{"name":"TeamTiebreakerBestS","value":6,"localizationTokens":["TeamTiebreakerBestS"],"mapTo":["TeamTiebreakerBestS"]},{"name":"TeamTiebreakerSumBestFromE_NMembers","value":7,"localizationTokens":["TeamTiebreakerSumBestFromE_NMembers"],"mapTo":["TeamTiebreakerSumBestFromE_NMembers"]},{"name":"TeamTiebreakerSumBestFromE_NMinus1","value":8,"localizationTokens":["TeamTiebreakerSumBestFromE_NMinus1"],"mapTo":["TeamTiebreakerSumBestFromE_NMinus1"]},{"name":"TeamTiebreakerSumS","value":9,"localizationTokens":["TeamTiebreakerSumS"],"mapTo":["TeamTiebreakerSumS"]},{"name":"TeamTiebreakerSumBestFromAllRoutinesD_N","value":10,"localizationTokens":["TeamTiebreakerSumBestFromAllRoutinesD_N"],"mapTo":["TeamTiebreakerSumBestFromAllRoutinesD_N"]},{"name":"TeamTiebreakerSumBestFromAllRoutinesD_NMinus1","value":11,"localizationTokens":["TeamTiebreakerSumBestFromAllRoutinesD_NMinus1"],"mapTo":["TeamTiebreakerSumBestFromAllRoutinesD_NMinus1"]},{"name":"TeamTiebreakerSumBestFromAllRoutinesD_NMinus2","value":12,"localizationTokens":["TeamTiebreakerSumBestFromAllRoutinesD_NMinus2"],"mapTo":["TeamTiebreakerSumBestFromAllRoutinesD_NMinus2"]}]}],"fieldFormats":[{"entity":"Performance","field":"MarkTTT_G","storage":"integer thousandths","display":"decimal score","scale":1000,"decimals":3,"exampleRaw":63110,"exampleDisplay":"63.110","notes":["Format by dividing by 1000 and keeping exactly 3 decimal digits."],"source":"code-derived"},{"entity":"Performance","field":"TeamMarkTTT_G","storage":"integer thousandths","display":"decimal score","scale":1000,"decimals":3,"exampleRaw":63110,"exampleDisplay":"63.110","notes":["Format by dividing by 1000 and keeping exactly 3 decimal digits."],"source":"code-derived"},{"entity":"Frame","field":"MarkTTT_G","storage":"integer thousandths","display":"decimal score","scale":1000,"decimals":3,"exampleRaw":63110,"exampleDisplay":"63.110","notes":["Format by dividing by 1000 and keeping exactly 3 decimal digits."],"source":"code-derived"},{"entity":"Athlete","field":"displayName","storage":"composed fields","display":"Surname GivenName Patronymic","exampleRaw":{"GivenName":"Ivan","Patronymic":"Petrovich","Surname":"Testov"},"exampleDisplay":"Testov Ivan Petrovich","notes":["Skip empty name parts when composing display text."],"source":"manual"},{"entity":"Athlete","field":"Representing","storage":"string","display":"region or federation text","exampleRaw":"Test Region","exampleDisplay":"Test Region","source":"manual"},{"entity":"Athlete","field":"DateOfBirth","storage":"RFC3339 string for writes","display":"date","exampleRaw":"2008-01-01T00:00:00Z","exampleDisplay":"2008-01-01","notes":["PATCH requests must send DateOfBirth as an RFC3339 string."],"source":"manual"}],"fieldDocs":[{"entity":"Person","field":"ExternalID","summary":"External identifier from an upstream registration, CRM, or federation system.","readFormat":"Non-negative integer.","writeFormat":"Use a non-negative integer when preserving an external system identity.","notes":["Do not confuse ExternalID with the server numeric entity ID from URLs or Location headers.","Use GUID when the upstream system has a stable string UUID-like identifier."],"source":"curated"},{"entity":"Athlete","field":"DateOfBirth","summary":"Athlete date of birth used by matching, category filters, exports, and participant import.","readFormat":"API mutations use RFC3339 timestamps; CSV import may use the event DateOfBirth format.","writeFormat":"Use RFC3339 for direct API PATCH/POST, for example 2008-01-01T00:00:00Z.","notes":["CSV export uses the legacy 02/01/2006 display format.","Participant import can parse a model/event-specific DateOfBirth format described in importFormats."],"source":"curated"},{"entity":"Athlete","field":"Sex","summary":"Athlete sex used by matching, category filters, imports, and display.","readFormat":"String value.","writeFormat":"Use male or female for participant import and direct API writes.","constants":["SexNames"],"notes":["Some competition/category contexts can also use mix, but individual athlete values should be male or female."],"source":"curated"},{"entity":"Session","field":"Time","summary":"Human schedule label for a session.","readFormat":"String.","writeFormat":"Use a plain string; it can be a time, range, or comment-style schedule label.","notes":["The server does not parse this field as a timestamp.","Use Number for sortable session order and Time for human-facing schedule text."],"source":"curated"},{"entity":"Session","field":"SessionTitle","summary":"Human-facing session title.","readFormat":"String.","writeFormat":"PATCH as SessionTitle with a plain string.","notes":["The API field is SessionTitle, not Title.","Use SessionTitle for the displayed session name, Number for sortable order, and Time for schedule text."],"source":"curated"},{"entity":"Session","field":"Number","summary":"Human/session order number.","readFormat":"Integer.","writeFormat":"Positive integer.","notes":["Use Number for sortable session order and Time for human-facing schedule text."],"source":"curated"},{"entity":"Session","field":"RotationView","summary":"Selects how session frames are grouped into visual rotations and labeled in the session view.","readFormat":"Integer mode index.","writeFormat":"PATCH as RotationView; the standard client defines modes 0 through 7.","notes":["RotationView changes the presentation and grouping headers derived from Session.Frames; it does not reorder or regenerate the frames.","Modes cover no grouping, participant grouping, routine grouping, competition grouping, and variants that keep missing exercise references visible."],"source":"curated"},{"entity":"Competition","field":"Discipline","summary":"TRA competition discipline, such as trampoline, synchronized trampoline, double mini-trampoline, tumbling, or team.","readFormat":"Integer enum value.","writeFormat":"Use values from CompetitionTypes; do not guess numeric discipline IDs.","constants":["CompetitionTypes"],"notes":["Changing discipline can be rejected when existing performances would become invalid for the new discipline.","Human-readable names and discipline codes can be resolved through constants and localization tokens."],"source":"curated"},{"entity":"Session","field":"Groups","summary":"Ordered session exercise references included in this session.","readFormat":"Array of group IDs.","writeFormat":"Use session actions such as sessions.addRef, sessions.removeRef, and sessions.reorderRef instead of patching the array directly.","notes":["A session reference is a link to a scheduled exercise/routine, represented by GroupID plus GroupFrame.","Groups and GroupFrame are parallel arrays; Groups[i] uses GroupFrame[i].","After changing session references, call sessions.generate to build or update Frames."],"source":"curated"},{"entity":"Session","field":"GroupFrame","summary":"Exercise/routine frame index for each referenced session group.","readFormat":"Integer array parallel to Session.Groups.","writeFormat":"Use zero-based frame indexes through session reference actions.","notes":["A session reference is a link to a scheduled exercise/routine, represented by GroupID plus GroupFrame.","Groups and GroupFrame are parallel arrays and must stay the same length.","GroupFrame values identify which exercise/routine frame of a group is scheduled."],"source":"curated"},{"entity":"Session","field":"Frames","summary":"Generated ordered frame list used by the live session workflow.","readFormat":"Array of frame IDs.","writeFormat":"Do not construct manually for normal scheduling; use sessions.generate after updating session references.","notes":["Session references are links to scheduled exercises/routines; sessions.generate converts them into concrete Frames.","sessions.generate with mode=create replaces generated frames from current session references.","sessions.generate with mode=append keeps existing frames and appends new generated frames."],"source":"curated"},{"entity":"Stage","field":"PerfomanceFramesLimit","summary":"Maximum number of routines expected for each performance in this stage.","readFormat":"Integer from 0 to 4.","writeFormat":"PATCH with an integer from 0 to 4.","notes":["Use 1 for single-routine final stages such as Final2 when the competition rules require one routine.","The field name is spelled PerfomanceFramesLimit in the API for backward compatibility."],"source":"curated"},{"entity":"Stage","field":"CalcOptions","summary":"Stage calculation options represented as a list of enabled CalcKinds indexes.","readFormat":"Integer list of enabled option indexes.","writeFormat":"PATCH with an integer array built from CalcKinds constants.","constants":["CalcKinds"],"notes":["Use constants/localization metadata to explain values; do not hard-code magic numbers without resolving CalcKinds.","Some options are mutually constrained by server validation and stage/discipline rules."],"source":"curated"},{"entity":"Stage","field":"Tiebreakers","summary":"Ordered stage tie-breaker rules used to resolve equal ranks.","readFormat":"Integer list with fixed maximum length; zero values usually represent no further tie-breaker.","writeFormat":"PATCH with an integer array built from Tiebreakers constants.","constants":["Tiebreakers"],"notes":["Use localization tokens from constants for human-readable descriptions.","Team tie-breakers are a separate field and use TeamTiebreakers constants."],"source":"curated"}],"importFormats":[{"id":"participants-csv","title":"Participants CSV import","source":"code-derived","appliesTo":["TRA"],"entryPoints":["UI: event page participant import widget.","UI: stage control participant import widget.","UI: settings import/export participant import widget.","Client/UI import uses TRA.dataimport.importStageFromFileDictionary for an existing stage.","Client/UI import uses TRA.dataimport.importDisciplineFromFileDictionary for a discipline/competition import."],"supportedFiles":[".csv",".xlsx"],"encoding":["UTF-8 for text files; browser spreadsheet reader for .xlsx"],"delimiters":["auto-detected by Papa Parse for .csv, commonly ;, comma, or tab"],"headerRow":true,"entities":[{"entity":"Competition","required":["Title"],"optional":["TitleLocalised","GUID_C","ExtensionJson","AgeGroup","Level","SexCategory","Preset","Discipline","DisciplineCode"],"columns":[{"column":"Competition: Title","entity":"Competition","field":"Title","required":true,"source":"code-derived"},{"column":"Competition: TitleLocalised","entity":"Competition","field":"TitleLocalised","source":"code-derived"},{"column":"Competition: GUID_C","entity":"Competition","field":"GUID_C","source":"code-derived"},{"column":"Competition: ExtensionJson","entity":"Competition","field":"ExtensionJson","source":"code-derived"},{"column":"Competition: AgeGroup","entity":"Competition","field":"AgeGroup","source":"code-derived"},{"column":"Competition: Level","entity":"Competition","field":"Level","source":"code-derived"},{"column":"Competition: SexCategory","entity":"Competition","field":"SexCategory","source":"code-derived"},{"column":"Competition: Preset","entity":"Competition","field":"Preset","parser":"number","source":"code-derived"},{"column":"Competition: Discipline","entity":"Competition","field":"Discipline","parser":"number","source":"code-derived"},{"column":"Competition: DisciplineCode","entity":"Competition","field":"DisciplineCode","parser":"discipline-code","aliases":["DisciplineCode"],"constants":["CompetitionTypes","CodesDiscipline"],"notes":["Import-only column mapped to Competition.Discipline by the client."],"source":"code-derived"}],"source":"code-derived"},{"entity":"Stage","optional":["QLimitToFilter","QReserveCount","QRepresentMaxFilter","ExportFigAR","ExtensionJson","PerfomanceFramesLimit","CalcOptions","Tiebreakers","TeamTiebreakers","Group"],"columns":[{"column":"Stage: QLimitToFilter","entity":"Stage","field":"QLimitToFilter","parser":"number","source":"code-derived"},{"column":"Stage: QReserveCount","entity":"Stage","field":"QReserveCount","parser":"number","source":"code-derived"},{"column":"Stage: QRepresentMaxFilter","entity":"Stage","field":"QRepresentMaxFilter","parser":"number","source":"code-derived"},{"column":"Stage: ExportFigAR","entity":"Stage","field":"ExportFigAR","parser":"bool","source":"code-derived"},{"column":"Stage: ExtensionJson","entity":"Stage","field":"ExtensionJson","source":"code-derived"},{"column":"Stage: PerfomanceFramesLimit","entity":"Stage","field":"PerfomanceFramesLimit","parser":"number","source":"code-derived"},{"column":"Stage: CalcOptions","entity":"Stage","field":"CalcOptions","parser":"number-list","source":"code-derived"},{"column":"Stage: Tiebreakers","entity":"Stage","field":"Tiebreakers","parser":"number-list","source":"code-derived"},{"column":"Stage: TeamTiebreakers","entity":"Stage","field":"TeamTiebreakers","parser":"number-list","source":"code-derived"},{"column":"Stage: Group","entity":"Stage","field":"Group","parser":"number","default":1,"aliases":["Group"],"notes":["Import-only column injected by gymnastics.dataimport.Importer."],"source":"code-derived"}],"source":"code-derived"},{"entity":"Group","source":"code-derived"},{"entity":"Performance","optional":["Ranked","Description","GroupName","GroupPhotoURL","Team","NumberInTeam"],"columns":[{"column":"Performance: Ranked","entity":"Performance","field":"Ranked","parser":"bool","default":true,"source":"code-derived"},{"column":"Performance: Description","entity":"Performance","field":"Description","source":"code-derived"},{"column":"Performance: GroupName","entity":"Performance","field":"GroupName","source":"code-derived"},{"column":"Performance: GroupPhotoURL","entity":"Performance","field":"GroupPhotoURL","source":"code-derived"},{"column":"Performance: Team","entity":"Performance","field":"Team","parser":"number","source":"code-derived"},{"column":"Performance: NumberInTeam","entity":"Performance","field":"NumberInTeam","parser":"number","source":"code-derived"}],"source":"code-derived"},{"entity":"Athlete","required":["Surname","GivenName"],"optional":["GUID","ExternalID","Patronymic","PhotoURL","Representing","Representing2","SurnameLocalised","GivenNameLocalised","PatronymicLocalised","RepresentingLocalised","DateOfBirth","Sex","Level","Coach","CoachLocalised"],"columns":[{"column":"Athlete: GUID","entity":"Athlete","field":"GUID","source":"code-derived"},{"column":"Athlete: ExternalID","entity":"Athlete","field":"ExternalID","parser":"number","source":"code-derived"},{"column":"Athlete: Surname","entity":"Athlete","field":"Surname","required":true,"source":"code-derived"},{"column":"Athlete: GivenName","entity":"Athlete","field":"GivenName","required":true,"source":"code-derived"},{"column":"Athlete: Patronymic","entity":"Athlete","field":"Patronymic","source":"code-derived"},{"column":"Athlete: PhotoURL","entity":"Athlete","field":"PhotoURL","source":"code-derived"},{"column":"Athlete: Representing","entity":"Athlete","field":"Representing","source":"code-derived"},{"column":"Athlete: Representing2","entity":"Athlete","field":"Representing2","source":"code-derived"},{"column":"Athlete: SurnameLocalised","entity":"Athlete","field":"SurnameLocalised","source":"code-derived"},{"column":"Athlete: GivenNameLocalised","entity":"Athlete","field":"GivenNameLocalised","source":"code-derived"},{"column":"Athlete: PatronymicLocalised","entity":"Athlete","field":"PatronymicLocalised","source":"code-derived"},{"column":"Athlete: RepresentingLocalised","entity":"Athlete","field":"RepresentingLocalised","source":"code-derived"},{"column":"Athlete: DateOfBirth","entity":"Athlete","field":"DateOfBirth","parser":"date","source":"code-derived"},{"column":"Athlete: Sex","entity":"Athlete","field":"Sex","constants":["SexNames"],"notes":["Participant import UI/l10n documents male and female values for this column."],"source":"code-derived"},{"column":"Athlete: Level","entity":"Athlete","field":"Level","source":"code-derived"},{"column":"Athlete: Coach","entity":"Athlete","field":"Coach","source":"code-derived"},{"column":"Athlete: CoachLocalised","entity":"Athlete","field":"CoachLocalised","source":"code-derived"}],"source":"code-derived"}],"workflows":[{"id":"stage","description":"Import rows into an existing stage; rows are grouped by Stage.Group and chunked by athlete count for the discipline.","requiredColumns":["Athlete: Surname","Athlete: GivenName"],"optionalColumns":["Stage: QLimitToFilter","Stage: QReserveCount","Stage: QRepresentMaxFilter","Stage: ExportFigAR","Stage: ExtensionJson","Stage: PerfomanceFramesLimit","Stage: CalcOptions","Stage: Tiebreakers","Stage: TeamTiebreakers","Stage: Group","Performance: Ranked","Performance: Description","Performance: GroupName","Performance: GroupPhotoURL","Performance: Team","Performance: NumberInTeam","Athlete: GUID","Athlete: ExternalID","Athlete: Patronymic","Athlete: PhotoURL","Athlete: Representing","Athlete: Representing2","Athlete: SurnameLocalised","Athlete: GivenNameLocalised","Athlete: PatronymicLocalised","Athlete: RepresentingLocalised","Athlete: DateOfBirth","Athlete: Sex","Athlete: Level","Athlete: Coach","Athlete: CoachLocalised"],"effects":["Creates missing Groups under the target Stage.","POSTs Performances under each Group.","Finds matching Athletes through /api/athletes/ with min_score=0.99 unless matching is disabled.","PATCHes Performance.Athletes and imported Athlete/Performance fields."]},{"id":"discipline","description":"Import rows grouped by Competition.Discipline and Competition.Title, creating or reusing competitions and their first stage.","requiredColumns":["Competition: Title","Athlete: Surname","Athlete: GivenName"],"optionalColumns":["Competition: TitleLocalised","Competition: GUID_C","Competition: ExtensionJson","Competition: AgeGroup","Competition: Level","Competition: SexCategory","Competition: Preset","Competition: Discipline","Competition: DisciplineCode","Stage: QLimitToFilter","Stage: QReserveCount","Stage: QRepresentMaxFilter","Stage: ExportFigAR","Stage: ExtensionJson","Stage: PerfomanceFramesLimit","Stage: CalcOptions","Stage: Tiebreakers","Stage: TeamTiebreakers","Stage: Group","Performance: Ranked","Performance: Description","Performance: GroupName","Performance: GroupPhotoURL","Performance: Team","Performance: NumberInTeam","Athlete: GUID","Athlete: ExternalID","Athlete: Patronymic","Athlete: PhotoURL","Athlete: Representing","Athlete: Representing2","Athlete: SurnameLocalised","Athlete: GivenNameLocalised","Athlete: PatronymicLocalised","Athlete: RepresentingLocalised","Athlete: DateOfBirth","Athlete: Sex","Athlete: Level","Athlete: Coach","Athlete: CoachLocalised"],"effects":["GETs /api/event?fetch_event_competitions=true and reuses competitions by Discipline+Title.","POSTs /api/competitions/ with Discipline, Title, and Preset when no match exists.","PATCHes imported Competition fields, then imports rows into the competition's first Stage."]}],"deduplication":["Existing competitions are matched by Competition.Discipline + Competition.Title.","Athlete lookup sends imported Athlete fields to /api/athletes/ with min_score=0.99.","When duplicate normalized headers exist, current client asks whether to use the first duplicate column; without dialog service it uses the first duplicate."],"effects":["CSV import is a client workflow that performs normal REST API calls; there is no dedicated backend CSV upload endpoint in this metadata.","Repeated import can create additional performances; athlete records may be matched and patched."],"notes":["Header row is required for the current dictionary import path.","Use qualified headers such as Athlete: Surname to avoid ambiguity; the sample UI may prefix required columns with (R).","DateOfBirth parser follows event DoBFormat when provided by the event settings; otherwise it uses the default client date parser.","Sex accepts values handled by common.datatable.parseSex; prefer constants from SexNames where possible.","Competition.DisciplineCode is import-only and is converted to Competition.Discipline by the client when CodesDiscipline is available."],"examples":[{"id":"minimal-stage","description":"Minimal stage import with one athlete per performance.","content":"Athlete: Surname;Athlete: GivenName;Athlete: Representing\nTestov;Ivan;Test Region\n"},{"id":"syn-pair","description":"SYN pair: two athlete rows are chunked into one performance when the discipline athlete count is 2.","content":"Stage: Group;Athlete: Surname;Athlete: GivenName;Performance: Team;Performance: NumberInTeam\n1;First;Athlete;1;1\n1;Second;Athlete;1;2\n"},{"id":"multi-competition","description":"Discipline import with competition matching/creation fields.","content":"Competition: Title;Competition: DisciplineCode;Competition: AgeGroup;Competition: SexCategory;Athlete: Surname;Athlete: GivenName;Athlete: DateOfBirth\nTRA 13-14 W;TRA;13-14;female;Testova;Anna;2012-01-31\n"}]}],"skillSources":[{"id":"configured-ai-skill-source","title":"sporttech.io OVS AI skill packs","kind":"github-repository","url":"https://github.com/sporttech/sporttech.io-ovs-ai-skills","indexUrl":"https://raw.githubusercontent.com/sporttech/sporttech.io-ovs-ai-skills/main/skills/index.json","appliesTo":["TRA"],"description":"External human-readable recipes for federation-specific workflows. Use this after reading the built-in machine-readable API model.","notes":["Built-in /api/ai skills describe stable server mechanics and code-derived behavior.","External skill packs may describe FIG or federation-specific policies that should not live in the Go server.","Task recipes such as winner listing, FIG policies, advancement policies, and federation-specific interpretations should be read from external skill packs.","Resolve canonical scripts and helpers from one exact repository revision; do not mix files from different revisions.","Follow the root recommendedWorkflow, including its draft and explicit-approval policy."],"source":"external"}],"skills":[{"id":"start-lists","title":"Get start lists","url":"/api/ai/skill/start-lists","source":"curated"},{"id":"find-athlete-competition","title":"Find an athlete's competition","url":"/api/ai/skill/find-athlete-competition","source":"curated"},{"id":"scoreboard-live","title":"Subscribe to a live scoreboard","url":"/api/ai/skill/scoreboard-live","source":"curated"},{"id":"auth-crud","title":"Authenticate and perform CRUD","url":"/api/ai/skill/auth-crud","source":"curated"},{"id":"update-athlete-photo","title":"Update athlete photo","url":"/api/ai/skill/update-athlete-photo","source":"curated"},{"id":"import-participants-csv","title":"Understand participant CSV import","url":"/api/ai/skill/import-participants-csv","source":"curated"},{"id":"extract-created-id","title":"Extract created resource ID","url":"/api/ai/skill/extract-created-id","source":"curated"}]},"entityTypes":[{"id":"athletes","endpoint":"/api/athletes/","itemEndpoint":"/api/athletes/{athleteID}","description":"Athlete/person entries used by performances.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH"],"commonLinks":["Performances"],"collection":true,"source":"runtime-generated"},{"id":"competitions","endpoint":"/api/competitions/","itemEndpoint":"/api/competitions/{competitionID}","description":"Competition categories or divisions.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"actions":["command"],"commonLinks":["Stages"],"collection":true,"source":"runtime-generated"},{"id":"event","endpoint":"/api/event","description":"Root event settings and links to event-level collections.","methods":["GET","HEAD","PATCH"],"commonLinks":["Competitions","Sessions","JudgesPanels","Videos","Resources"],"source":"runtime-generated"},{"id":"frames","endpoint":"/api/frames/","itemEndpoint":"/api/frames/{frameID}","description":"Scoring/run instances connected to performances, sessions, and panels.","methods":["HEAD"],"itemMethods":["GET","HEAD","PATCH","POST"],"actions":["deduct","edit","fail","finish","go","inquiry_approve","inquiry_deduct","inquiry_edit","inquiry_mark","inquiry_override_deduct","inquiry_override_mark","inquiry_reject","inquiry_start","inquiry_submit","ready","reset"],"commonLinks":["Performances","Sessions"],"collection":true,"source":"runtime-generated"},{"id":"groups","endpoint":"/api/groups/","description":"Start-list groups inside stages.","methods":["HEAD","POST"],"commonLinks":["Stages","Sessions","Performances"],"collection":true,"source":"runtime-generated"},{"id":"judges","endpoint":"/api/judges/","itemEndpoint":"/api/judges/{judgeID}","description":"Judges used inside judges panels.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH"],"collection":true,"source":"runtime-generated"},{"id":"judgespanels","endpoint":"/api/judgespanels/","description":"Panels of judges assigned to stages.","methods":["GET","HEAD","POST"],"commonLinks":["Judges"],"collection":true,"source":"runtime-generated"},{"id":"panels","endpoint":"/api/panels/","itemEndpoint":"/api/panels/{panelID}","description":"Live judging/scoring panels.","methods":["GET"],"itemMethods":["GET","HEAD","PATCH"],"commonLinks":["Frames"],"collection":true,"source":"runtime-generated"},{"id":"performances","endpoint":"/api/performances/","itemEndpoint":"/api/performances/{performanceID}","description":"Athlete/team performance entries.","methods":["HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"actions":["swapframes"],"commonLinks":["Athletes","Groups","Frames","Sessions"],"collection":true,"source":"runtime-generated"},{"id":"resources","endpoint":"/api/resources/","itemEndpoint":"/api/resources/{resourceID}","description":"Uploaded or configured event resources.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH"],"collection":true,"source":"runtime-generated"},{"id":"scoreboards","endpoint":"/api/scoreboards/","itemEndpoint":"/api/scoreboards/{scoreboardID}","description":"Scoreboard display state.","methods":["GET","HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"commonLinks":["Panels"],"collection":true,"source":"runtime-generated"},{"id":"sessions","endpoint":"/api/sessions/","itemEndpoint":"/api/sessions/{sessionID}","description":"Schedule sessions and their frames/groups.","methods":["HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"actions":["addRef","generate","removeRef","reorderRef"],"commonLinks":["Groups","Frames"],"collection":true,"source":"runtime-generated"},{"id":"stages","endpoint":"/api/stages/","itemEndpoint":"/api/stages/{stageID}","description":"Rounds or phases of a competition.","methods":["HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH","POST"],"actions":["advance","advance_","advance_teams","assign_numbers_in_teams","draw","duplicate","ensure_present","mix_teams"],"commonLinks":["Competitions","Groups","JudgesPanels"],"collection":true,"source":"runtime-generated"},{"id":"videos","endpoint":"/api/videos/","itemEndpoint":"/api/videos/{videoID}","description":"Video resources linked to the event.","methods":["HEAD","POST"],"itemMethods":["DELETE","GET","HEAD","PATCH"],"collection":true,"source":"runtime-generated"}],"fetchFlags":[{"flag":"fetch_event=true","description":"Enable fetch expansion: event.","source":"code-derived"},{"flag":"fetch_panels=true","description":"Enable fetch expansion: panels.","source":"code-derived"},{"flag":"fetch_event_competitions=true","description":"Enable fetch expansion: event -\u003e competitions.","source":"code-derived"},{"flag":"fetch_event_sessions=true","description":"Enable fetch expansion: event -\u003e sessions.","source":"code-derived"},{"flag":"fetch_event_judges_panels=true","description":"Enable fetch expansion: event -\u003e judges -\u003e panels.","source":"code-derived"},{"flag":"fetch_event_videos=true","description":"Enable fetch expansion: event -\u003e videos.","source":"code-derived"},{"flag":"fetch_competition_stages=true","description":"Enable fetch expansion: competition -\u003e stages.","source":"code-derived"},{"flag":"fetch_stage_competitions=true","description":"Enable fetch expansion: stage -\u003e competitions.","source":"code-derived"},{"flag":"fetch_stage_medalists=true","description":"Enable fetch expansion: stage -\u003e medalists.","source":"code-derived"},{"flag":"fetch_stage_groups=true","description":"Enable fetch expansion: stage -\u003e groups.","source":"code-derived"},{"flag":"fetch_stage_judges_panels=true","description":"Enable fetch expansion: stage -\u003e judges -\u003e panels.","source":"code-derived"},{"flag":"fetch_group_stages=true","description":"Enable fetch expansion: group -\u003e stages.","source":"code-derived"},{"flag":"fetch_group_sessions=true","description":"Enable fetch expansion: group -\u003e sessions.","source":"code-derived"},{"flag":"fetch_group_performances=true","description":"Enable fetch expansion: group -\u003e performances.","source":"code-derived"},{"flag":"fetch_session_groups=true","description":"Enable fetch expansion: session -\u003e groups.","source":"code-derived"},{"flag":"fetch_session_frames=true","description":"Enable fetch expansion: session -\u003e frames.","source":"code-derived"},{"flag":"fetch_performance_groups=true","description":"Enable fetch expansion: performance -\u003e groups.","source":"code-derived"},{"flag":"fetch_performance_frames=true","description":"Enable fetch expansion: performance -\u003e frames.","source":"code-derived"},{"flag":"fetch_performance_athletes=true","description":"Enable fetch expansion: performance -\u003e athletes.","source":"code-derived"},{"flag":"fetch_performance_sessions=true","description":"Enable fetch expansion: performance -\u003e sessions.","source":"code-derived"},{"flag":"fetch_frame_performances=true","description":"Enable fetch expansion: frame -\u003e performances.","source":"code-derived"},{"flag":"fetch_frame_sessions=true","description":"Enable fetch expansion: frame -\u003e sessions.","source":"code-derived"},{"flag":"fetch_frame_tmd_data=true","description":"Enable fetch expansion: frame -\u003e tmd -\u003e data.","source":"code-derived"},{"flag":"fetch_frame_judge_deducts=true","description":"Enable fetch expansion: frame -\u003e judge -\u003e deducts.","source":"code-derived"},{"flag":"fetch_frame_judge_stats=true","description":"Enable fetch expansion: frame -\u003e judge -\u003e stats.","source":"code-derived"},{"flag":"fetch_scoreboard_panels=true","description":"Enable fetch expansion: scoreboard -\u003e panels.","source":"code-derived"},{"flag":"fetch_scoreboard_tasks=true","description":"Enable fetch expansion: scoreboard -\u003e tasks.","source":"code-derived"},{"flag":"fetch_panel_frames=true","description":"Enable fetch expansion: panel -\u003e frames.","source":"code-derived"},{"flag":"fetch_athlete_performances=true","description":"Enable fetch expansion: athlete -\u003e performances.","source":"code-derived"},{"flag":"fetch_judges_panel_judges=true","description":"Enable fetch expansion: judges -\u003e panel -\u003e judges.","source":"code-derived"},{"flag":"fetch_event_resources=true","description":"Enable fetch expansion: event -\u003e resources.","source":"code-derived"}],"actions":[{"id":"competitions.command","entity":"competitions","action":"command","method":"POST","pathTemplate":"/api/competitions/{competitionID}/command","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.deduct","entity":"frames","action":"deduct","method":"POST","pathTemplate":"/api/frames/{frameID}/deduct","authRequired":true,"status":"available","permission":"CanJudge","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.edit","entity":"frames","action":"edit","method":"POST","pathTemplate":"/api/frames/{frameID}/edit","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.fail","entity":"frames","action":"fail","method":"POST","pathTemplate":"/api/frames/{frameID}/fail","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.finish","entity":"frames","action":"finish","method":"POST","pathTemplate":"/api/frames/{frameID}/finish","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.go","entity":"frames","action":"go","method":"POST","pathTemplate":"/api/frames/{frameID}/go","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_approve","entity":"frames","action":"inquiry_approve","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_approve","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_deduct","entity":"frames","action":"inquiry_deduct","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_deduct","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_edit","entity":"frames","action":"inquiry_edit","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_edit","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_mark","entity":"frames","action":"inquiry_mark","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_mark","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_override_deduct","entity":"frames","action":"inquiry_override_deduct","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_override_deduct","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_override_mark","entity":"frames","action":"inquiry_override_mark","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_override_mark","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_reject","entity":"frames","action":"inquiry_reject","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_reject","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_start","entity":"frames","action":"inquiry_start","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_start","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.inquiry_submit","entity":"frames","action":"inquiry_submit","method":"POST","pathTemplate":"/api/frames/{frameID}/inquiry_submit","authRequired":true,"status":"available","permission":"CanInquiry","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.ready","entity":"frames","action":"ready","method":"POST","pathTemplate":"/api/frames/{frameID}/ready","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"frames.reset","entity":"frames","action":"reset","method":"POST","pathTemplate":"/api/frames/{frameID}/reset","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"performances.swapframes","entity":"performances","action":"swapframes","method":"POST","pathTemplate":"/api/performances/{performanceID}/swapframes","authRequired":true,"status":"available","permission":"CanCommandEvent","response":"204 No Content on success.","notes":["Parameters are not generated yet."],"source":"code-derived"},{"id":"sessions.addRef","entity":"sessions","action":"addRef","method":"POST","pathTemplate":"/api/sessions/{sessionID}/addRef","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"GroupID","in":"body","required":true,"type":"integer","description":"Target group ID for a session exercise reference. A session reference links one scheduled exercise/routine to a group and routine frame."},{"name":"GroupFrame","in":"body","required":true,"type":"integer","description":"Zero-based exercise/routine frame index inside the referenced group.","minimum":0,"maximum":4}],"response":"204 No Content on success.","source":"code-derived"},{"id":"sessions.generate","entity":"sessions","action":"generate","method":"POST","pathTemplate":"/api/sessions/{sessionID}/generate","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"mode","in":"body","required":true,"type":"string","description":"`create` replaces generated session frames from current session references; `append` keeps existing frames and appends new ones. Session references are links to scheduled exercises/routines.","enum":["create","append"]}],"response":"204 No Content on success.","source":"code-derived"},{"id":"sessions.removeRef","entity":"sessions","action":"removeRef","method":"POST","pathTemplate":"/api/sessions/{sessionID}/removeRef","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"GroupID","in":"body","required":true,"type":"integer","description":"Target group ID for a session exercise reference. A session reference links one scheduled exercise/routine to a group and routine frame."},{"name":"GroupFrame","in":"body","required":true,"type":"integer","description":"Zero-based exercise/routine frame index inside the referenced group.","minimum":0,"maximum":4}],"response":"204 No Content on success.","source":"code-derived"},{"id":"sessions.reorderRef","entity":"sessions","action":"reorderRef","method":"POST","pathTemplate":"/api/sessions/{sessionID}/reorderRef","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"GroupID","in":"body","required":true,"type":"integer","description":"Target group ID for the session exercise reference being moved."},{"name":"GroupFrame","in":"body","required":true,"type":"integer","description":"Zero-based exercise/routine frame index inside the referenced group.","minimum":0,"maximum":4},{"name":"n","in":"body","required":true,"type":"integer","description":"Zero-based target position inside the session reference list. Session references are links to scheduled exercises/routines.","minimum":0,"maximum":9999}],"response":"204 No Content on success.","source":"code-derived"},{"id":"stages.advance","entity":"stages","action":"advance","method":"POST","pathTemplate":"/api/stages/{stageID}/advance","authRequired":true,"status":"deprecated","deprecated":true,"permission":"CanCommandEvent","replacement":"Use client-side or agent-side finalist selection workflows; use stages.advance_ only for legacy server-side advancement.","effects":["Compatibility no-op for event log hash chain behavior."],"response":"204 No Content on success.","notes":["Deprecated and retained for backward compatibility. Current clients do not rely on this endpoint for real advancement."],"source":"curated"},{"id":"stages.advance_","entity":"stages","action":"advance_","method":"POST","pathTemplate":"/api/stages/{stageID}/advance_","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"n","in":"query","required":true,"type":"integer","description":"Number of ranked performances to advance.","example":8}],"effects":["Copies top ranked performances from this stage into the next suitable stage group."],"response":"204 No Content on success.","notes":["This is the legacy server-side advancement action. Prefer explicit client/agent selection workflows when federation rules require manual control."],"source":"curated"},{"id":"stages.advance_teams","entity":"stages","action":"advance_teams","method":"POST","pathTemplate":"/api/stages/{stageID}/advance_teams","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"n","in":"query","required":true,"type":"integer","description":"Number of teams to advance.","example":4}],"effects":["Copies ranked team performances into the next team semi-final or final stage group."],"response":"204 No Content on success.","source":"curated"},{"id":"stages.assign_numbers_in_teams","entity":"stages","action":"assign_numbers_in_teams","method":"POST","pathTemplate":"/api/stages/{stageID}/assign_numbers_in_teams","authRequired":true,"status":"available","permission":"CanCommandEvent","effects":["Assigns NumberInTeam values for team performances in all stage groups."],"response":"204 No Content on success.","source":"curated"},{"id":"stages.draw","entity":"stages","action":"draw","method":"POST","pathTemplate":"/api/stages/{stageID}/draw","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"seed","in":"query","required":true,"type":"integer","description":"Use -1 to keep collected performance order; any other integer deterministically shuffles the start list.","example":123}],"effects":["Collects performances from all groups in the stage.","Optionally shuffles them using the seed.","Redistributes performances across stage groups and updates each Performance.GroupID."],"response":"204 No Content on success.","notes":["Fails when the stage has no groups or seed is missing/not an integer."],"source":"curated"},{"id":"stages.duplicate","entity":"stages","action":"duplicate","method":"POST","pathTemplate":"/api/stages/{stageID}/duplicate","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"StageID","in":"query","required":false,"type":"id","description":"Existing target stage ID to merge into."},{"name":"CompetitionID","in":"query","required":false,"type":"id","description":"Existing target competition ID; creates a new stage there."}],"effects":["Duplicates stage setup and performances into a target stage, target competition, or a new copied competition."],"response":"204 No Content on success.","source":"curated"},{"id":"stages.ensure_present","entity":"stages","action":"ensure_present","method":"POST","pathTemplate":"/api/stages/{stageID}/ensure_present","authRequired":true,"status":"available","permission":"CanCommandEvent","parameters":[{"name":"Athletes","in":"query","required":true,"type":"id-list","description":"Athlete IDs that must be present in this stage."}],"effects":["Creates a performance in the first group when the requested athlete set is not already present."],"response":"204 No Content on success.","source":"curated"},{"id":"stages.mix_teams","entity":"stages","action":"mix_teams","method":"POST","pathTemplate":"/api/stages/{stageID}/mix_teams","authRequired":true,"status":"available","permission":"CanCommandEvent","effects":["Reorders grouped performances to mix team entries inside each group."],"response":"204 No Content on success.","source":"curated"}],"constants":[{"id":"SexNames","mapName":"SexNames","localizationPath":"/static/l10n/{locale}.l20n","source":"manual","values":[{"name":"S_MALE","value":"male","localizationTokens":["male"],"mapTo":["male"]},{"name":"S_FEMALE","value":"female","localizationTokens":["female"],"mapTo":["female"]},{"name":"S_MIX","value":"mix","localizationTokens":["mix"],"mapTo":["mix"]}]},{"id":"CompetitionTypes","mapName":"CompetitionNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"TRA","value":0,"localizationTokens":["DisciplineNameTRA","TRA","DCodeTRA"],"mapTo":["DisciplineNameTRA","TRA","10","1","DCodeTRA"]},{"name":"SYN","value":1,"localizationTokens":["DisciplineNameSYN","SYN","DCodeSYN"],"mapTo":["DisciplineNameSYN","SYN","10","2","DCodeSYN"]},{"name":"DMT","value":2,"localizationTokens":["DisciplineNameDMT","DMT","DCodeDMT"],"mapTo":["DisciplineNameDMT","DMT","2","1","DCodeDMT"]},{"name":"TUM","value":3,"localizationTokens":["DisciplineNameTUM","TUM","DCodeTUM"],"mapTo":["DisciplineNameTUM","TUM","8","1","DCodeTUM"]},{"name":"TEAM","value":4,"localizationTokens":["DisciplineNameTEAM","TEAM","DCodeTEAM"],"mapTo":["DisciplineNameTEAM","TEAM","0","1","DCodeTEAM"]}]},{"id":"CompetitionPresets","mapName":"CompetitionPresetNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"PresetAdult","value":0,"localizationTokens":["PresetAdult"],"mapTo":["PresetAdult"]},{"name":"PresetYouth","value":1,"localizationTokens":["PresetYouth"],"mapTo":["PresetYouth"]},{"name":"Preset2026AgeGroups","value":2,"localizationTokens":["Preset2026AgeGroups"],"mapTo":["Preset2026AgeGroups"]}]},{"id":"StageKinds","mapName":"StageKindNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"Qualification","value":0,"localizationTokens":["StageKindQualification","StageKindQualificationShort"],"mapTo":["StageKindQualification","StageKindQualificationShort"]},{"name":"QuarterFinal","value":1,"localizationTokens":["StageKindQuarterFinal","StageKindQuarterFinalShort"],"mapTo":["StageKindQuarterFinal","StageKindQuarterFinalShort"]},{"name":"SemiFinal","value":2,"localizationTokens":["StageKindSemiFinal","StageKindSemiFinalShort"],"mapTo":["StageKindSemiFinal","StageKindSemiFinalShort"]},{"name":"Final","value":3,"localizationTokens":["StageKindFinal","StageKindFinalShort"],"mapTo":["StageKindFinal","StageKindFinalShort"]},{"name":"TeamSemiFinal","value":4,"localizationTokens":["StageKindTeamSemiFinal","StageKindTeamSemiFinalShort"],"mapTo":["StageKindTeamSemiFinal","StageKindTeamSemiFinalShort"]},{"name":"TeamFinal","value":5,"localizationTokens":["StageKindTeamFinal","StageKindTeamFinalShort"],"mapTo":["StageKindTeamFinal","StageKindTeamFinalShort"]},{"name":"Qualification2","value":6,"localizationTokens":["StageKindQualification2","StageKindQualification2Short"],"mapTo":["StageKindQualification2","StageKindQualification2Short"]},{"name":"Final2","value":7,"localizationTokens":["StageKindFinal2","StageKindFinal2Short"],"mapTo":["StageKindFinal2","StageKindFinal2Short"]},{"name":"Final1","value":8,"localizationTokens":["StageKindFinal1","StageKindFinal1Short"],"mapTo":["StageKindFinal1","StageKindFinal1Short"]}]},{"id":"CalcGroups","mapName":"CalcGroupNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"CalculationGroup","value":0,"localizationTokens":["OptionsCalcGroup"],"mapTo":["OptionsCalcGroup"]},{"name":"TeamCalculationGroup","value":1,"localizationTokens":["OptionsTeamCalcGroup"],"mapTo":["OptionsTeamCalcGroup"]},{"name":"TiebreaksGroup","value":2,"localizationTokens":["OptionsTiebreaksGroup"],"mapTo":["OptionsTiebreaksGroup"]},{"name":"VisualGroup","value":3,"localizationTokens":["OptionsVisualGroup"],"mapTo":["OptionsVisualGroup"]},{"name":"ExperimentalGroup","value":4,"localizationTokens":["ExperimentalGroup"],"mapTo":["ExperimentalGroup"]}]},{"id":"CalcKinds","mapName":"CalcKindNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"CalcDefault","value":0,"localizationTokens":["CalcDefault"],"mapTo":["CalcDefault","CalcGroups.CalcGroupMax"]},{"name":"CalcMax2SumQ2F1F2","value":1,"localizationTokens":["CalcMax2SumQ2F1F2"],"mapTo":["CalcMax2SumQ2F1F2","CalcGroups.CalculationGroup"]},{"name":"CalcAddRefJudgesToResult","value":2,"localizationTokens":["CalcAddRefJudgesToResults"],"mapTo":["CalcAddRefJudgesToResults","CalcGroups.ExperimentalGroup"]},{"name":"CalcCroppedAvg","value":3,"localizationTokens":["CalcCroppedAvg"],"mapTo":["CalcCroppedAvg","CalcGroups.CalculationGroup"]},{"name":"CalcAddPrevStageResult","value":4,"localizationTokens":["StageAddPrevStageResult"],"mapTo":["StageAddPrevStageResult","CalcGroups.CalculationGroup"]},{"name":"CalcBestRoutineAsResult","value":5,"localizationTokens":["CalcBestRoutineAsResult"],"mapTo":["CalcBestRoutineAsResult","CalcGroups.CalculationGroup"]},{"name":"CalcLastRoutineAsResult","value":6,"localizationTokens":["CalcLastRoutineAsResult"],"mapTo":["CalcLastRoutineAsResult","CalcGroups.ExperimentalGroup"]},{"name":"Calc2017Scores","value":7,"localizationTokens":["Calc2017Scores"],"mapTo":["Calc2017Scores","CalcGroups.VisualGroup"]},{"name":"CalcUseRanksForTeamScores","value":8,"localizationTokens":["CalcUseRanksForTeamScores"],"mapTo":["CalcUseRanksForTeamScores","CalcGroups.TeamCalculationGroup"]},{"name":"CalcShowMedalists","value":9,"localizationTokens":["CalcShowMedalists"],"mapTo":["CalcShowMedalists","CalcGroups.VisualGroup"]},{"name":"CalcQualifyFirstInGroup","value":10,"localizationTokens":["CalcQualifyFirstInGroup"],"mapTo":["CalcQualifyFirstInGroup","CalcGroups.CalculationGroup"]},{"name":"UseE1AsReferenceForHL","value":11,"localizationTokens":["CalcUseE1AsReferenceForHL"],"mapTo":["CalcUseE1AsReferenceForHL","CalcGroups.VisualGroup"]},{"name":"UseWAGCTieBreaks","value":12,"localizationTokens":["CalcUseWAGCTieBreaks"],"mapTo":["CalcUseWAGCTieBreaks","CalcGroups.TiebreaksGroup"]},{"name":"CalcIgnoreToFFromHDTMD","value":13,"localizationTokens":["CalcIgnoreToFFromHDTMD"],"mapTo":["CalcIgnoreToFFromHDTMD","CalcGroups.ExperimentalGroup"]},{"name":"CalcUsePerSkillDiff","value":14,"localizationTokens":["CalcUsePerSkillDiff"],"mapTo":["CalcUsePerSkillDiff","CalcGroups.CalculationGroup"]},{"name":"CalcUse7forDMT1Skill","value":15,"localizationTokens":["CalcUse7forDMT1Skill"],"mapTo":["CalcUse7forDMT1Skill","CalcGroups.ExperimentalGroup"]},{"name":"CalcAvgX2","value":16,"localizationTokens":["CalcAvgX2"],"mapTo":["CalcAvgX2","CalcGroups.CalculationGroup"]},{"name":"CalcAvgX3","value":17,"localizationTokens":["CalcAvgX3"],"mapTo":["CalcAvgX3","CalcGroups.CalculationGroup"]},{"name":"CalcUseGuestStyleUnranked","value":18,"localizationTokens":["CalcUseGuestStyleUnranked"],"mapTo":["CalcUseGuestStyleUnranked","CalcGroups.ExperimentalGroup"]},{"name":"CalcAddSumAllRoutinesAsFirstTiebreak","value":19,"localizationTokens":["CalcAddSumAllRoutinesAsFirstTiebreak"],"mapTo":["CalcAddSumAllRoutinesAsFirstTiebreak","CalcGroups.TiebreaksGroup"]},{"name":"CalcShowSumWithPrevStage","value":20,"localizationTokens":["CalcShowSumWithPrevStage"],"mapTo":["CalcShowSumWithPrevStage","CalcGroups.ExperimentalGroup"]},{"name":"CalcUseDTextInputs","value":21,"localizationTokens":["CalcUseDTextInputs"],"mapTo":["CalcUseDTextInputs","CalcGroups.CalculationGroup"]},{"name":"Calc2DigitsToFCut","value":22,"localizationTokens":["Calc2DigitsToFCut"],"mapTo":["Calc2DigitsToFCut","CalcGroups.CalculationGroup"]},{"name":"CalcShowSumOfRoutines","value":23,"localizationTokens":["CalcShowSumOfRoutines"],"mapTo":["CalcShowSumOfRoutines","CalcGroups.VisualGroup"]},{"name":"CalcNoTiebreaks","value":24,"localizationTokens":["CalcNoTiebreaks"],"mapTo":["CalcNoTiebreaks","CalcGroups.TiebreaksGroup"]},{"name":"CalcUseTotalsForTeamScores","value":25,"localizationTokens":["CalcUseTotalsForTeamScores"],"mapTo":["CalcUseTotalsForTeamScores","CalcGroups.TeamCalculationGroup"]},{"name":"CalcAllowManualHDInput","value":26,"localizationTokens":["CalcAllowManualHDInput"],"mapTo":["CalcAllowManualHDInput","CalcGroups.ExperimentalGroup"]},{"name":"CalcForceLandingDeduction","value":27,"localizationTokens":["CalcForceLandingDeduction"],"mapTo":["CalcForceLandingDeduction","CalcGroups.ExperimentalGroup"]},{"name":"CalcUseBestScoresMaxOneFromAthlete","value":28,"localizationTokens":["CalcUseBestScoresMaxOneFromAthlete"],"mapTo":["CalcUseBestScoresMaxOneFromAthlete","CalcGroups.TeamCalculationGroup"]},{"name":"CalcUseRanks2025ForTeamScores","value":29,"localizationTokens":["CalcUseRanks2025ForTeamScores"],"mapTo":["CalcUseRanks2025ForTeamScores","CalcGroups.TeamCalculationGroup"]},{"name":"CalcUse8forDMT1Skill","value":30,"localizationTokens":["CalcUse8forDMT1Skill"],"mapTo":["CalcUse8forDMT1Skill","CalcGroups.CalculationGroup"]},{"name":"CalcUseCustomTiebreaks","value":31,"localizationTokens":["CalcUseCustomTiebreaks"],"mapTo":["CalcUseCustomTiebreaks","CalcGroups.TiebreaksGroup"]},{"name":"CalcUseLastRoutineAsCountingForTiebreaks","value":32,"localizationTokens":["CalcUseLastRoutineAsCountingForTiebreaks"],"mapTo":["CalcUseLastRoutineAsCountingForTiebreaks","CalcGroups.TiebreaksGroup"]},{"name":"CalcUseMedianETotalsX2ForE","value":33,"localizationTokens":["CalcUseMedianETotalsX2ForE"],"mapTo":["CalcUseMedianETotalsX2ForE","CalcGroups.ExperimentalGroup"]},{"name":"CalcRoundE2Digits","value":34,"localizationTokens":["CalcRoundE2Digits"],"mapTo":["CalcRoundE2Digits","CalcGroups.CalculationGroup"]},{"name":"CalcRoundDownE2Digits","value":35,"localizationTokens":["CalcRoundDownE2Digits"],"mapTo":["CalcRoundDownE2Digits","CalcGroups.CalculationGroup"]},{"name":"CalcPickBestFromCurrentAndPrevStage","value":36,"localizationTokens":["CalcPickBestFromCurrentAndPrevStage"],"mapTo":["CalcPickBestFromCurrentAndPrevStage","CalcGroups.ExperimentalGroup"]},{"name":"CalcUseCustomTeamTiebreaks","value":37,"localizationTokens":["CalcUseCustomTeamTiebreaks"],"mapTo":["CalcUseCustomTeamTiebreaks","CalcGroups.TiebreaksGroup"]}]},{"id":"Tiebreakers","mapName":"TiebreakerNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"TiebreakerNone","value":0,"localizationTokens":["TiebreakerNone"],"mapTo":["TiebreakerNone"]},{"name":"TiebreakerCountingHighestTS","value":1,"localizationTokens":["TiebreakerCountingHighestTS"],"mapTo":["TiebreakerCountingHighestTS"]},{"name":"TiebreakerCountingHighestH","value":2,"localizationTokens":["TiebreakerCountingHighestH"],"mapTo":["TiebreakerCountingHighestH"]},{"name":"TiebreakerCountingHighestD","value":3,"localizationTokens":["TiebreakerCountingHighestD"],"mapTo":["TiebreakerCountingHighestD"]},{"name":"TiebreakerCountingHighestSumOfAllE","value":4,"localizationTokens":["TiebreakerCountingHighestSumOfAllE"],"mapTo":["TiebreakerCountingHighestSumOfAllE"]},{"name":"TiebreakerAllExercisesHighestSumOfScores","value":5,"localizationTokens":["TiebreakerAllExercisesHighestSumOfScores"],"mapTo":["TiebreakerAllExercisesHighestSumOfScores"]},{"name":"TiebreakerAllExercisesHighestSumOfAllD","value":6,"localizationTokens":["TiebreakerAllExercisesHighestSumOfAllD"],"mapTo":["TiebreakerAllExercisesHighestSumOfAllD"]},{"name":"TiebreakerAllExercisesHighestSumOfAllE","value":7,"localizationTokens":["TiebreakerAllExercisesHighestSumOfAllE"],"mapTo":["TiebreakerAllExercisesHighestSumOfAllE"]},{"name":"TiebreakerAllExercisesLowestSumOfCjpP","value":8,"localizationTokens":["TiebreakerAllExercisesLowestSumOfCjpP"],"mapTo":["TiebreakerAllExercisesLowestSumOfCjpP"]},{"name":"TiebreakerAllExercisesHighestMaxD","value":9,"localizationTokens":["TiebreakerAllExercisesHighestMaxD"],"mapTo":["TiebreakerAllExercisesHighestMaxD"]},{"name":"TiebreakerPrevStageHighestRanking","value":10,"localizationTokens":["TiebreakerPrevStageHighestRanking"],"mapTo":["TiebreakerPrevStageHighestRanking"]},{"name":"TiebreakerQStageHighestRanking","value":11,"localizationTokens":["TiebreakerQStageHighestRanking"],"mapTo":["TiebreakerQStageHighestRanking"]},{"name":"TiebreakerCountLowestSumOfDeductions","value":12,"localizationTokens":["TiebreakerCountLowestSumOfDeductions"],"mapTo":["TiebreakerCountLowestSumOfDeductions"]},{"name":"TiebreakerAllExercisesWithPrevStageHighestSumOfScores","value":13,"localizationTokens":["TiebreakerAllExercisesWithPrevStageHighestSumOfScores"],"mapTo":["TiebreakerAllExercisesWithPrevStageHighestSumOfScores"]},{"name":"TiebreakerLastExerciseHighestTS","value":14,"localizationTokens":["TiebreakerLastExerciseHighestTS"],"mapTo":["TiebreakerLastExerciseHighestTS"]},{"name":"TiebreakerLastExerciseHighestH","value":15,"localizationTokens":["TiebreakerLastExerciseHighestH"],"mapTo":["TiebreakerLastExerciseHighestH"]},{"name":"TiebreakerLastExerciseHighestD","value":16,"localizationTokens":["TiebreakerLastExerciseHighestD"],"mapTo":["TiebreakerLastExerciseHighestD"]}]},{"id":"TeamTiebreakers","mapName":"TeamTiebreakerNames","localizationPath":"/static/l10n/{locale}.l20n","source":"code-derived","values":[{"name":"TeamTiebreakerNone","value":0,"localizationTokens":["TeamTiebreakerNone"],"mapTo":["TeamTiebreakerNone"]},{"name":"TeamTiebreakerSumT","value":1,"localizationTokens":["TeamTiebreakerSumT"],"mapTo":["TeamTiebreakerSumT"]},{"name":"TeamTiebreakerSumH","value":2,"localizationTokens":["TeamTiebreakerSumH"],"mapTo":["TeamTiebreakerSumH"]},{"name":"TeamTiebreakerSumD","value":3,"localizationTokens":["TeamTiebreakerSumD"],"mapTo":["TeamTiebreakerSumD"]},{"name":"TeamTiebreakerSumE","value":4,"localizationTokens":["TeamTiebreakerSumE"],"mapTo":["TeamTiebreakerSumE"]},{"name":"TeamTiebreakerBestD","value":5,"localizationTokens":["TeamTiebreakerBestD"],"mapTo":["TeamTiebreakerBestD"]},{"name":"TeamTiebreakerBestS","value":6,"localizationTokens":["TeamTiebreakerBestS"],"mapTo":["TeamTiebreakerBestS"]},{"name":"TeamTiebreakerSumBestFromE_NMembers","value":7,"localizationTokens":["TeamTiebreakerSumBestFromE_NMembers"],"mapTo":["TeamTiebreakerSumBestFromE_NMembers"]},{"name":"TeamTiebreakerSumBestFromE_NMinus1","value":8,"localizationTokens":["TeamTiebreakerSumBestFromE_NMinus1"],"mapTo":["TeamTiebreakerSumBestFromE_NMinus1"]},{"name":"TeamTiebreakerSumS","value":9,"localizationTokens":["TeamTiebreakerSumS"],"mapTo":["TeamTiebreakerSumS"]},{"name":"TeamTiebreakerSumBestFromAllRoutinesD_N","value":10,"localizationTokens":["TeamTiebreakerSumBestFromAllRoutinesD_N"],"mapTo":["TeamTiebreakerSumBestFromAllRoutinesD_N"]},{"name":"TeamTiebreakerSumBestFromAllRoutinesD_NMinus1","value":11,"localizationTokens":["TeamTiebreakerSumBestFromAllRoutinesD_NMinus1"],"mapTo":["TeamTiebreakerSumBestFromAllRoutinesD_NMinus1"]},{"name":"TeamTiebreakerSumBestFromAllRoutinesD_NMinus2","value":12,"localizationTokens":["TeamTiebreakerSumBestFromAllRoutinesD_NMinus2"],"mapTo":["TeamTiebreakerSumBestFromAllRoutinesD_NMinus2"]}]}],"fieldFormats":[{"entity":"Performance","field":"MarkTTT_G","storage":"integer thousandths","display":"decimal score","scale":1000,"decimals":3,"exampleRaw":63110,"exampleDisplay":"63.110","notes":["Format by dividing by 1000 and keeping exactly 3 decimal digits."],"source":"code-derived"},{"entity":"Performance","field":"TeamMarkTTT_G","storage":"integer thousandths","display":"decimal score","scale":1000,"decimals":3,"exampleRaw":63110,"exampleDisplay":"63.110","notes":["Format by dividing by 1000 and keeping exactly 3 decimal digits."],"source":"code-derived"},{"entity":"Frame","field":"MarkTTT_G","storage":"integer thousandths","display":"decimal score","scale":1000,"decimals":3,"exampleRaw":63110,"exampleDisplay":"63.110","notes":["Format by dividing by 1000 and keeping exactly 3 decimal digits."],"source":"code-derived"},{"entity":"Athlete","field":"displayName","storage":"composed fields","display":"Surname GivenName Patronymic","exampleRaw":{"GivenName":"Ivan","Patronymic":"Petrovich","Surname":"Testov"},"exampleDisplay":"Testov Ivan Petrovich","notes":["Skip empty name parts when composing display text."],"source":"manual"},{"entity":"Athlete","field":"Representing","storage":"string","display":"region or federation text","exampleRaw":"Test Region","exampleDisplay":"Test Region","source":"manual"},{"entity":"Athlete","field":"DateOfBirth","storage":"RFC3339 string for writes","display":"date","exampleRaw":"2008-01-01T00:00:00Z","exampleDisplay":"2008-01-01","notes":["PATCH requests must send DateOfBirth as an RFC3339 string."],"source":"manual"}],"fieldDocs":[{"entity":"Person","field":"ExternalID","summary":"External identifier from an upstream registration, CRM, or federation system.","readFormat":"Non-negative integer.","writeFormat":"Use a non-negative integer when preserving an external system identity.","notes":["Do not confuse ExternalID with the server numeric entity ID from URLs or Location headers.","Use GUID when the upstream system has a stable string UUID-like identifier."],"source":"curated"},{"entity":"Athlete","field":"DateOfBirth","summary":"Athlete date of birth used by matching, category filters, exports, and participant import.","readFormat":"API mutations use RFC3339 timestamps; CSV import may use the event DateOfBirth format.","writeFormat":"Use RFC3339 for direct API PATCH/POST, for example 2008-01-01T00:00:00Z.","notes":["CSV export uses the legacy 02/01/2006 display format.","Participant import can parse a model/event-specific DateOfBirth format described in importFormats."],"source":"curated"},{"entity":"Athlete","field":"Sex","summary":"Athlete sex used by matching, category filters, imports, and display.","readFormat":"String value.","writeFormat":"Use male or female for participant import and direct API writes.","constants":["SexNames"],"notes":["Some competition/category contexts can also use mix, but individual athlete values should be male or female."],"source":"curated"},{"entity":"Session","field":"Time","summary":"Human schedule label for a session.","readFormat":"String.","writeFormat":"Use a plain string; it can be a time, range, or comment-style schedule label.","notes":["The server does not parse this field as a timestamp.","Use Number for sortable session order and Time for human-facing schedule text."],"source":"curated"},{"entity":"Session","field":"SessionTitle","summary":"Human-facing session title.","readFormat":"String.","writeFormat":"PATCH as SessionTitle with a plain string.","notes":["The API field is SessionTitle, not Title.","Use SessionTitle for the displayed session name, Number for sortable order, and Time for schedule text."],"source":"curated"},{"entity":"Session","field":"Number","summary":"Human/session order number.","readFormat":"Integer.","writeFormat":"Positive integer.","notes":["Use Number for sortable session order and Time for human-facing schedule text."],"source":"curated"},{"entity":"Session","field":"RotationView","summary":"Selects how session frames are grouped into visual rotations and labeled in the session view.","readFormat":"Integer mode index.","writeFormat":"PATCH as RotationView; the standard client defines modes 0 through 7.","notes":["RotationView changes the presentation and grouping headers derived from Session.Frames; it does not reorder or regenerate the frames.","Modes cover no grouping, participant grouping, routine grouping, competition grouping, and variants that keep missing exercise references visible."],"source":"curated"},{"entity":"Competition","field":"Discipline","summary":"TRA competition discipline, such as trampoline, synchronized trampoline, double mini-trampoline, tumbling, or team.","readFormat":"Integer enum value.","writeFormat":"Use values from CompetitionTypes; do not guess numeric discipline IDs.","constants":["CompetitionTypes"],"notes":["Changing discipline can be rejected when existing performances would become invalid for the new discipline.","Human-readable names and discipline codes can be resolved through constants and localization tokens."],"source":"curated"},{"entity":"Session","field":"Groups","summary":"Ordered session exercise references included in this session.","readFormat":"Array of group IDs.","writeFormat":"Use session actions such as sessions.addRef, sessions.removeRef, and sessions.reorderRef instead of patching the array directly.","notes":["A session reference is a link to a scheduled exercise/routine, represented by GroupID plus GroupFrame.","Groups and GroupFrame are parallel arrays; Groups[i] uses GroupFrame[i].","After changing session references, call sessions.generate to build or update Frames."],"source":"curated"},{"entity":"Session","field":"GroupFrame","summary":"Exercise/routine frame index for each referenced session group.","readFormat":"Integer array parallel to Session.Groups.","writeFormat":"Use zero-based frame indexes through session reference actions.","notes":["A session reference is a link to a scheduled exercise/routine, represented by GroupID plus GroupFrame.","Groups and GroupFrame are parallel arrays and must stay the same length.","GroupFrame values identify which exercise/routine frame of a group is scheduled."],"source":"curated"},{"entity":"Session","field":"Frames","summary":"Generated ordered frame list used by the live session workflow.","readFormat":"Array of frame IDs.","writeFormat":"Do not construct manually for normal scheduling; use sessions.generate after updating session references.","notes":["Session references are links to scheduled exercises/routines; sessions.generate converts them into concrete Frames.","sessions.generate with mode=create replaces generated frames from current session references.","sessions.generate with mode=append keeps existing frames and appends new generated frames."],"source":"curated"},{"entity":"Stage","field":"PerfomanceFramesLimit","summary":"Maximum number of routines expected for each performance in this stage.","readFormat":"Integer from 0 to 4.","writeFormat":"PATCH with an integer from 0 to 4.","notes":["Use 1 for single-routine final stages such as Final2 when the competition rules require one routine.","The field name is spelled PerfomanceFramesLimit in the API for backward compatibility."],"source":"curated"},{"entity":"Stage","field":"CalcOptions","summary":"Stage calculation options represented as a list of enabled CalcKinds indexes.","readFormat":"Integer list of enabled option indexes.","writeFormat":"PATCH with an integer array built from CalcKinds constants.","constants":["CalcKinds"],"notes":["Use constants/localization metadata to explain values; do not hard-code magic numbers without resolving CalcKinds.","Some options are mutually constrained by server validation and stage/discipline rules."],"source":"curated"},{"entity":"Stage","field":"Tiebreakers","summary":"Ordered stage tie-breaker rules used to resolve equal ranks.","readFormat":"Integer list with fixed maximum length; zero values usually represent no further tie-breaker.","writeFormat":"PATCH with an integer array built from Tiebreakers constants.","constants":["Tiebreakers"],"notes":["Use localization tokens from constants for human-readable descriptions.","Team tie-breakers are a separate field and use TeamTiebreakers constants."],"source":"curated"}],"importFormats":[{"id":"participants-csv","title":"Participants CSV import","source":"code-derived","appliesTo":["TRA"],"entryPoints":["UI: event page participant import widget.","UI: stage control participant import widget.","UI: settings import/export participant import widget.","Client/UI import uses TRA.dataimport.importStageFromFileDictionary for an existing stage.","Client/UI import uses TRA.dataimport.importDisciplineFromFileDictionary for a discipline/competition import."],"supportedFiles":[".csv",".xlsx"],"encoding":["UTF-8 for text files; browser spreadsheet reader for .xlsx"],"delimiters":["auto-detected by Papa Parse for .csv, commonly ;, comma, or tab"],"headerRow":true,"entities":[{"entity":"Competition","required":["Title"],"optional":["TitleLocalised","GUID_C","ExtensionJson","AgeGroup","Level","SexCategory","Preset","Discipline","DisciplineCode"],"columns":[{"column":"Competition: Title","entity":"Competition","field":"Title","required":true,"source":"code-derived"},{"column":"Competition: TitleLocalised","entity":"Competition","field":"TitleLocalised","source":"code-derived"},{"column":"Competition: GUID_C","entity":"Competition","field":"GUID_C","source":"code-derived"},{"column":"Competition: ExtensionJson","entity":"Competition","field":"ExtensionJson","source":"code-derived"},{"column":"Competition: AgeGroup","entity":"Competition","field":"AgeGroup","source":"code-derived"},{"column":"Competition: Level","entity":"Competition","field":"Level","source":"code-derived"},{"column":"Competition: SexCategory","entity":"Competition","field":"SexCategory","source":"code-derived"},{"column":"Competition: Preset","entity":"Competition","field":"Preset","parser":"number","source":"code-derived"},{"column":"Competition: Discipline","entity":"Competition","field":"Discipline","parser":"number","source":"code-derived"},{"column":"Competition: DisciplineCode","entity":"Competition","field":"DisciplineCode","parser":"discipline-code","aliases":["DisciplineCode"],"constants":["CompetitionTypes","CodesDiscipline"],"notes":["Import-only column mapped to Competition.Discipline by the client."],"source":"code-derived"}],"source":"code-derived"},{"entity":"Stage","optional":["QLimitToFilter","QReserveCount","QRepresentMaxFilter","ExportFigAR","ExtensionJson","PerfomanceFramesLimit","CalcOptions","Tiebreakers","TeamTiebreakers","Group"],"columns":[{"column":"Stage: QLimitToFilter","entity":"Stage","field":"QLimitToFilter","parser":"number","source":"code-derived"},{"column":"Stage: QReserveCount","entity":"Stage","field":"QReserveCount","parser":"number","source":"code-derived"},{"column":"Stage: QRepresentMaxFilter","entity":"Stage","field":"QRepresentMaxFilter","parser":"number","source":"code-derived"},{"column":"Stage: ExportFigAR","entity":"Stage","field":"ExportFigAR","parser":"bool","source":"code-derived"},{"column":"Stage: ExtensionJson","entity":"Stage","field":"ExtensionJson","source":"code-derived"},{"column":"Stage: PerfomanceFramesLimit","entity":"Stage","field":"PerfomanceFramesLimit","parser":"number","source":"code-derived"},{"column":"Stage: CalcOptions","entity":"Stage","field":"CalcOptions","parser":"number-list","source":"code-derived"},{"column":"Stage: Tiebreakers","entity":"Stage","field":"Tiebreakers","parser":"number-list","source":"code-derived"},{"column":"Stage: TeamTiebreakers","entity":"Stage","field":"TeamTiebreakers","parser":"number-list","source":"code-derived"},{"column":"Stage: Group","entity":"Stage","field":"Group","parser":"number","default":1,"aliases":["Group"],"notes":["Import-only column injected by gymnastics.dataimport.Importer."],"source":"code-derived"}],"source":"code-derived"},{"entity":"Group","source":"code-derived"},{"entity":"Performance","optional":["Ranked","Description","GroupName","GroupPhotoURL","Team","NumberInTeam"],"columns":[{"column":"Performance: Ranked","entity":"Performance","field":"Ranked","parser":"bool","default":true,"source":"code-derived"},{"column":"Performance: Description","entity":"Performance","field":"Description","source":"code-derived"},{"column":"Performance: GroupName","entity":"Performance","field":"GroupName","source":"code-derived"},{"column":"Performance: GroupPhotoURL","entity":"Performance","field":"GroupPhotoURL","source":"code-derived"},{"column":"Performance: Team","entity":"Performance","field":"Team","parser":"number","source":"code-derived"},{"column":"Performance: NumberInTeam","entity":"Performance","field":"NumberInTeam","parser":"number","source":"code-derived"}],"source":"code-derived"},{"entity":"Athlete","required":["Surname","GivenName"],"optional":["GUID","ExternalID","Patronymic","PhotoURL","Representing","Representing2","SurnameLocalised","GivenNameLocalised","PatronymicLocalised","RepresentingLocalised","DateOfBirth","Sex","Level","Coach","CoachLocalised"],"columns":[{"column":"Athlete: GUID","entity":"Athlete","field":"GUID","source":"code-derived"},{"column":"Athlete: ExternalID","entity":"Athlete","field":"ExternalID","parser":"number","source":"code-derived"},{"column":"Athlete: Surname","entity":"Athlete","field":"Surname","required":true,"source":"code-derived"},{"column":"Athlete: GivenName","entity":"Athlete","field":"GivenName","required":true,"source":"code-derived"},{"column":"Athlete: Patronymic","entity":"Athlete","field":"Patronymic","source":"code-derived"},{"column":"Athlete: PhotoURL","entity":"Athlete","field":"PhotoURL","source":"code-derived"},{"column":"Athlete: Representing","entity":"Athlete","field":"Representing","source":"code-derived"},{"column":"Athlete: Representing2","entity":"Athlete","field":"Representing2","source":"code-derived"},{"column":"Athlete: SurnameLocalised","entity":"Athlete","field":"SurnameLocalised","source":"code-derived"},{"column":"Athlete: GivenNameLocalised","entity":"Athlete","field":"GivenNameLocalised","source":"code-derived"},{"column":"Athlete: PatronymicLocalised","entity":"Athlete","field":"PatronymicLocalised","source":"code-derived"},{"column":"Athlete: RepresentingLocalised","entity":"Athlete","field":"RepresentingLocalised","source":"code-derived"},{"column":"Athlete: DateOfBirth","entity":"Athlete","field":"DateOfBirth","parser":"date","source":"code-derived"},{"column":"Athlete: Sex","entity":"Athlete","field":"Sex","constants":["SexNames"],"notes":["Participant import UI/l10n documents male and female values for this column."],"source":"code-derived"},{"column":"Athlete: Level","entity":"Athlete","field":"Level","source":"code-derived"},{"column":"Athlete: Coach","entity":"Athlete","field":"Coach","source":"code-derived"},{"column":"Athlete: CoachLocalised","entity":"Athlete","field":"CoachLocalised","source":"code-derived"}],"source":"code-derived"}],"workflows":[{"id":"stage","description":"Import rows into an existing stage; rows are grouped by Stage.Group and chunked by athlete count for the discipline.","requiredColumns":["Athlete: Surname","Athlete: GivenName"],"optionalColumns":["Stage: QLimitToFilter","Stage: QReserveCount","Stage: QRepresentMaxFilter","Stage: ExportFigAR","Stage: ExtensionJson","Stage: PerfomanceFramesLimit","Stage: CalcOptions","Stage: Tiebreakers","Stage: TeamTiebreakers","Stage: Group","Performance: Ranked","Performance: Description","Performance: GroupName","Performance: GroupPhotoURL","Performance: Team","Performance: NumberInTeam","Athlete: GUID","Athlete: ExternalID","Athlete: Patronymic","Athlete: PhotoURL","Athlete: Representing","Athlete: Representing2","Athlete: SurnameLocalised","Athlete: GivenNameLocalised","Athlete: PatronymicLocalised","Athlete: RepresentingLocalised","Athlete: DateOfBirth","Athlete: Sex","Athlete: Level","Athlete: Coach","Athlete: CoachLocalised"],"effects":["Creates missing Groups under the target Stage.","POSTs Performances under each Group.","Finds matching Athletes through /api/athletes/ with min_score=0.99 unless matching is disabled.","PATCHes Performance.Athletes and imported Athlete/Performance fields."]},{"id":"discipline","description":"Import rows grouped by Competition.Discipline and Competition.Title, creating or reusing competitions and their first stage.","requiredColumns":["Competition: Title","Athlete: Surname","Athlete: GivenName"],"optionalColumns":["Competition: TitleLocalised","Competition: GUID_C","Competition: ExtensionJson","Competition: AgeGroup","Competition: Level","Competition: SexCategory","Competition: Preset","Competition: Discipline","Competition: DisciplineCode","Stage: QLimitToFilter","Stage: QReserveCount","Stage: QRepresentMaxFilter","Stage: ExportFigAR","Stage: ExtensionJson","Stage: PerfomanceFramesLimit","Stage: CalcOptions","Stage: Tiebreakers","Stage: TeamTiebreakers","Stage: Group","Performance: Ranked","Performance: Description","Performance: GroupName","Performance: GroupPhotoURL","Performance: Team","Performance: NumberInTeam","Athlete: GUID","Athlete: ExternalID","Athlete: Patronymic","Athlete: PhotoURL","Athlete: Representing","Athlete: Representing2","Athlete: SurnameLocalised","Athlete: GivenNameLocalised","Athlete: PatronymicLocalised","Athlete: RepresentingLocalised","Athlete: DateOfBirth","Athlete: Sex","Athlete: Level","Athlete: Coach","Athlete: CoachLocalised"],"effects":["GETs /api/event?fetch_event_competitions=true and reuses competitions by Discipline+Title.","POSTs /api/competitions/ with Discipline, Title, and Preset when no match exists.","PATCHes imported Competition fields, then imports rows into the competition's first Stage."]}],"deduplication":["Existing competitions are matched by Competition.Discipline + Competition.Title.","Athlete lookup sends imported Athlete fields to /api/athletes/ with min_score=0.99.","When duplicate normalized headers exist, current client asks whether to use the first duplicate column; without dialog service it uses the first duplicate."],"effects":["CSV import is a client workflow that performs normal REST API calls; there is no dedicated backend CSV upload endpoint in this metadata.","Repeated import can create additional performances; athlete records may be matched and patched."],"notes":["Header row is required for the current dictionary import path.","Use qualified headers such as Athlete: Surname to avoid ambiguity; the sample UI may prefix required columns with (R).","DateOfBirth parser follows event DoBFormat when provided by the event settings; otherwise it uses the default client date parser.","Sex accepts values handled by common.datatable.parseSex; prefer constants from SexNames where possible.","Competition.DisciplineCode is import-only and is converted to Competition.Discipline by the client when CodesDiscipline is available."],"examples":[{"id":"minimal-stage","description":"Minimal stage import with one athlete per performance.","content":"Athlete: Surname;Athlete: GivenName;Athlete: Representing\nTestov;Ivan;Test Region\n"},{"id":"syn-pair","description":"SYN pair: two athlete rows are chunked into one performance when the discipline athlete count is 2.","content":"Stage: Group;Athlete: Surname;Athlete: GivenName;Performance: Team;Performance: NumberInTeam\n1;First;Athlete;1;1\n1;Second;Athlete;1;2\n"},{"id":"multi-competition","description":"Discipline import with competition matching/creation fields.","content":"Competition: Title;Competition: DisciplineCode;Competition: AgeGroup;Competition: SexCategory;Athlete: Surname;Athlete: GivenName;Athlete: DateOfBirth\nTRA 13-14 W;TRA;13-14;female;Testova;Anna;2012-01-31\n"}]}],"skillSources":[{"id":"configured-ai-skill-source","title":"sporttech.io OVS AI skill packs","kind":"github-repository","url":"https://github.com/sporttech/sporttech.io-ovs-ai-skills","indexUrl":"https://raw.githubusercontent.com/sporttech/sporttech.io-ovs-ai-skills/main/skills/index.json","appliesTo":["TRA"],"description":"External human-readable recipes for federation-specific workflows. Use this after reading the built-in machine-readable API model.","notes":["Built-in /api/ai skills describe stable server mechanics and code-derived behavior.","External skill packs may describe FIG or federation-specific policies that should not live in the Go server.","Task recipes such as winner listing, FIG policies, advancement policies, and federation-specific interpretations should be read from external skill packs.","Resolve canonical scripts and helpers from one exact repository revision; do not mix files from different revisions.","Follow the root recommendedWorkflow, including its draft and explicit-approval policy."],"source":"external"}],"skills":[{"id":"start-lists","title":"Get start lists","url":"/api/ai/skill/start-lists","source":"curated"},{"id":"find-athlete-competition","title":"Find an athlete's competition","url":"/api/ai/skill/find-athlete-competition","source":"curated"},{"id":"scoreboard-live","title":"Subscribe to a live scoreboard","url":"/api/ai/skill/scoreboard-live","source":"curated"},{"id":"auth-crud","title":"Authenticate and perform CRUD","url":"/api/ai/skill/auth-crud","source":"curated"},{"id":"update-athlete-photo","title":"Update athlete photo","url":"/api/ai/skill/update-athlete-photo","source":"curated"},{"id":"import-participants-csv","title":"Understand participant CSV import","url":"/api/ai/skill/import-participants-csv","source":"curated"},{"id":"extract-created-id","title":"Extract created resource ID","url":"/api/ai/skill/extract-created-id","source":"curated"}]}
