docs: public CompletableFuture<Revision> createToken(Author author, String appId, String secret,
                                                     boolean isAdmin) {
          requireNonNull(author, "author");
          requireNonNull(appId, "appId");
          requireNonNull(secret, "secret");
  
          checkArgument(secret.startsWith(SECRET_PREFIX), "secret must start with: " + SECRET_PREFIX);
  
          final Token newToken = new Token(appId, secret, isAdmin, UserAndTimestamp.of(author));
          final JsonPointer appIdPath = JsonPointer.compile("/appIds" + encodeSegment(newToken.id()));
          final String newTokenSecret = newToken.secret();
          assert newTokenSecret != null;
          final JsonPointer secretPath = JsonPointer.compile("/secrets" + encodeSegment(newTokenSecret));
          final Change<JsonNode> change =
                  Change.ofJsonPatch(TOKEN_JSON,
                                     asJsonArray(new TestAbsenceOperation(appIdPath),
                                                 new TestAbsenceOperation(secretPath),
                                                 new AddOperation(appIdPath, Jackson.valueToTree(newToken)),
                                                 new AddOperation(secretPath,
                                                                  Jackson.valueToTree(newToken.id()))));
          return tokenRepo.push(INTERNAL_PROJ, Project.REPO_DOGMA, author,
                                "Add a token: '" + newToken.id(), change);
      }