Repository: washingtonpost/ans-schema
Pull request #150 (2017-11-08 22:02:46)

Implementation of new Author object for ANS 0.5.9
This is prep work for the future, and has no immediate impact on anyone until all services support ANS 0.5.9.

- Matches author fields to Google Transparency project (new Author Service fields)
- Makes `byline` distinct from `name` and is a required field
- Makes `version` required for authors


Patch:
diff --git a/docs/proposals/2017-10-16_App_Name_And_Priority.md b/docs/proposals/2017-10-16_App_Name_And_Priority.md
deleted file mode 100644
index d080207..0000000
--- a/docs/proposals/2017-10-16_App_Name_And_Priority.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Application Name and Priority
-
-For the forthcoming priority queue feature in Content API, a way is needed to distinguish the priority of source events for priority ordering. The optional `priority` field is being added to all operation types to distinguish ingestion events from normal usage events. To ensure that this feature is used for its intended purpose, `app_name` will also be required for events requesting to set their own priority level. This field can be mapped to whitelists or blacklists by operation consumers.
-
-Note that these fields are informational only -- there is no guarantee that any particular downstream consumer honor the priority setting.
-
-Since these fields have been added to existing production environments already, the new fields will be present in both ANS 0.5.8 (current production version) and 0.5.9.
-
-## Concerns
-
-## What is the difference between `app_name` in the operations and `source.system` or `source.source_type` in the ANS content document? ##
-
-See the source object: [https://github.com/washingtonpost/ans-schema/blob/master/src/main/resources/schema/ans/0.5.9/traits/trait_source.json]
-
-`source.system` represents the name of the CMS or editor (e.g. 'ellipsis', 'wordpress') that was used by a writer, editor or producer to *input* the original document. If this is unknown, it should be omitted.  `source_type` represents, more generally, the mechanism used for content entry -- either `staff` or `wires` depending on whether the story was created in-house or imported from a wire feed.
-
-`app_name` is more technical and literal than either of the above fields. It is used as a unique identifier of the application which is requesting that a given document be updated, published, deleted, etc. In some cases it may be the same as `source.system` but there is no reason this must be so.
-
-For example, imagine a bulk migration script that imports documents from an existing WordPress installation within an organization.  In such a case, `source.system` would be "wordpress", `source.source_type` would likely be "staff" but `app_name` might be `wapo_importer_2017_10_10`.  But if a live-ingestor for that same WordPress installation were also configured, the `app_name` for future updates to the same content would be `wordpress`.
-
-Note also that `app_name` is a property of the `operation` being requested, *not* the document being operated on.
diff --git a/lib/transforms.js b/lib/transforms.js
index baa90e0..acf6855 100644
--- a/lib/transforms.js
+++ b/lib/transforms.js
@@ -28,7 +28,12 @@ var doUpvert = function doUpvert(ans, version_to) {
     return ans;
   }
 
-  var version_from = new Version(version.parse_version(ans.version));
+  try {
+    var version_from = new Version(version.parse_version(ans.version));
+  }
+  catch (error) {
+    throw new Error("Could not detect old ANS version.", error);
+  }
   var minor_version = version_from.major + "." + version_from.minor;
 
   // Stop recursion
diff --git a/lib/upvert/0.5.8.js b/lib/upvert/0.5.8.js
index dd16200..0d02b7a 100644
--- a/lib/upvert/0.5.8.js
+++ b/lib/upvert/0.5.8.js
@@ -8,13 +8,143 @@ var version_incrementer = transform_utils.version_incrementer;
 var top_level_types = transform_utils.top_level_types;
 var accumulatorFor = transform_utils.accumulatorFor;
 
+var convertAuthor = function convertAuthor(author) {
+  var newAuthor = _.cloneDeep(author);
+
+  // Promote string fields from additional properties if missing
+  var new_string_fields = [ 'first_name', 'last_name', 'middle_name', 'suffix', 'location', 'division', 'email',
+                            'role', 'expertise', 'affiliation', 'languages', 'long_bio', 'byline' ];
+
+  _.forEach(new_string_fields, function(fieldName) {
+    if (_.has(newAuthor, fieldName) === false &&
+        _.has(author, 'additional_properties.' + fieldName) &&
+        _.isString(_.get(author, 'additional_properties.' + fieldName))) {
+      newAuthor[fieldName] = _.get(author, 'additional_properties.' + fieldName);
+    }
+  });
+
+  // Promote books from additional_properties
+  if (_.has(newAuthor, 'books') === false && (_.has(author, 'additional_properties.books'))) {
+    var newBooks = [];
+    var books = _.get(author, 'additional_properties.books');
+    if (_.isArray(books)) {
+      _.forEach(books, function(book) {
+        var newBook = {};
+
+        if (_.isString(_.get(book, 'book_title'))) {
+          newBook.book_title = _.get(book, 'book_title');
+        }
+        if (_.isString(_.get(book, 'book_url'))) {
+          newBook.book_url = _.get(book, 'book_url');
+        }
+
+        if (_.has(newBook, 'book_title')) {
+          newBooks.push(newBook);
+        }
+      });
+      if (newBooks.length > 0) {
+        newAuthor.books = newBooks;
+      }
+    }
+  }
+
+  // Promote education from additional_properties
+  if (_.has(newAuthor, 'education') === false && (_.has(author, 'additional_properties.education'))) {
+    var newSchools = [];
+    var schools = _.get(author, 'additional_properties.education');
+    if (_.isArray(schools)) {
+      _.forEach(schools, function(school) {
+        var newSchool = {};
+
+        if (_.isString(_.get(school, 'school_name'))) {
+          newSchool.school_name = _.get(school, 'school_name');
+          newSchools.push(newSchool);
+        }
+      });
+      if (newSchools.length > 0) {
+        newAuthor.education = newSchools;
+      }
+    }
+  }
+
+  // Promote awards from additional_properties
+  if (_.has(newAuthor, 'awards') === false && (_.has(author, 'additional_properties.awards'))) {
+    var newAwards = [];
+    var awards = _.get(author, 'additional_properties.awards');
+    if (_.isArray(awards)) {
+      _.forEach(awards, function(award) {
+        var newAward = {};
+
+        if (_.isString(_.get(award, 'award_name'))) {
+          newAward.award_name = _.get(award, 'award_name');
+          newAwards.push(newAward);
+        }
+      });
+      if (newAwards.length > 0) {
+        newAuthor.awards = newAwards;
+      }
+    }
+  }
+
+  // If socialLinks exists, but social_links does not, use it
+  if ((_.has(newAuthor, 'social_links') == false) && _.has(newAuthor, 'socialLinks')) {
+    newAuthor.social_links = newAuthor.socialLinks;
+  }
+
+  // Guarantee byline field
+  if (_.has(newAuthor, 'byline') == false) {
+    if (_.has(author, 'name')) {
+      newAuthor.byline = _.get(author, 'name');
+    }
+    else {
+      newAuthor.byline = '';
+    }
+  }
+
+
+
+  newAuthor.version = '0.5.9';
+
+  var valid_author_properties = [
+    '_id', 'type', 'version', 'name', 'image', 'url', 'social_links', 'slug', 'first_name',
+    'middle_name', 'last_name', 'suffix', 'byline', 'location', 'division', 'email',
+    'role', 'expertise', 'affiliation', 'languages', 'bio', 'long_bio',
+    'books', 'education', 'contributor', 'org', 'socialLinks', 'additional_properties' ];
+
+  return _.pick(newAuthor, valid_author_properties);
+};
+
+// Generic recur-and-convert down object tree
+var convert = function convert(ans) {
+  if (!_.isObject(ans)) {
+    return ans;
+  }
+
+  if (_.isArray(ans)) {
+    return _.map(ans, convert);
+  }
+
+  if (_.has(ans, 'type')) {
+    if (ans.type === 'author') {
+      return convertAuthor(ans);
+    }
+  }
+
+  return _.transform(ans, function(result, value, key, object) {
+    if (key === 'additional_properties' || key === 'referent_properties' || key === 'referent') {
+      result[key] = value;
+    }
+    else {
+      result[key] = convert(value);
+    }
+  }, accumulatorFor(ans));
+};
+
+
 var upvert = function(input) {
   var output = version_incrementer("0.5.9")(input);
 
-  // TODO: Add upvert logic here
-  // If change is non-breaking, you can leave this as-is.
-
-  return output;
+  return convert(output);
 };
 
 module.exports = upvert;
diff --git a/src/main/resources/schema/ans/0.5.8/author_operation.json b/src/main/resources/schema/ans/0.5.8/author_operation.json
index b63bbf8..f1cc70c 100644
--- a/src/main/resources/schema/ans/0.5.8/author_operation.json
+++ b/src/main/resources/schema/ans/0.5.8/author_operation.json
@@ -32,14 +32,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json"
-      },
-
       "body": {
         "description": "The object being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.3/utils/site.json"
diff --git a/src/main/resources/schema/ans/0.5.8/clavis_operation.json b/src/main/resources/schema/ans/0.5.8/clavis_operation.json
index 8987041..56938ad 100644
--- a/src/main/resources/schema/ans/0.5.8/clavis_operation.json
+++ b/src/main/resources/schema/ans/0.5.8/clavis_operation.json
@@ -40,15 +40,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json"
-      },
-
-
       "keywords": {
         "type": "array",
         "items": {
diff --git a/src/main/resources/schema/ans/0.5.8/content_operation.json b/src/main/resources/schema/ans/0.5.8/content_operation.json
index 6d3f35d..9f743be 100644
--- a/src/main/resources/schema/ans/0.5.8/content_operation.json
+++ b/src/main/resources/schema/ans/0.5.8/content_operation.json
@@ -70,15 +70,7 @@
             "title": "Referent Update",
             "description": "If true, this update was triggered by an update to a referenced element in the document rather than the document itself.",
             "type": "boolean"
-          },
-
-          "priority": {
-            "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json"
-          },
-          "app_name": {
-            "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json"
           }
-
         }
       }
     },
