anchor.diff:        restartServer;
         testSync "bar";
       };
  +
  +    subtest "check manual configuration", sub {
  +      $server->succeed('${switchToNewServer} >&2');
  +      $server->waitForUnit("taskserver.service");
  +      $server->waitForOpenPort(${portStr});
  +
  +      $server->succeed(
  +        "nixos-taskserver org add manualOrg",
  +        "nixos-taskserver user add manualOrg alice"
  +      );
  +
  +      setupClientsFor "manualOrg", "alice", sub {
  +        my ($client, $org, $user) = @_;
  +        my $cfgpath = "/home/$user/.task";
  +
  +        $client->copyFileFromHost("${snakeOil.cacert}", "$cfgpath/ca.cert");
  +        for my $file ('alice.key', 'alice.cert') {
  +          $client->copyFileFromHost("${snakeOil}/$file", "$cfgpath/$file");
  +        }
  +
  +        for my $file ("$user.key", "$user.cert") {
  +          $client->copyFileFromHost(
  +            "${snakeOil}/$file", "$cfgpath/$file"
  +          );
  +        }
  +        $client->copyFileFromHost(
  +          "${snakeOil.cacert}", "$cfgpath/ca.cert"
  +        );
  +        $client->succeed(
  +          (su "alice", "task config taskd.ca $cfgpath/ca.cert"),
  +          (su "alice", "task config taskd.key $cfgpath/$user.key"),
  +          (su $user, "task config taskd.certificate $cfgpath/$user.cert")
  +        );
  +      };
  +
  +      testSync "alice";
  +    };
     '';
  -}
  +})
  
positive.code:               die "command `$cmd' did not succeed (exit code $status)\n";
              }
            });
  
            $client->succeed(su $user,
              "task config taskd.server server:${portStr} >&2"
  
negative.code:   testScript = { nodes, ... }: let
      cfg = nodes.server.config.services.taskserver;
      portStr = toString cfg.listenPort;
      newServerSystem = nodes.newServer.config.system.build.toplevel;
      switchToNewServer = "${newServerSystem}/bin/switch-to-configuration test";
    in ''
      sub su ($$) {
        my ($user, $cmd) = @_;
  