The profile

profile.local.json sets what a Version links to, what it is called, and which field each provenance fact is written to. It is plain JSON and hand-editing it is expected.

Top-level keys are the site default. A projects block overrides them per show, so two graphs in one ComfyUI can publish into two projects that name Versions differently.

{
  "default_project": 1180,
  "projects": {
    "1180": {
      "link_type": "Shot",
      "link_field": "entity",
      "root_name": "{entity}_{sg_task.Task.step.Step.short_name}",
      "code_template": "{root_name}_v{version:03d}",
      "status": "rev",
      "published_files": {
        "storage": "primary",
        "path_template": "{entity}/{root_name}/{version_name}/{version_name}.%04d{ext}",
        "still_path_template": "{entity}/{root_name}/{version_name}{ext}",
        "movie_path_template": "{entity}/{root_name}/{version_name}{ext}",
        "register_movie": false,
        "colour_space": "sRGB"
      }
    }
  }
}

Site-wide keys

keydefaultwritten by
default_projectnone, and both nodes then askSettings, SG Defaults
show_all_projectsfalse, so template, demo and archived shows stay out of the pickeryou

Per project

Each of these is valid at the top level as a site default.

keydefaultwritten by
link_typeShot, the type a bare link name meansthe inspector
link_fieldentity, the Version field the link is written tothe inspector
link_typesthe types this show's Versions already use, most used firstyou
root_name{entity}_{sg_task.Task.step.Step.short_name}Settings, SG Publish Defaults
code_template{root_name}_v{version:03d}Settings, SG Publish Defaults
code_regexderived from the version name templatethe inspector
statusnone, so the site sets its ownSettings, SG Publish Defaults
version_number_fieldnone, so the version number is inside the nameyou
widgetswhat src/comfyui_sg/widgets.py declaresyou
provenance{"mode": "fields"}, the nine fields by their own namesyou

Inside published_files

keydefaultwritten by
defaultfalse, so Create Published Files starts untickedSettings, SG Publish Defaults
storagenone, and the only Local File Storage when the site has exactly oneSettings, Storage
path_platformthis machine'sSettings, Operating system
path_template{entity}/{root_name}/{version_name}/{version_name}.%04d{ext}Settings, Sequence path, or sequence path on the node
still_path_template{entity}/{root_name}/{version_name}{ext}Settings, Still path, or still path on the node
movie_path_template{entity}/{root_name}/{version_name}{ext}Settings, Movie path, or movie path on the node
register_moviefalse, so a clip beside frames is review onlySettings, Review movie
path_to_framestrueSettings, Path to Frames
path_to_movietrueSettings, Path to Movie
colour_spacenone, so a publish declares nothingSettings, Colour space

Measuring a site

/inspect-site is a procedure an agent follows. The inspector under it is a script in the sg-groundtruth checkout, and you can run it yourself. Clone that checkout anywhere except custom_nodes, where ComfyUI would load it as a node pack.

git clone https://github.com/ksallee/sg-groundtruth.git ~/dev/sg-groundtruth
<comfy-python> ~/dev/sg-groundtruth/inspect_site.py                                # list the projects
<comfy-python> ~/dev/sg-groundtruth/inspect_site.py --project 1180 --out <profile> # measure one
  • Pass --out. Its default is ./profile.local.json relative to the working directory, and the file has to be written to the path tools/doctor.py reports.
  • Read the report before accepting it, starting with the link field.
  • The code convention comes with a coverage number saying how much of the show agrees with it.
  • Re-running keeps your edits and prints (yours, kept) beside each value it would have changed. --overwrite discards them.