diff --git a/src/main/resources/schema/ans/0.5.8/gallery_operation.json b/src/main/resources/schema/ans/0.5.8/gallery_operation.json
index 23a9133..4e69225 100644
--- a/src/main/resources/schema/ans/0.5.8/gallery_operation.json
+++ b/src/main/resources/schema/ans/0.5.8/gallery_operation.json
@@ -37,12 +37,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json"
-      },
       "body": {
         "description": "The gallery being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/gallery.json"
diff --git a/src/main/resources/schema/ans/0.5.8/image_operation.json b/src/main/resources/schema/ans/0.5.8/image_operation.json
index f5cb614..3db3ef2 100644
--- a/src/main/resources/schema/ans/0.5.8/image_operation.json
+++ b/src/main/resources/schema/ans/0.5.8/image_operation.json
@@ -47,12 +47,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json"
-      },
       "body": {
         "description": "The image being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/image.json"
diff --git a/src/main/resources/schema/ans/0.5.8/site_operation.json b/src/main/resources/schema/ans/0.5.8/site_operation.json
index 981f08c..5bc5a91 100644
--- a/src/main/resources/schema/ans/0.5.8/site_operation.json
+++ b/src/main/resources/schema/ans/0.5.8/site_operation.json
@@ -32,14 +32,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json"
-      },
-
       "body": {
         "description": "The object being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.3/utils/author.json"
diff --git a/src/main/resources/schema/ans/0.5.8/story_operation.json b/src/main/resources/schema/ans/0.5.8/story_operation.json
index 5504e9b..1e28317 100644
--- a/src/main/resources/schema/ans/0.5.8/story_operation.json
+++ b/src/main/resources/schema/ans/0.5.8/story_operation.json
@@ -58,13 +58,6 @@
       "type": "string",
       "description": "The version of ANS this Story is written in"
     },
-    "priority": {
-      "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json"
-    },
-    "app_name": {
-      "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json"
-    },
-
     "story": {
       "description": "The story object being created/updated/deleted/published/unpublished",
       "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/story.json"
diff --git a/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json b/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json
deleted file mode 100644
index 1260413..0000000
--- a/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "id": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json",
-  "title": "Application Name",
-  "description": "The name of the application that generated an operation. This is used by downstream consumers in conjunction with 'priority' to make decisions about optimization.",
-  "type": "string"
-}
diff --git a/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json b/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json
deleted file mode 100644
index 2485593..0000000
--- a/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "id": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json",
-  "title": "Priority",
-  "description": "The priority identifier of this operation. This is used by downstream consumers to make decisions about optimization. The value 'standard' indicates an operation generated from a UI or live update. The value 'ingestion' indicates an operation generated by a migration script or background import.  Note that this represents a request for priority consideration from event-generating apps and downstream applications are not obligated to honor it.",
-  "type": "string",
-  "enum": [ "standard", "ingestion" ]
-}
diff --git a/src/main/resources/schema/ans/0.5.8/url_operation.json b/src/main/resources/schema/ans/0.5.8/url_operation.json
index 8da18d8..9c99de8 100644
--- a/src/main/resources/schema/ans/0.5.8/url_operation.json
+++ b/src/main/resources/schema/ans/0.5.8/url_operation.json
@@ -44,14 +44,7 @@
       "destination_url": {
         "type": "string",
         "description": "The new canonical_url of the story.  The original_url will redirect to the destination_url."
-      },
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json"
       }
-
     },
     "required": [ "type", "operation", "id", "organization_id" ]
   }]
diff --git a/src/main/resources/schema/ans/0.5.8/video_operation.json b/src/main/resources/schema/ans/0.5.8/video_operation.json
index 72632a9..e5e73b6 100644
--- a/src/main/resources/schema/ans/0.5.8/video_operation.json
+++ b/src/main/resources/schema/ans/0.5.8/video_operation.json
@@ -32,13 +32,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.8/traits/trait_app_name.json"
-      },
-
       "body": {
         "description": "The object being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.3/video.json"
diff --git a/src/main/resources/schema/ans/0.5.9/author_operation.json b/src/main/resources/schema/ans/0.5.9/author_operation.json
index 1a9a617..32eb2df 100644
--- a/src/main/resources/schema/ans/0.5.9/author_operation.json
+++ b/src/main/resources/schema/ans/0.5.9/author_operation.json
@@ -32,14 +32,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json"
-      },
-
       "body": {
         "description": "The object being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.3/utils/site.json"
diff --git a/src/main/resources/schema/ans/0.5.9/clavis_operation.json b/src/main/resources/schema/ans/0.5.9/clavis_operation.json
index eff2749..95bb6cf 100644
--- a/src/main/resources/schema/ans/0.5.9/clavis_operation.json
+++ b/src/main/resources/schema/ans/0.5.9/clavis_operation.json
@@ -40,14 +40,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json"
-      },
-
       "keywords": {
         "type": "array",
         "items": {
diff --git a/src/main/resources/schema/ans/0.5.9/content_operation.json b/src/main/resources/schema/ans/0.5.9/content_operation.json
index 00e51c3..e10554f 100644
--- a/src/main/resources/schema/ans/0.5.9/content_operation.json
+++ b/src/main/resources/schema/ans/0.5.9/content_operation.json
@@ -70,15 +70,7 @@
             "title": "Referent Update",
             "description": "If true, this update was triggered by an update to a referenced element in the document rather than the document itself.",
             "type": "boolean"
-          },
-
-          "priority": {
-            "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json"
-          },
-          "app_name": {
-            "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json"
           }
-
         }
       }
 
