{
  "schema_version": 3,
  "app": "owncloud",
  "display_name": "ownCloud Infinite Scale",
  "upstream_repo": "https://github.com/owncloud/ocis",
  "docs_url": "https://owncloud.dev/ocis/guides/ocis-mini-eval/",
  "status": "ok",
  "summary": {
    "primary_service": "ocis",
    "app_version": "8.2.1",
    "app_version_pinned": true,
    "runs": 3,
    "publishable": true,
    "publishable_note": null,
    "idle_total_mem_mib": 151.47,
    "idle_total_cpu_pct": 0.85,
    "peak_total_mem_mib": 305.3,
    "peak_is_under_load": true,
    "startup_seconds": 5.4,
    "startup_peak_total_mem_mib": 281.8,
    "settled": true,
    "settle_seconds_used": 179.4,
    "peak_max_mib": 309.3,
    "sizing_peak_mib": 322.7,
    "idle_mem_mib": {
      "median": 151.47,
      "min": 101.46,
      "max": 155.41,
      "values": [
        155.41,
        151.47,
        101.46
      ]
    },
    "idle_cpu_pct": {
      "median": 0.85,
      "min": 0.58,
      "max": 1.0,
      "values": [
        0.85,
        1.0,
        0.58
      ]
    },
    "peak_mem_mib": {
      "median": 305.3,
      "min": 304.3,
      "max": 309.3,
      "values": [
        305.3,
        309.3,
        304.3
      ]
    },
    "startup_peak_mem_mib": {
      "median": 281.8,
      "min": 252.4,
      "max": 322.7,
      "values": [
        252.4,
        281.8,
        322.7
      ]
    },
    "startup_s": {
      "median": 5.4,
      "min": 5.4,
      "max": 5.5,
      "values": [
        5.4,
        5.5,
        5.4
      ]
    },
    "settled_after_healthy_s": {
      "median": 181.0,
      "min": 180.9,
      "max": 181.0,
      "values": [
        181.0,
        181.0,
        180.9
      ]
    },
    "settled_runs": 3,
    "per_service": {
      "ocis": {
        "idle_mem_mib": {
          "median": 151.47,
          "min": 101.46,
          "max": 155.41,
          "values": [
            155.41,
            151.47,
            101.46
          ]
        },
        "peak_mem_mib": {
          "median": 305.3,
          "min": 304.3,
          "max": 309.3,
          "values": [
            305.3,
            309.3,
            304.3
          ]
        }
      }
    },
    "variance_flag": {
      "threshold": 1.5,
      "metrics": {
        "idle_mem_mib": {
          "ratio": 1.53,
          "values": [
            155.41,
            151.47,
            101.46
          ]
        }
      },
      "note": "max/min across runs is above 1.5 for idle_mem_mib: the app is bimodal or the host is noisy. The published figure is the median; read it together with the range."
    },
    "representative_run": 2,
    "cpu_models": [
      "AMD EPYC 9V45 96-Core Processor"
    ],
    "cpu_model_mismatch": false,
    "rule": "idle = median of the run idle means; peak = median of the run peaks (highest simultaneous total, under load when the app has a load step); peak_max_mib = highest run peak; sizing_peak_mib = highest over runs of max(run peak, run startup peak); variance_flag when max/min over runs is above 1.5 for idle or peak."
  },
  "run": {
    "started_at": "2026-10-16T03:19:39Z",
    "date": "2026-10-16",
    "harness_version": "3.0.0",
    "runs_requested": 3,
    "docker_host": null,
    "remote": false,
    "runs_completed": 3
  },
  "host": {
    "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
    "ci": {
      "runs_on": "ubuntu-latest",
      "runner_environment": "github-hosted",
      "runner_os": "Linux",
      "runner_arch": "X64",
      "image_os": "ubuntu24",
      "image_version": "20261012.334.1"
    },
    "cpu_model": "AMD EPYC 9V45 96-Core Processor",
    "cpu_model_note": null,
    "cores": 2,
    "mem_total_mib": 7938,
    "kernel": "6.17.0-1022-azure",
    "os": "Ubuntu 24.04.5 LTS",
    "arch": "x86_64",
    "oci_arch": "amd64",
    "docker_server_version": "28.0.4",
    "docker_client_version": "28.0.4",
    "compose_client_version": "2.38.2",
    "storage_driver": "overlay2",
    "containerd_image_store": false,
    "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
    "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
  },
  "helper_images": {
    "curlimages/curl:latest": {
      "pulled_as": "curlimages/curl:latest",
      "digest": "curlimages/curl@sha256:a134550be58ab783810e613ae96fd253c38f7bdd16d9bf9be350700c7a29ac06"
    },
    "python:3.12-slim": {
      "pulled_as": "python:3.12-slim",
      "digest": "python@sha256:a6e34c598f2467ed0e9a8d349809fcd8b5c603269512df273a0bb1784edc11b1"
    }
  },
  "pull_seconds": 5.6,
  "finished_at": "2026-10-16T03:31:21Z",
  "elapsed_seconds": 701.9,
  "services": {
    "ocis": {
      "image_ref": "owncloud/ocis:8.2.1",
      "image_repo": "owncloud/ocis",
      "image_tag": "8.2.1",
      "digest": "sha256:5e007d702b78d70e5aeade14ec9da46044664996df6c9482630dedadcc74bffc",
      "digest_note": null,
      "version": "8.2.1",
      "version_source": "label:org.opencontainers.image.version",
      "version_pinned": true,
      "version_note": null,
      "resolved_tag": "8.2.1",
      "resolved_tag_note": null,
      "image_size": {
        "unpacked_mb": 238.0,
        "unpacked_source": "docker image ls Size: unpacked image on the daemon host, rounded by docker to 3 significant figures",
        "compressed_mb": 87.5,
        "compressed_source": "sum of compressed layer sizes in the registry manifest for linux/amd64",
        "compressed_null_reason": null,
        "unit_note": "MB = 10^6 bytes. unpacked = disk used on the host; compressed = what is downloaded"
      },
      "compose_image": "owncloud/ocis:8.2.1",
      "compose_comment": "sha256:5e007d702b78d70e5aeade14ec9da46044664996df6c9482630dedadcc74bffc  (version 8.2.1, from label:org.opencontainers.image.version)",
      "restart_count": 0,
      "oom_killed": false
    }
  },
  "runs": [
    {
      "run": 1,
      "started_at": "2026-10-16T03:19:51Z",
      "host": {
        "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
        "ci": {
          "runs_on": "ubuntu-latest",
          "runner_environment": "github-hosted",
          "runner_os": "Linux",
          "runner_arch": "X64",
          "image_os": "ubuntu24",
          "image_version": "20261012.334.1"
        },
        "cpu_model": "AMD EPYC 9V45 96-Core Processor",
        "cpu_model_note": null,
        "cores": 2,
        "mem_total_mib": 7938,
        "kernel": "6.17.0-1022-azure",
        "os": "Ubuntu 24.04.5 LTS",
        "arch": "x86_64",
        "oci_arch": "amd64",
        "docker_server_version": "28.0.4",
        "docker_client_version": "28.0.4",
        "compose_client_version": "2.38.2",
        "storage_driver": "overlay2",
        "containerd_image_store": false,
        "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
        "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
      },
      "date": "2026-10-16",
      "startup": {
        "seconds": 5.4,
        "ok": true,
        "checks": [
          {
            "type": "container",
            "ok": true,
            "ready_after_s": 5.4,
            "detail": "shb-owncloud-ocis-1=running/healthy"
          }
        ],
        "up_command_seconds": 0.2,
        "definition": "wall clock from starting `docker compose up -d` until every health check passed; checks poll every 0.5 s from a throwaway container on the compose network, so resolution is about +/- 1 s"
      },
      "versions": {
        "ocis": "8.2.1"
      },
      "setup": [
        {
          "exit_code": 0,
          "duration_s": 0.8,
          "reported": {
            "product": "Infinite Scale",
            "ocis_version": "8.2.1",
            "personal_space_id": "863951fb-f4bb-40f0-b7fa-c47ad9349df4$f05ccb0e-228f-425c-969d-78363ed3ac2a",
            "webdav_ok": true,
            "tls": "self-signed, not verified"
          },
          "output_tail": [
            "GET /status.php -> HTTP 200 product Infinite Scale 8.2.1",
            "personal space found; PROPFIND /dav/spaces/%3Cid%3E -> 207"
          ],
          "description": "Wait until the admin can log in (basic authentication) and WebDAV answers on the admin's personal space, as the first login a user would make: GET /status.php, GET /graph/v1.0/me/drive for the space id, PROPFIND (Depth 0) on /dav/spaces/<id>. Reports the product version."
        }
      ],
      "idle": {
        "per_service": {
          "ocis": {
            "samples": 16,
            "mem_mean_mib": 155.41,
            "mem_max_mib": 155.7,
            "cpu_mean_pct": 0.85,
            "cpu_max_pct": 3.0
          }
        },
        "total": {
          "samples": 16,
          "dropped_for_total": 0,
          "mem_mean_mib": 155.41,
          "mem_max_mib": 155.7,
          "cpu_mean_pct": 0.85,
          "cpu_max_pct": 3.0
        },
        "window_seconds": 30.2,
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 155.5,
            "total_cpu_pct": 3.0
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 155.5,
            "total_cpu_pct": 0.2
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 155.5,
            "total_cpu_pct": 0.21
          },
          {
            "t_offset_s": 6.0,
            "total_mem_mib": 155.5,
            "total_cpu_pct": 0.18
          },
          {
            "t_offset_s": 8.1,
            "total_mem_mib": 155.5,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 10.1,
            "total_mem_mib": 155.3,
            "total_cpu_pct": 2.69
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 155.7,
            "total_cpu_pct": 0.14
          },
          {
            "t_offset_s": 14.1,
            "total_mem_mib": 155.4,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 16.1,
            "total_mem_mib": 155.3,
            "total_cpu_pct": 0.23
          },
          {
            "t_offset_s": 18.1,
            "total_mem_mib": 155.3,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 20.2,
            "total_mem_mib": 155.4,
            "total_cpu_pct": 2.93
          },
          {
            "t_offset_s": 22.2,
            "total_mem_mib": 155.4,
            "total_cpu_pct": 0.22
          },
          {
            "t_offset_s": 24.2,
            "total_mem_mib": 155.3,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 26.2,
            "total_mem_mib": 155.3,
            "total_cpu_pct": 0.18
          },
          {
            "t_offset_s": 28.2,
            "total_mem_mib": 155.3,
            "total_cpu_pct": 0.19
          },
          {
            "t_offset_s": 30.2,
            "total_mem_mib": 155.4,
            "total_cpu_pct": 2.78
          }
        ]
      },
      "settle": {
        "settled": true,
        "mode": "detected",
        "settle_seconds_used": 179.3,
        "settle_started_after_healthy_s": 1.7,
        "params": {
          "window_seconds": 60,
          "threshold_pct": 2.0,
          "threshold_min_mib": 10.0,
          "min_seconds": 120,
          "max_seconds": 600
        },
        "last_window": {
          "n": 30,
          "mean_mib": 155.42,
          "min_mib": 155.2,
          "max_mib": 155.7,
          "spread_mib": 0.5,
          "threshold_mib": 10.0
        },
        "rechecks": 0,
        "rule": "settled = over the last window_seconds the stack total varied (max - min) by less than max(threshold_pct of the window mean, threshold_min_mib); not before min_seconds, at the latest max_seconds, both counted from the end of the setup steps; the idle window must also be flat and agree with it. If max_seconds passes without settling, settled=false and the idle window is measured anyway."
      },
      "startup_peak": {
        "per_service_mem_mib": {
          "ocis": 252.4
        },
        "total_mem_mib": 252.4,
        "samples": 90,
        "note": "highest value across docker stats samples (about one every 2-3 s) from healthy until the stack settled; shorter spikes between samples are not seen"
      },
      "timeline": {
        "step_s": 10,
        "t0": "healthy",
        "offsets_s": [
          10,
          20,
          30,
          40,
          50,
          60,
          70,
          80,
          90,
          100,
          110,
          120,
          130,
          140,
          150,
          160,
          170,
          180,
          190,
          200,
          210,
          220
        ],
        "total_mem_mib": [
          228.1,
          222.0,
          222.3,
          222.1,
          222.1,
          222.3,
          222.1,
          222.2,
          222.2,
          222.2,
          221.7,
          220.5,
          168.0,
          155.4,
          155.3,
          155.5,
          155.3,
          155.5,
          155.5,
          155.4,
          155.3,
          155.4
        ],
        "per_service_mem_mib": {
          "ocis": [
            228.1,
            222.0,
            222.3,
            222.1,
            222.1,
            222.3,
            222.1,
            222.2,
            222.2,
            222.2,
            221.7,
            220.5,
            168.0,
            155.4,
            155.3,
            155.5,
            155.3,
            155.5,
            155.5,
            155.4,
            155.3,
            155.4
          ]
        }
      },
      "load": {
        "per_service": {
          "ocis": {
            "samples": 6,
            "mem_mean_mib": 281.88,
            "mem_max_mib": 305.3,
            "cpu_mean_pct": 99.77,
            "cpu_max_pct": 155.4
          }
        },
        "total": {
          "samples": 6,
          "dropped_for_total": 0,
          "mem_mean_mib": 281.88,
          "mem_max_mib": 305.3,
          "cpu_mean_pct": 99.77,
          "cpu_max_pct": 155.4
        },
        "description": "The same load as the Nextcloud and Seafile tests, over WebDAV. One user (the admin), over HTTPS with a self-signed certificate on the Compose network (not verified), basic authentication, one request at a time, each on a new connection. A Python script generates the same 103 random files (100 small ones of 1 KB to 1 MB, about 50 MB together, and three of 50 MB; same seed, same names, same order), uploads them to a folder in the admin's personal space (MKCOL, then one PUT per file), lists the folder with PROPFIND (Depth 1), and downloads five files (three small, two large) and checks their SHA-256. About 200 MB in total. The address is /dav/spaces/<space id>, the form the official desktop and mobile apps use (Nextcloud's test uses /remote.php/dav/files/admin). No browser, no sync client, no chunked (TUS) upload, no thumbnails, no sharing, no search.",
        "duration_s": 9.4,
        "window": "from LAB_MARK load_start (or step start) until 2 s after the step ended",
        "reported_by_script": {
          "api": "webdav on the personal space (/dav/spaces/<id>)",
          "files_uploaded": 103,
          "small_files": 100,
          "large_files": 3,
          "bytes_uploaded": 194456599,
          "upload_seconds": 6.8,
          "listing_entries": 103,
          "listing_seconds": 0.05,
          "files_downloaded": 5,
          "bytes_downloaded": 101451451,
          "download_seconds": 0.5,
          "downloads_sha256_match": true,
          "requests": {
            "create_folder": {
              "sent": 1,
              "ok": 1,
              "statuses": {
                "201": 1
              }
            },
            "upload": {
              "sent": 103,
              "ok": 103,
              "statuses": {
                "201": 103
              }
            },
            "list": {
              "sent": 1,
              "ok": 1,
              "statuses": {
                "207": 1
              }
            },
            "download": {
              "sent": 5,
              "ok": 5,
              "statuses": {
                "200": 5
              }
            }
          },
          "requests_total": 110,
          "requests_failed": 0
        },
        "output_tail": [
          "generated 103 files (100 small, 3 large), 194.5 MB",
          "uploaded 103 of 103 files, 194.5 MB in 6.8s; statuses {'201': 103}",
          "PROPFIND HTTP 207: 104 entries (1 folder + 103 files) in 0.05s",
          "downloaded 5 of 5 files, 101.5 MB in 0.5s"
        ],
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 290.5,
            "total_cpu_pct": 115.11
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 296.1,
            "total_cpu_pct": 155.4
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 299.7,
            "total_cpu_pct": 150.4
          },
          {
            "t_offset_s": 6.0,
            "total_mem_mib": 302.2,
            "total_cpu_pct": 113.94
          },
          {
            "t_offset_s": 8.0,
            "total_mem_mib": 305.3,
            "total_cpu_pct": 8.42
          },
          {
            "t_offset_s": 10.0,
            "total_mem_mib": 197.5,
            "total_cpu_pct": 55.37
          }
        ],
        "series_start_offset_s": 1.3,
        "peak_note": "peak = highest value seen across docker stats samples (about one every 2-3 s); shorter spikes between samples are not seen"
      },
      "container_end_state": {
        "ocis": {
          "restart_count": 0,
          "oom_killed": false
        }
      },
      "teardown": {
        "done": true,
        "volumes_removed": true,
        "images_removed": false,
        "error": null
      },
      "warnings": [],
      "finished_at": "2026-10-16T03:23:40Z",
      "elapsed_seconds": 229.2
    },
    {
      "run": 2,
      "started_at": "2026-10-16T03:23:40Z",
      "host": {
        "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
        "ci": {
          "runs_on": "ubuntu-latest",
          "runner_environment": "github-hosted",
          "runner_os": "Linux",
          "runner_arch": "X64",
          "image_os": "ubuntu24",
          "image_version": "20261012.334.1"
        },
        "cpu_model": "AMD EPYC 9V45 96-Core Processor",
        "cpu_model_note": null,
        "cores": 2,
        "mem_total_mib": 7938,
        "kernel": "6.17.0-1022-azure",
        "os": "Ubuntu 24.04.5 LTS",
        "arch": "x86_64",
        "oci_arch": "amd64",
        "docker_server_version": "28.0.4",
        "docker_client_version": "28.0.4",
        "compose_client_version": "2.38.2",
        "storage_driver": "overlay2",
        "containerd_image_store": false,
        "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
        "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
      },
      "date": "2026-10-16",
      "startup": {
        "seconds": 5.5,
        "ok": true,
        "checks": [
          {
            "type": "container",
            "ok": true,
            "ready_after_s": 5.5,
            "detail": "shb-owncloud-ocis-1=running/healthy"
          }
        ],
        "up_command_seconds": 0.3,
        "definition": "wall clock from starting `docker compose up -d` until every health check passed; checks poll every 0.5 s from a throwaway container on the compose network, so resolution is about +/- 1 s"
      },
      "versions": {
        "ocis": "8.2.1"
      },
      "setup": [
        {
          "exit_code": 0,
          "duration_s": 0.8,
          "reported": {
            "product": "Infinite Scale",
            "ocis_version": "8.2.1",
            "personal_space_id": "3c6406e0-a781-450c-9149-b25d9b51fecf$7d167208-8af1-47a5-a47d-b5ab3c4151be",
            "webdav_ok": true,
            "tls": "self-signed, not verified"
          },
          "output_tail": [
            "GET /status.php -> HTTP 200 product Infinite Scale 8.2.1",
            "personal space found; PROPFIND /dav/spaces/%3Cid%3E -> 207"
          ],
          "description": "Wait until the admin can log in (basic authentication) and WebDAV answers on the admin's personal space, as the first login a user would make: GET /status.php, GET /graph/v1.0/me/drive for the space id, PROPFIND (Depth 0) on /dav/spaces/<id>. Reports the product version."
        }
      ],
      "idle": {
        "per_service": {
          "ocis": {
            "samples": 16,
            "mem_mean_mib": 151.47,
            "mem_max_mib": 151.6,
            "cpu_mean_pct": 1.0,
            "cpu_max_pct": 3.09
          }
        },
        "total": {
          "samples": 16,
          "dropped_for_total": 0,
          "mem_mean_mib": 151.47,
          "mem_max_mib": 151.6,
          "cpu_mean_pct": 1.0,
          "cpu_max_pct": 3.09
        },
        "window_seconds": 30.2,
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 151.6,
            "total_cpu_pct": 2.8
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 151.5,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 151.5,
            "total_cpu_pct": 0.21
          },
          {
            "t_offset_s": 6.0,
            "total_mem_mib": 151.5,
            "total_cpu_pct": 0.22
          },
          {
            "t_offset_s": 8.1,
            "total_mem_mib": 151.5,
            "total_cpu_pct": 0.2
          },
          {
            "t_offset_s": 10.1,
            "total_mem_mib": 151.4,
            "total_cpu_pct": 2.99
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 151.4,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 14.1,
            "total_mem_mib": 151.4,
            "total_cpu_pct": 0.18
          },
          {
            "t_offset_s": 16.1,
            "total_mem_mib": 151.6,
            "total_cpu_pct": 1.71
          },
          {
            "t_offset_s": 18.1,
            "total_mem_mib": 151.6,
            "total_cpu_pct": 0.49
          },
          {
            "t_offset_s": 20.2,
            "total_mem_mib": 151.4,
            "total_cpu_pct": 2.88
          },
          {
            "t_offset_s": 22.2,
            "total_mem_mib": 151.4,
            "total_cpu_pct": 0.22
          },
          {
            "t_offset_s": 24.2,
            "total_mem_mib": 151.2,
            "total_cpu_pct": 0.2
          },
          {
            "t_offset_s": 26.2,
            "total_mem_mib": 151.4,
            "total_cpu_pct": 0.32
          },
          {
            "t_offset_s": 28.2,
            "total_mem_mib": 151.6,
            "total_cpu_pct": 0.23
          },
          {
            "t_offset_s": 30.2,
            "total_mem_mib": 151.6,
            "total_cpu_pct": 3.09
          }
        ]
      },
      "settle": {
        "settled": true,
        "mode": "detected",
        "settle_seconds_used": 179.5,
        "settle_started_after_healthy_s": 1.5,
        "params": {
          "window_seconds": 60,
          "threshold_pct": 2.0,
          "threshold_min_mib": 10.0,
          "min_seconds": 120,
          "max_seconds": 600
        },
        "last_window": {
          "n": 30,
          "mean_mib": 151.66,
          "min_mib": 151.1,
          "max_mib": 158.1,
          "spread_mib": 7.0,
          "threshold_mib": 10.0
        },
        "rechecks": 0,
        "rule": "settled = over the last window_seconds the stack total varied (max - min) by less than max(threshold_pct of the window mean, threshold_min_mib); not before min_seconds, at the latest max_seconds, both counted from the end of the setup steps; the idle window must also be flat and agree with it. If max_seconds passes without settling, settled=false and the idle window is measured anyway."
      },
      "startup_peak": {
        "per_service_mem_mib": {
          "ocis": 281.8
        },
        "total_mem_mib": 281.8,
        "samples": 90,
        "note": "highest value across docker stats samples (about one every 2-3 s) from healthy until the stack settled; shorter spikes between samples are not seen"
      },
      "timeline": {
        "step_s": 10,
        "t0": "healthy",
        "offsets_s": [
          10,
          20,
          30,
          40,
          50,
          60,
          70,
          80,
          90,
          100,
          110,
          120,
          130,
          140,
          150,
          160,
          170,
          180,
          190,
          200,
          210,
          220
        ],
        "total_mem_mib": [
          270.2,
          270.0,
          270.6,
          270.7,
          269.8,
          271.5,
          271.5,
          274.7,
          275.7,
          276.2,
          281.6,
          281.7,
          177.6,
          151.3,
          151.4,
          151.5,
          151.4,
          152.7,
          151.5,
          151.5,
          151.4,
          151.6
        ],
        "per_service_mem_mib": {
          "ocis": [
            270.2,
            270.0,
            270.6,
            270.7,
            269.8,
            271.5,
            271.5,
            274.7,
            275.7,
            276.2,
            281.6,
            281.7,
            177.6,
            151.3,
            151.4,
            151.5,
            151.4,
            152.7,
            151.5,
            151.5,
            151.4,
            151.6
          ]
        }
      },
      "load": {
        "per_service": {
          "ocis": {
            "samples": 7,
            "mem_mean_mib": 267.49,
            "mem_max_mib": 309.3,
            "cpu_mean_pct": 90.12,
            "cpu_max_pct": 147.03
          }
        },
        "total": {
          "samples": 7,
          "dropped_for_total": 0,
          "mem_mean_mib": 267.49,
          "mem_max_mib": 309.3,
          "cpu_mean_pct": 90.12,
          "cpu_max_pct": 147.03
        },
        "description": "The same load as the Nextcloud and Seafile tests, over WebDAV. One user (the admin), over HTTPS with a self-signed certificate on the Compose network (not verified), basic authentication, one request at a time, each on a new connection. A Python script generates the same 103 random files (100 small ones of 1 KB to 1 MB, about 50 MB together, and three of 50 MB; same seed, same names, same order), uploads them to a folder in the admin's personal space (MKCOL, then one PUT per file), lists the folder with PROPFIND (Depth 1), and downloads five files (three small, two large) and checks their SHA-256. About 200 MB in total. The address is /dav/spaces/<space id>, the form the official desktop and mobile apps use (Nextcloud's test uses /remote.php/dav/files/admin). No browser, no sync client, no chunked (TUS) upload, no thumbnails, no sharing, no search.",
        "duration_s": 10.5,
        "window": "from LAB_MARK load_start (or step start) until 2 s after the step ended",
        "reported_by_script": {
          "api": "webdav on the personal space (/dav/spaces/<id>)",
          "files_uploaded": 103,
          "small_files": 100,
          "large_files": 3,
          "bytes_uploaded": 194456599,
          "upload_seconds": 7.7,
          "listing_entries": 103,
          "listing_seconds": 0.06,
          "files_downloaded": 5,
          "bytes_downloaded": 101451451,
          "download_seconds": 0.7,
          "downloads_sha256_match": true,
          "requests": {
            "create_folder": {
              "sent": 1,
              "ok": 1,
              "statuses": {
                "201": 1
              }
            },
            "upload": {
              "sent": 103,
              "ok": 103,
              "statuses": {
                "201": 103
              }
            },
            "list": {
              "sent": 1,
              "ok": 1,
              "statuses": {
                "207": 1
              }
            },
            "download": {
              "sent": 5,
              "ok": 5,
              "statuses": {
                "200": 5
              }
            }
          },
          "requests_total": 110,
          "requests_failed": 0
        },
        "output_tail": [
          "generated 103 files (100 small, 3 large), 194.5 MB",
          "uploaded 103 of 103 files, 194.5 MB in 7.7s; statuses {'201': 103}",
          "PROPFIND HTTP 207: 104 entries (1 folder + 103 files) in 0.06s",
          "downloaded 5 of 5 files, 101.5 MB in 0.7s"
        ],
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 286.6,
            "total_cpu_pct": 103.88
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 289.7,
            "total_cpu_pct": 147.03
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 292.1,
            "total_cpu_pct": 144.74
          },
          {
            "t_offset_s": 6.0,
            "total_mem_mib": 309.3,
            "total_cpu_pct": 117.7
          },
          {
            "t_offset_s": 8.0,
            "total_mem_mib": 299.5,
            "total_cpu_pct": 76.89
          },
          {
            "t_offset_s": 10.0,
            "total_mem_mib": 196.6,
            "total_cpu_pct": 40.39
          },
          {
            "t_offset_s": 12.0,
            "total_mem_mib": 198.6,
            "total_cpu_pct": 0.2
          }
        ],
        "series_start_offset_s": 1.2,
        "peak_note": "peak = highest value seen across docker stats samples (about one every 2-3 s); shorter spikes between samples are not seen"
      },
      "container_end_state": {
        "ocis": {
          "restart_count": 0,
          "oom_killed": false
        }
      },
      "teardown": {
        "done": true,
        "volumes_removed": true,
        "images_removed": false,
        "error": null
      },
      "warnings": [],
      "finished_at": "2026-10-16T03:27:32Z",
      "elapsed_seconds": 231.5
    },
    {
      "run": 3,
      "started_at": "2026-10-16T03:27:32Z",
      "host": {
        "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
        "ci": {
          "runs_on": "ubuntu-latest",
          "runner_environment": "github-hosted",
          "runner_os": "Linux",
          "runner_arch": "X64",
          "image_os": "ubuntu24",
          "image_version": "20261012.334.1"
        },
        "cpu_model": "AMD EPYC 9V45 96-Core Processor",
        "cpu_model_note": null,
        "cores": 2,
        "mem_total_mib": 7938,
        "kernel": "6.17.0-1022-azure",
        "os": "Ubuntu 24.04.5 LTS",
        "arch": "x86_64",
        "oci_arch": "amd64",
        "docker_server_version": "28.0.4",
        "docker_client_version": "28.0.4",
        "compose_client_version": "2.38.2",
        "storage_driver": "overlay2",
        "containerd_image_store": false,
        "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
        "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
      },
      "date": "2026-10-16",
      "startup": {
        "seconds": 5.4,
        "ok": true,
        "checks": [
          {
            "type": "container",
            "ok": true,
            "ready_after_s": 5.4,
            "detail": "shb-owncloud-ocis-1=running/healthy"
          }
        ],
        "up_command_seconds": 0.2,
        "definition": "wall clock from starting `docker compose up -d` until every health check passed; checks poll every 0.5 s from a throwaway container on the compose network, so resolution is about +/- 1 s"
      },
      "versions": {
        "ocis": "8.2.1"
      },
      "setup": [
        {
          "exit_code": 0,
          "duration_s": 0.7,
          "reported": {
            "product": "Infinite Scale",
            "ocis_version": "8.2.1",
            "personal_space_id": "400e2e8c-7b2a-49db-9762-d8687695697e$cb038cf4-95ab-4fbc-bfe6-d15596ad3b51",
            "webdav_ok": true,
            "tls": "self-signed, not verified"
          },
          "output_tail": [
            "GET /status.php -> HTTP 200 product Infinite Scale 8.2.1",
            "personal space found; PROPFIND /dav/spaces/%3Cid%3E -> 207"
          ],
          "description": "Wait until the admin can log in (basic authentication) and WebDAV answers on the admin's personal space, as the first login a user would make: GET /status.php, GET /graph/v1.0/me/drive for the space id, PROPFIND (Depth 0) on /dav/spaces/<id>. Reports the product version."
        }
      ],
      "idle": {
        "per_service": {
          "ocis": {
            "samples": 16,
            "mem_mean_mib": 101.46,
            "mem_max_mib": 101.6,
            "cpu_mean_pct": 0.58,
            "cpu_max_pct": 3.02
          }
        },
        "total": {
          "samples": 16,
          "dropped_for_total": 0,
          "mem_mean_mib": 101.46,
          "mem_max_mib": 101.6,
          "cpu_mean_pct": 0.58,
          "cpu_max_pct": 3.02
        },
        "window_seconds": 30.2,
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 101.6,
            "total_cpu_pct": 0.21
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 101.5,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 101.5,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 6.0,
            "total_mem_mib": 101.5,
            "total_cpu_pct": 0.2
          },
          {
            "t_offset_s": 8.1,
            "total_mem_mib": 101.5,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 10.1,
            "total_mem_mib": 101.6,
            "total_cpu_pct": 0.26
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 101.3,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 14.1,
            "total_mem_mib": 101.3,
            "total_cpu_pct": 0.18
          },
          {
            "t_offset_s": 16.1,
            "total_mem_mib": 101.4,
            "total_cpu_pct": 0.79
          },
          {
            "t_offset_s": 18.1,
            "total_mem_mib": 101.4,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 20.2,
            "total_mem_mib": 101.6,
            "total_cpu_pct": 2.86
          },
          {
            "t_offset_s": 22.2,
            "total_mem_mib": 101.6,
            "total_cpu_pct": 0.21
          },
          {
            "t_offset_s": 24.2,
            "total_mem_mib": 101.6,
            "total_cpu_pct": 0.18
          },
          {
            "t_offset_s": 26.2,
            "total_mem_mib": 101.3,
            "total_cpu_pct": 0.31
          },
          {
            "t_offset_s": 28.2,
            "total_mem_mib": 101.3,
            "total_cpu_pct": 0.23
          },
          {
            "t_offset_s": 30.2,
            "total_mem_mib": 101.4,
            "total_cpu_pct": 3.02
          }
        ]
      },
      "settle": {
        "settled": true,
        "mode": "detected",
        "settle_seconds_used": 179.4,
        "settle_started_after_healthy_s": 1.5,
        "params": {
          "window_seconds": 60,
          "threshold_pct": 2.0,
          "threshold_min_mib": 10.0,
          "min_seconds": 120,
          "max_seconds": 600
        },
        "last_window": {
          "n": 30,
          "mean_mib": 101.43,
          "min_mib": 101.2,
          "max_mib": 101.6,
          "spread_mib": 0.4,
          "threshold_mib": 10.0
        },
        "rechecks": 0,
        "rule": "settled = over the last window_seconds the stack total varied (max - min) by less than max(threshold_pct of the window mean, threshold_min_mib); not before min_seconds, at the latest max_seconds, both counted from the end of the setup steps; the idle window must also be flat and agree with it. If max_seconds passes without settling, settled=false and the idle window is measured anyway."
      },
      "startup_peak": {
        "per_service_mem_mib": {
          "ocis": 322.7
        },
        "total_mem_mib": 322.7,
        "samples": 90,
        "note": "highest value across docker stats samples (about one every 2-3 s) from healthy until the stack settled; shorter spikes between samples are not seen"
      },
      "timeline": {
        "step_s": 10,
        "t0": "healthy",
        "offsets_s": [
          10,
          20,
          30,
          40,
          50,
          60,
          70,
          80,
          90,
          100,
          110,
          120,
          130,
          140,
          150,
          160,
          170,
          180,
          190,
          200,
          210,
          220
        ],
        "total_mem_mib": [
          322.4,
          322.6,
          215.4,
          215.5,
          214.2,
          213.4,
          213.3,
          213.3,
          213.5,
          215.3,
          219.4,
          219.4,
          125.0,
          101.4,
          101.4,
          101.4,
          101.5,
          101.4,
          101.5,
          101.4,
          101.5,
          101.4
        ],
        "per_service_mem_mib": {
          "ocis": [
            322.4,
            322.6,
            215.4,
            215.5,
            214.2,
            213.4,
            213.3,
            213.3,
            213.5,
            215.3,
            219.4,
            219.4,
            125.0,
            101.4,
            101.4,
            101.4,
            101.5,
            101.4,
            101.5,
            101.4,
            101.5,
            101.4
          ]
        }
      },
      "load": {
        "per_service": {
          "ocis": {
            "samples": 6,
            "mem_mean_mib": 261.0,
            "mem_max_mib": 304.3,
            "cpu_mean_pct": 99.55,
            "cpu_max_pct": 151.4
          }
        },
        "total": {
          "samples": 6,
          "dropped_for_total": 0,
          "mem_mean_mib": 261.0,
          "mem_max_mib": 304.3,
          "cpu_mean_pct": 99.55,
          "cpu_max_pct": 151.4
        },
        "description": "The same load as the Nextcloud and Seafile tests, over WebDAV. One user (the admin), over HTTPS with a self-signed certificate on the Compose network (not verified), basic authentication, one request at a time, each on a new connection. A Python script generates the same 103 random files (100 small ones of 1 KB to 1 MB, about 50 MB together, and three of 50 MB; same seed, same names, same order), uploads them to a folder in the admin's personal space (MKCOL, then one PUT per file), lists the folder with PROPFIND (Depth 1), and downloads five files (three small, two large) and checks their SHA-256. About 200 MB in total. The address is /dav/spaces/<space id>, the form the official desktop and mobile apps use (Nextcloud's test uses /remote.php/dav/files/admin). No browser, no sync client, no chunked (TUS) upload, no thumbnails, no sharing, no search.",
        "duration_s": 8.6,
        "window": "from LAB_MARK load_start (or step start) until 2 s after the step ended",
        "reported_by_script": {
          "api": "webdav on the personal space (/dav/spaces/<id>)",
          "files_uploaded": 103,
          "small_files": 100,
          "large_files": 3,
          "bytes_uploaded": 194456599,
          "upload_seconds": 6.4,
          "listing_entries": 103,
          "listing_seconds": 0.05,
          "files_downloaded": 5,
          "bytes_downloaded": 101451451,
          "download_seconds": 0.5,
          "downloads_sha256_match": true,
          "requests": {
            "create_folder": {
              "sent": 1,
              "ok": 1,
              "statuses": {
                "201": 1
              }
            },
            "upload": {
              "sent": 103,
              "ok": 103,
              "statuses": {
                "201": 103
              }
            },
            "list": {
              "sent": 1,
              "ok": 1,
              "statuses": {
                "207": 1
              }
            },
            "download": {
              "sent": 5,
              "ok": 5,
              "statuses": {
                "200": 5
              }
            }
          },
          "requests_total": 110,
          "requests_failed": 0
        },
        "output_tail": [
          "generated 103 files (100 small, 3 large), 194.5 MB",
          "uploaded 103 of 103 files, 194.5 MB in 6.4s; statuses {'201': 103}",
          "PROPFIND HTTP 207: 104 entries (1 folder + 103 files) in 0.05s",
          "downloaded 5 of 5 files, 101.5 MB in 0.5s"
        ],
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 287.5,
            "total_cpu_pct": 116.45
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 294.9,
            "total_cpu_pct": 151.4
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 299.2,
            "total_cpu_pct": 148.89
          },
          {
            "t_offset_s": 6.0,
            "total_mem_mib": 304.3,
            "total_cpu_pct": 136.28
          },
          {
            "t_offset_s": 8.0,
            "total_mem_mib": 192.9,
            "total_cpu_pct": 43.65
          },
          {
            "t_offset_s": 10.0,
            "total_mem_mib": 187.2,
            "total_cpu_pct": 0.62
          }
        ],
        "series_start_offset_s": 1.3,
        "peak_note": "peak = highest value seen across docker stats samples (about one every 2-3 s); shorter spikes between samples are not seen"
      },
      "container_end_state": {
        "ocis": {
          "restart_count": 0,
          "oom_killed": false
        }
      },
      "teardown": {
        "done": true,
        "volumes_removed": true,
        "images_removed": false,
        "error": null
      },
      "warnings": [],
      "finished_at": "2026-10-16T03:31:21Z",
      "elapsed_seconds": 229.3
    }
  ],
  "load_defined": true,
  "notes": [
    "Host: a GitHub Actions runner (ubuntu-latest, x86_64, 2 vCPU, 8 GB RAM; the CPU model varies between runners and each run records its own). Numbers are valid for that host only.",
    "Which ownCloud: ownCloud Infinite Scale (oCIS), image owncloud/ocis:8.2.1 (GitHub release v8.2.1, marked Latest, 2 Oct 2026; Docker Hub tag rebuilt 12 Oct 2026). owncloud.com/download-server calls Infinite Scale 'Our Flagship Product' and 'ownCloud's modern successor to the old PHP monolith (ownCloud 10 / oC10)'. The classic PHP server (owncloud/server 10.16.x and 11.0.x) is not tested; see lab/notes/owncloud-flavour-2026-10-16.md for the evidence.",
    "Infinite Scale is one container with no separate database or cache: users, metadata and the search index live in its two volumes. The container count is one, against four for Nextcloud and three for Seafile, so compare the total, not the container.",
    "TLS: oCIS serves HTTPS on port 9200 with a self-signed certificate it generates (default, as in ownCloud's evaluation guide). OCIS_INSECURE=true lets its services accept that certificate, and the load scripts do not verify it. A reader behind a reverse proxy with a real certificate would not need either.",
    "Basic authentication (PROXY_ENABLE_BASIC_AUTH=true) is on so a script can use WebDAV without an OpenID Connect login; ownCloud describes it as 'not recommended' and the web interface and apps do not need it. It is in the published compose too.",
    "Measured: idle RAM and CPU after the first start with the admin account; RAM and CPU while the load of load.description runs (a few seconds); image size; start-up time. Not measured: the desktop or mobile sync clients, external storage or S3 backends, online editing (Collabora, ONLYOFFICE), Tika full-text search, antivirus, previews, Keycloak/LDAP, many users, background work after the script ends (search indexing), long-term growth.",
    "Equivalence with the Nextcloud test: same 103 files (same generator and seed), same order, same request kinds (MKCOL, 103 PUT, PROPFIND Depth 1, 5 GET), one request at a time, one user. Differences: HTTPS instead of HTTP, the /dav/spaces/<id> address, and PROPFIND on oCIS returns 104 entries as on Nextcloud (folder plus 103 files); `listing_entries` counts the files (103). The Nextcloud result calls the listing `propfind_entries` and `propfind_seconds`.",
    "The load script reports every request kind with the HTTP statuses it got (`requests` in the load result); any failed request fails the run."
  ],
  "warnings": [
    "max/min across runs is above 1.5 for idle_mem_mib: the app is bimodal or the host is noisy. The published figure is the median; read it together with the range."
  ],
  "files": {
    "compose": "owncloud.compose.yaml",
    "env": "owncloud.env"
  },
  "definitions": {
    "memory": "cgroup working set as reported by `docker stats` (usage minus inactive file cache), MiB = 2^20 bytes",
    "cpu": "percent of ONE core as reported by `docker stats` (4 busy cores = 400)",
    "total": "stats over the sum of all containers at the same instant",
    "sample_interval": "docker stats --no-stream takes about 1-2 s per call, so samples are 2-3 s apart",
    "runs": "each run is a full fresh cycle (up, health, setup, settle, idle, load, down -v); the published figure is the median over the runs, shown with the min-max range; see summary.rule"
  }
}