diff --git a/src/main/resources/schema/ans/0.5.9/gallery_operation.json b/src/main/resources/schema/ans/0.5.9/gallery_operation.json
index 7570bb8..7a51c90 100644
--- a/src/main/resources/schema/ans/0.5.9/gallery_operation.json
+++ b/src/main/resources/schema/ans/0.5.9/gallery_operation.json
@@ -1,4 +1,3 @@
-
 {
   "$schema": "http://json-schema.org/draft-04/schema#",
   "id": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/gallery_operation.json",
@@ -38,20 +37,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-      "priority": {
-        "type": "string",
-        "title": "Priority",
-        "description": "The priority identifier of this operation. This is used by downstream consumers to make decisions about optimization. The value 'standard' indicates an operation generated from a UI or live update. The value 'ingestion' indicates an operation generated by a migration script or background import.",
-        "enum": [ "standard", "ingestion" ]
-      },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json"
-      },
-
       "body": {
         "description": "The gallery being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/gallery.json"
diff --git a/src/main/resources/schema/ans/0.5.9/image_operation.json b/src/main/resources/schema/ans/0.5.9/image_operation.json
index b46c6ed..f5a47ce 100644
--- a/src/main/resources/schema/ans/0.5.9/image_operation.json
+++ b/src/main/resources/schema/ans/0.5.9/image_operation.json
@@ -47,21 +47,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-      "priority": {
-        "type": "string",
-        "title": "Priority",
-        "description": "The priority identifier of this operation. This is used by downstream consumers to make decisions about optimization. The value 'standard' indicates an operation generated from a UI or live update. The value 'ingestion' indicates an operation generated by a migration script or background import.",
-        "enum": [ "standard", "ingestion" ]
-      },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json"
-      },
-
-
       "body": {
         "description": "The image being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/image.json"
diff --git a/src/main/resources/schema/ans/0.5.9/site_operation.json b/src/main/resources/schema/ans/0.5.9/site_operation.json
index 4266158..9c45087 100644
--- a/src/main/resources/schema/ans/0.5.9/site_operation.json
+++ b/src/main/resources/schema/ans/0.5.9/site_operation.json
@@ -32,14 +32,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json"
-      },
-
       "body": {
         "description": "The object being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.3/utils/author.json"
diff --git a/src/main/resources/schema/ans/0.5.9/story_operation.json b/src/main/resources/schema/ans/0.5.9/story_operation.json
index 782fc9b..bdbf44e 100644
--- a/src/main/resources/schema/ans/0.5.9/story_operation.json
+++ b/src/main/resources/schema/ans/0.5.9/story_operation.json
@@ -58,14 +58,6 @@
       "type": "string",
       "description": "The version of ANS this Story is written in"
     },
-
-    "priority": {
-      "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json"
-    },
-    "app_name": {
-      "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json"
-    },
-
     "story": {
       "description": "The story object being created/updated/deleted/published/unpublished",
       "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/story.json"
diff --git a/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json b/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json
deleted file mode 100644
index 24e949e..0000000
--- a/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "id": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json",
-  "title": "Application Name",
-  "description": "The name of the application that generated an operation. This is used by downstream consumers in conjunction with 'priority' to make decisions about optimization.",
-  "type": "string"
-}
diff --git a/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json b/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json
deleted file mode 100644
index 1d6222c..0000000
--- a/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "id": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json",
-  "title": "Priority",
-  "description": "The priority identifier of this operation. This is used by downstream consumers to make decisions about optimization. The value 'standard' indicates an operation generated from a UI or live update. The value 'ingestion' indicates an operation generated by a migration script or background import.  Note that this represents a request for priority consideration from event-generating apps and downstream applications are not obligated to honor it.",
-  "type": "string",
-  "enum": [ "standard", "ingestion" ]
-}
diff --git a/src/main/resources/schema/ans/0.5.9/url_operation.json b/src/main/resources/schema/ans/0.5.9/url_operation.json
index 8c4a54b..aed6ef5 100644
--- a/src/main/resources/schema/ans/0.5.9/url_operation.json
+++ b/src/main/resources/schema/ans/0.5.9/url_operation.json
@@ -37,14 +37,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json"
-      },
-
       "original_url": {
         "type": "string",
         "description": "The original url that will trigger a redirect to the destination_url."
diff --git a/src/main/resources/schema/ans/0.5.9/utils/author.json b/src/main/resources/schema/ans/0.5.9/utils/author.json
index 0b37ba9..e97c6df 100644
--- a/src/main/resources/schema/ans/0.5.9/utils/author.json
+++ b/src/main/resources/schema/ans/0.5.9/utils/author.json
@@ -9,43 +9,204 @@
     "_id": {
       "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_id.json"
     },
+
     "type": {
       "description": "Indicates that this is an author",
       "type": "string",
       "enum": [ "author" ]
     },
-    "name": {
-      "description": "The name of contributor.",
-      "type": "string"
+
+    "version": {
+      "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_version.json"
     },
-    "org": {
-      "description": "The name of the organization the contributor belongs to.",
+
+    "name": {
+      "title": "Name",
+      "description": "The full human name of contributor. See also byline, first_name, last_name, middle_name, suffix.",
       "type": "string"
     },
+
     "image": {
       "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/image.json"
     },
-    "bio": {
-      "description": "A description/short bio of the contributor.",
-      "type": "string"
-    },
+
     "url": {
-      "description": "A url to some deeper set of information about the contributor.",
+      "description": "A link to an author's landing page on the website, or a personal website.",
       "type": "string"
     },
+
     "social_links": {
       "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_social.json"
     },
-    "socialLinks": {
-      "description": "Deperecated. Included for backwards-compatibility.",
-      "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_social.json"
-    },
+
     "slug": {
        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_slug.json"
     },
+
+    "first_name": {
+      "title": "First Name",
+      "description": "The real first name of a human author.",
+      "type": "string"
+    },
+
+    "middle_name": {
+      "title": "Middle Name",
+      "description": "The real middle name of a human author.",
+      "type": "string"
+    },
+
+    "last_name": {
+      "title": "Last Name",
+      "description": "The real last name of a human author.",
+      "type": "string"
+    },
+
+    "suffix": {
+      "title": "Suffix",
+      "description": "The real suffix of a human author.",
+      "type": "string"
+    },
+
+    "byline": {
+      "title": "Byline",
+      "description": "The public-facing name, or nom-de-plume, name of the author.",
+      "type": "string"
+    },
+
+    "location": {
+      "title": "Location",
+      "description": "The city or locality that the author resides in or is primarily associated with.",
+      "type": "string"
+    },
+
+    "division": {
+      "title": "Division",
+      "description": "The desk or group that this author normally reports to. E.g., 'Politics' or 'Sports.'",
+      "type": "string"
+    },
+
+    "email": {
+      "title": "E-mail",
+      "description": "The professional email address of this author.",
+      "type": "string",
+      "format": "email"
+    },
+
+    "role": {
+      "title": "Role",
+      "description": "The organizational role or title of this author.",
+      "type": "string"
+    },
+
+    "expertise": {
+      "title": "Expertise",
+      "description": "A comma-delimited list of subjects the author in which the author has expertise.",
+      "type": "string"
+    },
+
+    "affiliation": {
+      "title": "Affiliation",
+      "description": "The name of an organization the author is affiliated with. E.g., The Washington Post, or George Mason University.",
+      "type": "string"
+    },
+
+    "languages": {
+      "title": "Languages",
+      "description": "A description of list of languages that the author is somewhat fluent in, excluding the native language of the parent publication, and identified in the language of the parent publication. E.g., Russian, Japanese, Greek.",
+      "type": "string"
+    },
+
+    "bio": {
+      "title": "Short Biography",
+      "description": "A one or two sentence description of the author.",
+      "type": "string"
+    },
+
+    "long_bio": {
+      "title": "Long Biography",
+      "description": "The full biography of the author.",
+      "type": "string"
+    },
+
+    "books": {
+      "title": "Books",
+      "description": "A list of books written by the author.",
+      "type": "array",
+      "items": {
+        "title": "Book",
+        "type": "object",
+        "additionalProperties": false,
+        "properties": {
+          "book_title": {
+            "title": "Title",
+            "description": "The book title.",
+            "type": "string"
+          },
+          "book_url": {
+            "title": "URL",
+            "description": "A link to a page to purchase or learn more about the book.",
+            "type": "string"
+          }
+        }
+      }
+    },
+
+    "education": {
+      "title": "Education",
+      "description": "A list of schools that this author has graduated from.",
+      "type": "array",
+      "items": {
+        "title": "School",
+        "type": "object",
+        "additionalProperties": false,
+        "properties": {
+          "school_name": {
+            "title": "School Name",
+            "description": "The name of the school.",
+            "type": "string"
+          }
+        }
+      }
+    },
+
+
+    "awards": {
+      "title": "Awards",
+      "description": "A list of awards the author has received.",
+      "type": "array",
+      "items": {
+        "type": "object",
+        "additionalProperties": false,
+        "properties": {
+          "award_name": {
+            "title": "Award Name",
+            "description": "The name of the award.",
+            "type": "string"
+          }
+        }
+      }
+    },
+
+    "contributor": {
+      "type": "boolean",
+      "title": "Contributor",
+      "description": "If true, this author is an external contributor to the publication."
+    },
+
+    "org": {
+      "title": "Org",
+      "description": "Deprecated. In ANS 0.5.8 and prior versions, this field is populated with the 'location' field from Arc Author Service. New implementations should use the 'location' and 'affiliation' field. Content should be identical to 'location.'",
+      "type": "string"
+    },
+
+    "socialLinks": {
+      "description": "Deperecated. Included for backwards-compatibility. Content should be identical to social_links.",
+      "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_social.json"
+    },
+
     "additional_properties": {
       "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_additional_properties.json"
     }
   },
-  "required": [ "type", "name" ]
+  "required": [ "type", "version", "name", "byline" ]
 }
diff --git a/src/main/resources/schema/ans/0.5.9/video_operation.json b/src/main/resources/schema/ans/0.5.9/video_operation.json
index 7931528..988caae 100644
--- a/src/main/resources/schema/ans/0.5.9/video_operation.json
+++ b/src/main/resources/schema/ans/0.5.9/video_operation.json
@@ -32,14 +32,6 @@
         "type": "string",
         "description": "The version of ANS this item is written in"
       },
-
-      "priority": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_priority.json"
-      },
-      "app_name": {
-        "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.9/traits/trait_app_name.json"
-      },
-
       "body": {
         "description": "The object being inserted/updated/deleted",
         "$ref": "https://raw.githubusercontent.com/washingtonpost/ans-schema/master/src/main/resources/schema/ans/0.5.3/video.json"


Test patch:
diff --git a/tests/fixtures/schema/0.5.8/content-operation-good.json b/tests/fixtures/schema/0.5.8/content-operation-good.json
index ce16e9d..342ab72 100644
--- a/tests/fixtures/schema/0.5.8/content-operation-good.json
+++ b/tests/fixtures/schema/0.5.8/content-operation-good.json
@@ -22,9 +22,6 @@
   "version" : "0.5.8",
   "trigger": {
     "type": "image",
-    "id": "AB456",
-    "referent_update": false,
-    "priority": "standard",
-    "app_name": "ellipsis"
+    "id": "AB456"
   }
 }
diff --git a/tests/fixtures/schema/0.5.8/gallery-operation-create.json b/tests/fixtures/schema/0.5.8/gallery-operation-create.json
index d394ddf..3614cbe 100644
--- a/tests/fixtures/schema/0.5.8/gallery-operation-create.json
+++ b/tests/fixtures/schema/0.5.8/gallery-operation-create.json
@@ -73,8 +73,5 @@
   "operation" : "insert",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "gallery-operation",
-  "version" : "0.5.8",
-  "priority": "standard",
-  "app_name": "anglerfish"
-
+  "version" : "0.5.8"
 }
diff --git a/tests/fixtures/schema/0.5.8/gallery-operation-delete.json b/tests/fixtures/schema/0.5.8/gallery-operation-delete.json
index 442b63c..b717cc9 100644
--- a/tests/fixtures/schema/0.5.8/gallery-operation-delete.json
+++ b/tests/fixtures/schema/0.5.8/gallery-operation-delete.json
@@ -4,7 +4,5 @@
   "operation" : "delete",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "gallery-operation",
-  "version" : "0.5.8",
-  "priority": "standard",
-  "app_name": "anglerfish"
+  "version" : "0.5.8"
 }
diff --git a/tests/fixtures/schema/0.5.8/gallery-operation-update.json b/tests/fixtures/schema/0.5.8/gallery-operation-update.json
index 71e8091..0191103 100644
--- a/tests/fixtures/schema/0.5.8/gallery-operation-update.json
+++ b/tests/fixtures/schema/0.5.8/gallery-operation-update.json
@@ -72,8 +72,5 @@
   "operation" : "update",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "gallery-operation",
-  "version" : "0.5.8",
-  "priority": "standard",
-  "app_name": "anglerfish"
-
+  "version" : "0.5.8"
 }
diff --git a/tests/fixtures/schema/0.5.8/image-operation-create.json b/tests/fixtures/schema/0.5.8/image-operation-create.json
index ec83b49..d811a1a 100644
--- a/tests/fixtures/schema/0.5.8/image-operation-create.json
+++ b/tests/fixtures/schema/0.5.8/image-operation-create.json
@@ -33,8 +33,5 @@
   "operation" : "insert",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "image-operation",
-  "version" : "0.5.8",
-  "priority": "standard",
-  "app_name": "anglerfish"
-
+  "version" : "0.5.8"
 }
diff --git a/tests/fixtures/schema/0.5.8/image-operation-delete.json b/tests/fixtures/schema/0.5.8/image-operation-delete.json
index 1885eac..3a5f833 100644
--- a/tests/fixtures/schema/0.5.8/image-operation-delete.json
+++ b/tests/fixtures/schema/0.5.8/image-operation-delete.json
@@ -4,8 +4,5 @@
   "operation" : "delete",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "image-operation",
-  "version" : "0.5.8",
-  "priority": "standard",
-  "app_name": "anglerfish"
-
+  "version" : "0.5.8"
 }
diff --git a/tests/fixtures/schema/0.5.8/image-operation-update.json b/tests/fixtures/schema/0.5.8/image-operation-update.json
index f01778a..9bfbd0f 100644
--- a/tests/fixtures/schema/0.5.8/image-operation-update.json
+++ b/tests/fixtures/schema/0.5.8/image-operation-update.json
@@ -32,8 +32,5 @@
   "operation" : "update",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "image-operation",
-  "version" : "0.5.8",
-  "priority": "standard",
-  "app_name": "anglerfish"
-
+  "version" : "0.5.8"
 }
diff --git a/tests/fixtures/schema/0.5.8/operation-create.json b/tests/fixtures/schema/0.5.8/operation-create.json
index 6acf4a6..fe85d76 100644
--- a/tests/fixtures/schema/0.5.8/operation-create.json
+++ b/tests/fixtures/schema/0.5.8/operation-create.json
@@ -6,8 +6,6 @@
   "revision_id": "1A",
   "branch": "default",
   "version": "0.5.8",
-  "priority": "standard",
-  "app_name": "ellipsis",
   "story": {
     "_id": "f8f706f0-0acc-11e5-9e39-0db921c47b93",
     "version": "0.5.8",
diff --git a/tests/fixtures/schema/0.5.8/operation-delete.json b/tests/fixtures/schema/0.5.8/operation-delete.json
index afc3daa..52fa3a4 100644
--- a/tests/fixtures/schema/0.5.8/operation-delete.json
+++ b/tests/fixtures/schema/0.5.8/operation-delete.json
@@ -5,7 +5,5 @@
   "story_id": "f8f706f0-0acc-11e5-9e39-0db921c47b93",
   "revision_id": "2A",
   "branch": "default",
-  "version": "0.5.8",
-  "priority": "standard",
-  "app_name": "ellipsis"
+  "version": "0.5.8"
 }
diff --git a/tests/fixtures/schema/0.5.8/operation-publish-edition.json b/tests/fixtures/schema/0.5.8/operation-publish-edition.json
index 6f08f8f..8e8b715 100644
--- a/tests/fixtures/schema/0.5.8/operation-publish-edition.json
+++ b/tests/fixtures/schema/0.5.8/operation-publish-edition.json
@@ -7,9 +7,6 @@
   "branch": "default",
   "version": "0.5.8",
   "editions": [ "web" ],
-  "priority": "standard",
-  "app_name": "ellipsis",
-
   "story": {
     "_id": "f8f706f0-0acc-11e5-9e39-0db921c47b93",
     "version": "0.5.8",
diff --git a/tests/fixtures/schema/0.5.8/operation-unpublish-edition.json b/tests/fixtures/schema/0.5.8/operation-unpublish-edition.json
index bced1ba..dc12734 100644
--- a/tests/fixtures/schema/0.5.8/operation-unpublish-edition.json
+++ b/tests/fixtures/schema/0.5.8/operation-unpublish-edition.json
@@ -6,8 +6,5 @@
   "revision_id": "2A",
   "branch": "default",
   "version": "0.5.8",
-  "editions": [ "web" ],
-  "priority": "standard",
-  "app_name": "ellipsis"
-
+  "editions": [ "web" ]
 }
diff --git a/tests/fixtures/schema/0.5.8/operation-update.json b/tests/fixtures/schema/0.5.8/operation-update.json
index a6cca70..5a1672a 100644
--- a/tests/fixtures/schema/0.5.8/operation-update.json
+++ b/tests/fixtures/schema/0.5.8/operation-update.json
@@ -6,9 +6,6 @@
   "revision_id": "2A",
   "branch": "default",
   "version": "0.5.8",
-  "priority": "standard",
-  "app_name": "ellipsis",
-
   "story": {
     "_id": "f8f706f0-0acc-11e5-9e39-0db921c47b93",
     "version": "0.5.8",
diff --git a/tests/fixtures/schema/0.5.8/url-operation-insert-redirect.json b/tests/fixtures/schema/0.5.8/url-operation-insert-redirect.json
index 3cc1cda..de30d4a 100644
--- a/tests/fixtures/schema/0.5.8/url-operation-insert-redirect.json
+++ b/tests/fixtures/schema/0.5.8/url-operation-insert-redirect.json
@@ -5,8 +5,6 @@
   "organization_id" : "staging",
   "type" : "url-operation",
   "version" : "0.5.8",
-  "priority": "standard",
-  "app_name": "ellipsis",
   "original_url" : "/original-url",
   "destination_url" : "/destination-url"
 }
diff --git a/tests/fixtures/schema/0.5.9/audio-fixture-good-streams.json b/tests/fixtures/schema/0.5.9/audio-fixture-good-streams.json
index 220c272..b27acbf 100644
--- a/tests/fixtures/schema/0.5.9/audio-fixture-good-streams.json
+++ b/tests/fixtures/schema/0.5.9/audio-fixture-good-streams.json
@@ -6,7 +6,9 @@
     "by": [
       {
         "type": "author",
-        "name": "John Jacob"
+        "version": "0.5.9",
+        "name": "John Jacob",
+        "byline": "John Jacob"
       }
     ]
   },
diff --git a/tests/fixtures/schema/0.5.9/audio-fixture-good.json b/tests/fixtures/schema/0.5.9/audio-fixture-good.json
index a4360e9..7bb4a2a 100644
--- a/tests/fixtures/schema/0.5.9/audio-fixture-good.json
+++ b/tests/fixtures/schema/0.5.9/audio-fixture-good.json
@@ -8,7 +8,9 @@
     "by": [
       {
         "type": "author",
-        "name": "John Jacob"
+        "version": "0.5.9",
+        "name": "John Jacob",
+        "byline": "John Jacob"
       }
     ]
   },
diff --git a/tests/fixtures/schema/0.5.9/author-fixture-good.json b/tests/fixtures/schema/0.5.9/author-fixture-good.json
new file mode 100644
index 0000000..158a217
--- /dev/null
+++ b/tests/fixtures/schema/0.5.9/author-fixture-good.json
@@ -0,0 +1,80 @@
+{
+  "type": "author",
+  "version": "0.5.9",
+  "_id": "engelg",
+  "name": "Gregory Engel",
+  "image": {
+    "type": "image",
+    "version": "0.5.9",
+    "url": "https://img.washingtonpost.com/rf/image_1248x701/2010-2019/WashingtonPost/2017/11/08/Local/Images/vagovernorgop3.jpg?t=20170517a"
+  },
+  "url": "http://www.washingtonpost.com",
+  "social_links": [
+    {
+      "site": "facebook",
+      "url": "http://facebook.com/gregory.r.engel"
+    },
+    {
+      "site": "reddit",
+      "url": "http://reddit.com/u/gregory.r.engel"
+    }
+  ],
+  "slug": "gregory-r-engel",
+  "first_name": "Gregory",
+  "middle_name": "R.",
+  "last_name": "Engel",
+  "suffix": "Jr.",
+  "byline": "Greg Engel",
+  "location": "Washington, D.C.",
+  "division": "Sports",
+  "email": "gregory.engel@washpost.com",
+  "role": "Content API Developer",
+  "expertise": "Baltimore, Soviet Cinema, Blue Seashells",
+  "affiliation": "The Washington Post",
+  "languages": "Russian",
+  "bio": "Gregory Engel is a developer for Arc Publishing at The Washington Post",
+  "long_bio": "Gregory Engel is a developer for Arc Publishing at The Washington Post. He has won numerous awards for his ten-part expose on breakfast cereal marshmallows in feudal Japan, including a Very Good Writer Award from Very Good Writer Magazine. He engages in online dicourse with his numerous fans and vociferous critics. His real name is 'Joe.'",
+  "books": [
+    {
+      "book_title": "Ten Ways to Eat Ice Cream: A Human's Guide for the Intimidated",
+      "book_url": "http://icecreambook.com"
+    },
+    {
+      "book_title": "If Only They Would Build It: The History of Turtle Fences in Medieval Wisconsin",
+      "book_url": "http://turtlefencebook.com"
+    },
+    {
+      "book_title": "The Speckled Land (A George Irwin Mystery)",
+      "book_url": "http://georgeirwinmysteries.com"
+    }
+  ],
+  "education": [
+    {
+      "school_name": "Oberlin College"
+    },
+    {
+      "school_name": "International Language Institute"
+    }
+  ],
+  "awards": [
+    {
+      "award_name": "A Very Good Writer Award"
+    },
+    {
+      "award_name": "A Just-OK Writer Award"
+    }
+  ],
+  "contributor": false,
+
+  "org": "Washington, D.C.",
+  "socialLinks": [
+    {
+      "site": "facebook",
+      "url": "http://facebook.com/gregory.r.engel"
+    },
+    {
+      "site": "reddit",
+      "url": "http://reddit.com/u/gregory.r.engel"
+    }
+  ]
+}
diff --git a/tests/fixtures/schema/0.5.9/content-operation-good.json b/tests/fixtures/schema/0.5.9/content-operation-good.json
index e2b6ccf..1edbe95 100644
--- a/tests/fixtures/schema/0.5.9/content-operation-good.json
+++ b/tests/fixtures/schema/0.5.9/content-operation-good.json
@@ -24,8 +24,6 @@
   "trigger": {
     "type": "image",
     "id": "AB456",
-    "referent_update": true,
-    "priority": "standard",
-    "app_name": "ellipsis"
+    "referent_update": true
   }
 }
diff --git a/tests/fixtures/schema/0.5.9/gallery-operation-create.json b/tests/fixtures/schema/0.5.9/gallery-operation-create.json
index 836df65..0d14302 100644
--- a/tests/fixtures/schema/0.5.9/gallery-operation-create.json
+++ b/tests/fixtures/schema/0.5.9/gallery-operation-create.json
@@ -73,7 +73,5 @@
   "operation" : "insert",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "gallery-operation",
-  "version" : "0.5.9",
-  "priority": "standard",
-  "app_name": "anglerfish"
+  "version" : "0.5.9"
 }
diff --git a/tests/fixtures/schema/0.5.9/gallery-operation-delete.json b/tests/fixtures/schema/0.5.9/gallery-operation-delete.json
index 032207c..66d889b 100644
--- a/tests/fixtures/schema/0.5.9/gallery-operation-delete.json
+++ b/tests/fixtures/schema/0.5.9/gallery-operation-delete.json
@@ -4,7 +4,5 @@
   "operation" : "delete",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "gallery-operation",
-  "version" : "0.5.9",
-  "priority": "standard",
-  "app_name": "anglerfish"
+  "version" : "0.5.9"
 }
diff --git a/tests/fixtures/schema/0.5.9/gallery-operation-update.json b/tests/fixtures/schema/0.5.9/gallery-operation-update.json
index f9bf420..310b5cc 100644
--- a/tests/fixtures/schema/0.5.9/gallery-operation-update.json
+++ b/tests/fixtures/schema/0.5.9/gallery-operation-update.json
@@ -72,8 +72,5 @@
   "operation" : "update",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "gallery-operation",
-  "version" : "0.5.9",
-  "priority": "standard",
-  "app_name": "anglerfish"
-
+  "version" : "0.5.9"
 }
diff --git a/tests/fixtures/schema/0.5.9/image-fixture-good.json b/tests/fixtures/schema/0.5.9/image-fixture-good.json
index 352a569..1c80a3e 100644
--- a/tests/fixtures/schema/0.5.9/image-fixture-good.json
+++ b/tests/fixtures/schema/0.5.9/image-fixture-good.json
@@ -8,7 +8,9 @@
     "by": [
       {
         "name": "Ansel Adams",
-        "type": "author"
+        "byline": "John Jacob",
+        "type": "author",
+        "version": "0.5.9"
       }
     ]
   },
diff --git a/tests/fixtures/schema/0.5.9/image-operation-create.json b/tests/fixtures/schema/0.5.9/image-operation-create.json
index beb2ab6..5610153 100644
--- a/tests/fixtures/schema/0.5.9/image-operation-create.json
+++ b/tests/fixtures/schema/0.5.9/image-operation-create.json
@@ -17,7 +17,9 @@
     "credits" : {
       "by" : [ {
         "name" : "Johnny Anonymous",
-        "type" : "author"
+        "byline": "Johnny Anonymous",
+        "type" : "author",
+        "version": "0.5.9"
       } ]
     },
     "height" : 600,
@@ -33,8 +35,5 @@
   "operation" : "insert",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "image-operation",
-  "version" : "0.5.9",
-  "priority": "standard",
-  "app_name": "anglerfish"
-
+  "version" : "0.5.9"
 }
diff --git a/tests/fixtures/schema/0.5.9/image-operation-delete.json b/tests/fixtures/schema/0.5.9/image-operation-delete.json
index dd3b8d3..bee59a3 100644
--- a/tests/fixtures/schema/0.5.9/image-operation-delete.json
+++ b/tests/fixtures/schema/0.5.9/image-operation-delete.json
@@ -4,7 +4,5 @@
   "operation" : "delete",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "image-operation",
-  "version" : "0.5.9",
-  "priority": "standard",
-  "app_name": "anglerfish"
+  "version" : "0.5.9"
 }
diff --git a/tests/fixtures/schema/0.5.9/image-operation-update.json b/tests/fixtures/schema/0.5.9/image-operation-update.json
index 1e4292b..a4abeaf 100644
--- a/tests/fixtures/schema/0.5.9/image-operation-update.json
+++ b/tests/fixtures/schema/0.5.9/image-operation-update.json
@@ -17,7 +17,9 @@
     "credits" : {
       "by" : [ {
         "name" : "Johnny Anonymous",
-        "type" : "author"
+        "byline": "Johnny Anonymous",
+        "type" : "author",
+        "version": "0.5.9"
       } ]
     },
     "height" : 600,
@@ -32,7 +34,5 @@
   "operation" : "update",
   "organization_id" : "PW5TIZPZINHXBPNQTAJRSIS123",
   "type" : "image-operation",
-  "version" : "0.5.9",
-  "priority": "standard",
-  "app_name": "anglerfish"
+  "version" : "0.5.9"
 }
diff --git a/tests/fixtures/schema/0.5.9/operation-create.json b/tests/fixtures/schema/0.5.9/operation-create.json
index 53cc591..55cbd23 100644
--- a/tests/fixtures/schema/0.5.9/operation-create.json
+++ b/tests/fixtures/schema/0.5.9/operation-create.json
@@ -6,9 +6,6 @@
   "revision_id": "1A",
   "branch": "default",
   "version": "0.5.9",
-  "priority": "standard",
-  "app_name": "ellipsis",
-
   "story": {
     "_id": "f8f706f0-0acc-11e5-9e39-0db921c47b93",
     "version": "0.5.9",
diff --git a/tests/fixtures/schema/0.5.9/operation-delete.json b/tests/fixtures/schema/0.5.9/operation-delete.json
index 70faeee..7cd9887 100644
--- a/tests/fixtures/schema/0.5.9/operation-delete.json
+++ b/tests/fixtures/schema/0.5.9/operation-delete.json
@@ -5,8 +5,5 @@
   "story_id": "f8f706f0-0acc-11e5-9e39-0db921c47b93",
   "revision_id": "2A",
   "branch": "default",
-  "version": "0.5.9",
-  "priority": "standard",
-  "app_name": "ellipsis"
-
+  "version": "0.5.9"
 }
diff --git a/tests/fixtures/schema/0.5.9/operation-publish-edition.json b/tests/fixtures/schema/0.5.9/operation-publish-edition.json
index 9d530ac..be7403f 100644
--- a/tests/fixtures/schema/0.5.9/operation-publish-edition.json
+++ b/tests/fixtures/schema/0.5.9/operation-publish-edition.json
@@ -6,8 +6,6 @@
   "revision_id": "2A",
   "branch": "default",
   "version": "0.5.9",
-  "priority": "standard",
-  "app_name": "ellipsis",
   "editions": [ "web" ],
   "story": {
     "_id": "f8f706f0-0acc-11e5-9e39-0db921c47b93",
diff --git a/tests/fixtures/schema/0.5.9/operation-unpublish-edition.json b/tests/fixtures/schema/0.5.9/operation-unpublish-edition.json
index 192b052..9ab10d7 100644
--- a/tests/fixtures/schema/0.5.9/operation-unpublish-edition.json
+++ b/tests/fixtures/schema/0.5.9/operation-unpublish-edition.json
@@ -6,8 +6,5 @@
   "revision_id": "2A",
   "branch": "default",
   "version": "0.5.9",
-  "priority": "standard",
-  "app_name": "ellipsis",
-
   "editions": [ "web" ]
 }
diff --git a/tests/fixtures/schema/0.5.9/operation-update.json b/tests/fixtures/schema/0.5.9/operation-update.json
index b758128..3171a24 100644
--- a/tests/fixtures/schema/0.5.9/operation-update.json
+++ b/tests/fixtures/schema/0.5.9/operation-update.json
@@ -6,9 +6,6 @@
   "revision_id": "2A",
   "branch": "default",
   "version": "0.5.9",
-  "priority": "standard",
-  "app_name": "ellipsis",
-
   "story": {
     "_id": "f8f706f0-0acc-11e5-9e39-0db921c47b93",
     "version": "0.5.9",
diff --git a/tests/fixtures/schema/0.5.9/reference-fixture-bad-addl-props.json b/tests/fixtures/schema/0.5.9/reference-fixture-bad-addl-props.json
index c3a2749..ee37845 100644
--- a/tests/fixtures/schema/0.5.9/reference-fixture-bad-addl-props.json
+++ b/tests/fixtures/schema/0.5.9/reference-fixture-bad-addl-props.json
@@ -3,6 +3,7 @@
   "foo": "bar",
   "referent": {
     "type": "author",
+    "version": "0.5.9",
     "service": "http://www.credits.com/api",
     "provider": "http://www.credits.com/api",
     "id": "00001"
diff --git a/tests/fixtures/schema/0.5.9/reference-fixture-bad-more-addl-props.json b/tests/fixtures/schema/0.5.9/reference-fixture-bad-more-addl-props.json
index f89adcf..448fb4f 100644
--- a/tests/fixtures/schema/0.5.9/reference-fixture-bad-more-addl-props.json
+++ b/tests/fixtures/schema/0.5.9/reference-fixture-bad-more-addl-props.json
@@ -2,6 +2,7 @@
   "type": "reference",
   "referent": {
     "type": "author",
+    "version": "0.5.9",
     "service": "http://www.credits.com/api",
     "provider": "http://www.credits.com/api",
     "id": "00001",
diff --git a/tests/fixtures/schema/0.5.9/story-fixture-bad-corrections.json b/tests/fixtures/schema/0.5.9/story-fixture-bad-corrections.json
index bb3c09c..622b5ed 100644
--- a/tests/fixtures/schema/0.5.9/story-fixture-bad-corrections.json
+++ b/tests/fixtures/schema/0.5.9/story-fixture-bad-corrections.json
@@ -13,6 +13,8 @@
         "name": "John Q. Reporter",
         "org": "The Washington Post",
         "type": "author",
+        "byline": "John Q. Reporter",
+        "version": "0.5.9",
         "image": {
           "_id": "unique ANS id",
           "type": "image",
@@ -78,7 +80,10 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
+
           }
         ]
       },
@@ -113,7 +118,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "credits": "0.5.9"
           }
         ]
       },
diff --git a/tests/fixtures/schema/0.5.9/story-fixture-bad-extra-properties.json b/tests/fixtures/schema/0.5.9/story-fixture-bad-extra-properties.json
index 7d83078..5b70cb9 100644
--- a/tests/fixtures/schema/0.5.9/story-fixture-bad-extra-properties.json
+++ b/tests/fixtures/schema/0.5.9/story-fixture-bad-extra-properties.json
@@ -9,8 +9,10 @@
     "by": [
       {
         "name": "John Q. Reporter",
+        "byline": "John Q. Reporter",
         "org": "The Washington Post",
         "type": "author",
+        "version": "0.5.9",
         "image": {
           "_id": "unique ANS id",
           "type": "image",
@@ -76,7 +78,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
@@ -123,7 +127,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
diff --git a/tests/fixtures/schema/0.5.9/story-fixture-bad-wrong-type.json b/tests/fixtures/schema/0.5.9/story-fixture-bad-wrong-type.json
index c821e06..d68c9b4 100644
--- a/tests/fixtures/schema/0.5.9/story-fixture-bad-wrong-type.json
+++ b/tests/fixtures/schema/0.5.9/story-fixture-bad-wrong-type.json
@@ -8,8 +8,10 @@
     "by": [
       {
         "name": "John Q. Reporter",
+        "byline": "John Q. Reporter",
         "org": "The Washington Post",
         "type": "author",
+        "version": "0.5.9",
         "image": {
           "_id": "unique ANS id",
           "type": "image",
@@ -75,7 +77,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
@@ -115,7 +119,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
diff --git a/tests/fixtures/schema/0.5.9/story-fixture-bad-wrong-version.json b/tests/fixtures/schema/0.5.9/story-fixture-bad-wrong-version.json
index d6e87dd..3bd8e7b 100644
--- a/tests/fixtures/schema/0.5.9/story-fixture-bad-wrong-version.json
+++ b/tests/fixtures/schema/0.5.9/story-fixture-bad-wrong-version.json
@@ -8,8 +8,10 @@
     "by": [
       {
         "name": "John Q. Reporter",
+        "byline": "John Q. Reporter",
         "org": "The Washington Post",
         "type": "author",
+        "version": "0.5.9",
         "image": {
           "_id": "unique ANS id",
           "type": "image",
@@ -75,7 +77,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
@@ -110,7 +114,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
diff --git a/tests/fixtures/schema/0.5.9/story-fixture-good-mystery-element.json b/tests/fixtures/schema/0.5.9/story-fixture-good-mystery-element.json
index 8166576..02bae0a 100644
--- a/tests/fixtures/schema/0.5.9/story-fixture-good-mystery-element.json
+++ b/tests/fixtures/schema/0.5.9/story-fixture-good-mystery-element.json
@@ -8,8 +8,10 @@
     "by": [
       {
         "name": "John Q. Reporter",
+        "byline": "John Q. Reporter",
         "org": "The Washington Post",
         "type": "author",
+        "version": "0.5.9",
         "image": {
           "_id": "unique ANS id",
           "type": "image",
@@ -75,7 +77,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
diff --git a/tests/fixtures/schema/0.5.9/story-fixture-good.json b/tests/fixtures/schema/0.5.9/story-fixture-good.json
index a5fda5f..f944140 100644
--- a/tests/fixtures/schema/0.5.9/story-fixture-good.json
+++ b/tests/fixtures/schema/0.5.9/story-fixture-good.json
@@ -9,8 +9,10 @@
     "by": [
       {
         "name": "John Q. Reporter",
+        "byline": "John Q. Reporter",
         "org": "The Washington Post",
         "type": "author",
+        "version": "0.5.9",
         "image": {
           "_id": "unique ANS id",
           "type": "image",
@@ -96,7 +98,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
@@ -250,7 +254,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
diff --git a/tests/fixtures/schema/0.5.9/story-fixture-references.json b/tests/fixtures/schema/0.5.9/story-fixture-references.json
index fb1cd54..c66d72b 100644
--- a/tests/fixtures/schema/0.5.9/story-fixture-references.json
+++ b/tests/fixtures/schema/0.5.9/story-fixture-references.json
@@ -20,7 +20,9 @@
     "additional reporting by": [
       {
         "type": "author",
-        "name": "Greg Engel"
+        "version": "0.5.9",
+        "name": "Greg Engel",
+        "byline": "Greggo"
       }
     ]
   },
@@ -76,7 +78,9 @@
         "by": [
           {
             "name": "Ansel Adams",
-            "type": "author"
+            "byline": "Ansel Adams",
+            "type": "author",
+            "version": "0.5.9"
           }
         ]
       },
@@ -155,7 +159,9 @@
         "by": [
           {
             "type": "author",
-            "name": "Ansel Adams"
+            "version": "0.5.9",
+            "name": "Ansel Adams",
+            "byline": "Ansel Adams"
           }
         ]
       },
diff --git a/tests/fixtures/schema/0.5.9/story-fixture-tiny-house.json b/tests/fixtures/schema/0.5.9/story-fixture-tiny-house.json
index b9fd5a3..3f5d9e0 100644
--- a/tests/fixtures/schema/0.5.9/story-fixture-tiny-house.json
+++ b/tests/fixtures/schema/0.5.9/story-fixture-tiny-house.json
@@ -8,8 +8,10 @@
     "by": [{
       "_id": "AUTHOR1",
       "name": "Nina Patel",
+      "byline": "Nina Patel",
       "org": "The Washington Post",
       "type": "author",
+      "version": "0.5.9",
       "slug": "nina-patel"
     }]
   },
@@ -51,7 +53,9 @@
       "credits": { "by": [
         {
           "type": "author",
-          "name": "Ansel Adams"
+          "version": "0.5.9",
+          "name": "Ansel Adams",
+          "byline": "Ansel Adams"
         }
       ]},
       "url": "https://img.washingtonpost.com/rw/2010-2019/WashingtonPost/2015/06/19/Magazine/Images/6_28%20Tinyhome2_r1.tif?uuid=fXQD2BbLEeWd3OM1NUIQDA",
@@ -108,7 +112,9 @@
         "by": [
           {
             "type": "author",
-            "name": "Ansel Adams"
+            "version": "0.5.9",
+            "name": "Ansel Adams",
+            "byline": "Ansel Adams"
           }
         ]
       },
diff --git a/tests/fixtures/schema/0.5.9/url-operation-insert-redirect.json b/tests/fixtures/schema/0.5.9/url-operation-insert-redirect.json
index 04a180d..963a4e7 100644
--- a/tests/fixtures/schema/0.5.9/url-operation-insert-redirect.json
+++ b/tests/fixtures/schema/0.5.9/url-operation-insert-redirect.json
@@ -6,7 +6,5 @@
   "type" : "url-operation",
   "version" : "0.5.9",
   "original_url" : "/original-url",
-  "destination_url" : "/destination-url",
-  "priority": "standard",
-  "app_name": "ellipsis"
+  "destination_url" : "/destination-url"
 }
diff --git a/tests/fixtures/schema/0.5.9/video-fixture-good-attached-redirect.json b/tests/fixtures/schema/0.5.9/video-fixture-good-attached-redirect.json
index c9af111..38ffc4f 100644
--- a/tests/fixtures/schema/0.5.9/video-fixture-good-attached-redirect.json
+++ b/tests/fixtures/schema/0.5.9/video-fixture-good-attached-redirect.json
@@ -85,7 +85,9 @@
     "by": [
       {
         "type": "author",
-        "name": "Bruce Harris"
+        "version": "0.5.9",
+        "name": "Bruce Harris",
+        "byline": "Bruce Harris"
       }
     ]
   },
diff --git a/tests/fixtures/schema/0.5.9/video-fixture-good.json b/tests/fixtures/schema/0.5.9/video-fixture-good.json
index a0da6a7..440b7c9 100644
--- a/tests/fixtures/schema/0.5.9/video-fixture-good.json
+++ b/tests/fixtures/schema/0.5.9/video-fixture-good.json
@@ -7,7 +7,9 @@
   "credits": {
     "by": [{
       "name": "Bruce Harris",
-      "type": "author"
+      "byline": "Bruce Harris",
+      "type": "author",
+      "version": "0.5.9"
     }]
   },
   "location": "Washington, D.C.",
diff --git a/tests/fixtures/transforms/0.5.8/author-fixture.json b/tests/fixtures/transforms/0.5.8/author-fixture.json
new file mode 100644
index 0000000..1e7e6fe
--- /dev/null
+++ b/tests/fixtures/transforms/0.5.8/author-fixture.json
@@ -0,0 +1,87 @@
+{
+  "type": "author",
+  "_id": "engelg",
+  "name": "Gregory Engel",
+
+  "additional_properties": {
+    "type": "author",
+    "version": "0.5.9",
+    "_id": "engelg2",
+    "name": "Gregory2 Engel",
+    "image": {
+      "type": "image",
+      "version": "0.5.9",
+      "url": "https://img.washingtonpost.com/rf/image_1248x701/2010-2019/WashingtonPost/2017/11/08/Local/Images/vagovernorgop3.jpg?t=20170517a"
+    },
+    "url": "http://www.washingtonpost.com",
+    "social_links": [
+      {
+        "site": "facebook",
+        "url": "http://facebook.com/gregory.r.engel"
+      },
+      {
+        "site": "reddit",
+        "url": "http://reddit.com/u/gregory.r.engel"
+      }
+    ],
+    "slug": "gregory-r-engel",
+    "first_name": "Gregory",
+    "middle_name": "R.",
+    "last_name": "Engel",
+    "suffix": "Jr.",
+    "byline": "Greggo",
+    "location": "Washington, D.C.",
+    "division": "Sports",
+    "email": "gregory.engel@washpost.com",
+    "role": "Content API Developer",
+    "expertise": "Baltimore, Soviet Cinema, Blue Seashells",
+    "affiliation": "The Washington Post",
+    "languages": "Russian",
+    "bio": "Gregory Engel is a developer for Arc Publishing at The Washington Post",
+    "long_bio": "Gregory Engel is a developer for Arc Publishing at The Washington Post. He has won numerous awards for his ten-part expose on breakfast cereal marshmallows in feudal Japan, including a Very Good Writer Award from Very Good Writer Magazine. He engages in online dicourse with his numerous fans and vociferous critics. His real name is 'Joe.'",
+    "books": [
+      {
+        "book_title": "Ten Ways to Eat Ice Cream: A Human's Guide for the Intimidated",
+        "book_url": "http://icecreambook.com"
+      },
+      {
+        "book_title": "If Only They Would Build It: The History of Turtle Fences in Medieval Wisconsin",
+        "book_url": "http://turtlefencebook.com"
+      },
+      {
+        "book_title": "The Speckled Land (A George Irwin Mystery)",
+        "book_url": "http://georgeirwinmysteries.com"
+      }
+    ],
+    "education": [
+      {
+        "school_name": "Oberlin College"
+      },
+      {
+        "school_name": "International Language Institute"
+      }
+    ],
+    "awards": [
+      {
+        "award_name": "A Very Good Writer Award"
+      },
+      {
+        "award_name": "A Just-OK Writer Award"
+      }
+    ],
+    "contributor": false,
+
+    "org": "Washington, D.C.",
+    "socialLinks": [
+      {
+        "site": "facebook",
+        "url": "http://facebook.com/gregory.r.engel"
+      },
+      {
+        "site": "reddit",
+        "url": "http://reddit.com/u/gregory.r.engel"
+      }
+    ],
+    "some_additional_field": "should not be copied"
+  }
+}
diff --git a/tests/schema-tests-05.js b/tests/schema-tests-05.js
index 8d8b5fd..c62bc60 100644
--- a/tests/schema-tests-05.js
+++ b/tests/schema-tests-05.js
@@ -468,6 +468,12 @@ describe("Schema: ", function() {
       });
 
       describe(version, function() {
+        describe("Author (0.5.9+)", function() {
+          it("should validate a well-formatted author", function() {
+            validateIfFixtureExists('/utils/author.json', 'author-fixture-good');
+          });
+        });
+
         describe("Audio", function() {
           it("should validate a well-formatted audio", function() {
             validate(version, '/audio.json', 'audio-fixture-good');
diff --git a/tests/transform-tests.js b/tests/transform-tests.js
index 803a651..7db5377 100644
--- a/tests/transform-tests.js
+++ b/tests/transform-tests.js
@@ -664,6 +664,23 @@ describe("Transformations: ", function() {
       });
 
     });
+
+    describe("0.5.8 to 0.5.9", function() {
+      it("should upvert an author", function() {
+        var upverter = transforms.upverters['0.5.8'];
+        var original = fixtures['0.5.8']['author-fixture'];
+        var result = upverter(original);
+        //console.log(JSON.stringify(result, 0, 2));
+        result.byline.should.eql("Greggo");
+        result.should.have.property('additional_properties');
+        result.books.should.eql(original.additional_properties.books);
+        result.education.should.eql(original.additional_properties.education);
+        result.should.not.have.property('some_additional_field');
+        result.name.should.eql("Gregory Engel");
+
+        validateAns(result, original, '0.5.9');
+      });
+    });
   });
 
   describe("Synchronizer", function() {
diff --git a/tests/validator.js b/tests/validator.js
index b430de2..7d5e05b 100644
--- a/tests/validator.js
+++ b/tests/validator.js
@@ -178,6 +178,19 @@ describe("ANS Validator", function() {
 
 
     it("should validate items with a hyphen in their type", function() {
+      var author = {
+        "name": "BRENT SMITH",
+        "type": "author"
+      };
+
+      // Authors changed in v 0.5.9
+      var ver = new ans.version.Version(ans.version.parse_version(version));
+      var v058 = new ans.version.Version(ans.version.parse_version('0.5.8'));
+      if (ver.gt(v058)) {
+        author.version = version;
+        author.byline = "BRENT SMITH";
+      }
+
       var image_operation = {
         "_id": "1",
         "body": {
@@ -185,12 +198,7 @@ describe("ANS Validator", function() {
           "additional_properties": {         "alttext": "REUTERS"       },
           "caption": "Indiana Pacers David West celebrates during Game 6 of their NBA Eastern Conference Final playoff series against the Miami Heat in Indianapolis, Indiana June 1, 2013.",
           "credits": {
-            "photographer": [
-              {
-                "name": "BRENT SMITH",
-                "type": "author"
-              }
-            ]
+            "photographer": [ author ]
           },
           "owner": {
             "name": "REUTERS"