{"action":"created","comment":{"url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/comments/177249762","pull_request_review_id":107074543,"id":177249762,"diff_hunk":"@@ -0,0 +1,196 @@\n+# RFC 116 Artifact Service\n+* Comments: [#116](https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues/116)\n+* Proposed by: @jhford\n+\n+# Summary\n+\n+Taskcluster tasks often product Artifacts during the course of being run.\n+Examples include browser archives, json metadata and log files.  We currently\n+store Artifacts in a single region of S3 and split management of Artifacts\n+between the Queue and Cloud Mirror.  This project is to take Artifact handling\n+out of the Queue and into its own service that takes over the responsibilities\n+for cross-region and cross-cloud replication.\n+\n+The Artifact service should not be directly exposed to end users as a Rest API.\n+It will instead be a generalised API that the Queue uses to facilitate artifact\n+creation from tasks.  In other words, the Queue gates operations to the\n+Artifact service.  The service will be exposed to endusers by means of a `Location`\n+header value on a `300` series redirect.\n+\n+The Queue will now store only the name of Artifacts and would treat the name of\n+an Artifact as an opaque identifier and defer all management of the actual\n+bytes to this system.  The Queue would also stop doing IP to Object store\n+mappings.\n+\n+This RFC is to decide on what the Artifacts service is and its interface, not\n+implementation details\n+\n+## Motivation\n+\n+* We want the Queue to be easier to understand, develop and maintain\n+* We want Artifacts to be easier to understand, develop and maintain\n+* We want better Artifact handling without increasing complexity of the Queue\n+  codebase\n+* We want to have more clear responsibilities for our services\n+* We want to consolidate the handling of Artifacts into a single service\n+* We want to build generalised software when possible as participants of a free\n+  software community\n+\n+# Details\n+\n+* The Artifact service will start from the Queue's `artifacts.js` file\n+* Auth might not be done with scopes and tc-auth, but a shared secret between\n+  Queue and Artifacts\n+* The Queue will block new tasks after task resolution by not issuing new\n+  signed urls\n+* Data storage in Artifacts will be done with Postgres and not Azure Table\n+  Storage\n+* We do not intend to have an operation to list artifacts in the API\n+* The redirecting logic of the Artifact service will adhere to the HTTP spec\n+  using 300-series redirects where possible\n+* Where content-negotiation is impossible, the service will block creation of\n+  artifacts when incoming requests aren't compatible with required response\n+* We will support uploading artifacts to different regions so that we can\n+\n+## API\n+This API is up for debate and is only an illustrative starting point.  \n+\n+### Generalised request format\n+There will be a concept of a generalised HTTP request.  This will be an object shaped like\n+```javascript\n+{\n+  method: 'GET',\n+  url: 'https://www.example.com',\n+  headers: {\n+    'user-agent': 'taskcluster',\n+  }\n+}\n+```\n+\n+* The body will not be included, but can be described through HTTP headers in the request\n+* Duplicated HTTP headers will be unsupported (i.e. key -> string not key -> list of strings)\n+* All query string, path, fragements are contained in a fully formed `url` property\n+\n+### Creation\n+\n+```\n+PUT /artifacts/:name\n+```\n+\n+This endpoint will take an origin and name.  It will return a `200` with a\n+document which contains a list of generalised requests which could be run to\n+complete the actual upload.  Please see the queue's current `blob` storage type\n+for an example of this pattern.  The body of the request will contain metadata\n+about the artifact in the shape:\n+\n+```javascript\n+{\n+  origin: '10.10.10.10' || 's3_us-west-2',\n+  contentType: 'application/json',\n+  contentLength: 1234,\n+  contentSha256: 'abcdef1234',\n+  transferLength: 1234,\n+  transferSha256: 'abcdef1234',\n+  contentEncdoing: \n+  expiration: new Date(),\n+}\n+```\n+\n+The `origin` parameter will either be an IPv4 address, IPv6 address, or an\n+identifier.  This parameter will specify the source location of the ultimately\n+originating request.  This means the origin of the request to the Queue from\n+the worker and not the request to the artifact service.  If the origin is an\n+IPv4 or IPv6, a mapping of the address and IP will occur to find the backing\n+storage.  If the origin is not an IPv4 or IPv6 address and is identical to a\n+set of known and mappable identifiers (e.g. `s3_us-west-2`), then that will be\n+used to map the token to find the backing storage.\n+\n+### Deletetion\n+\n+```\n+DELETE /artifacts/:name\n+DELETE /caches/artifacts/:name\n+```\n+\n+Delete all copies of the named Artifact if using first endpoint.  The second\n+endpoint would attempt delete all of the cached copies in the various\n+locations.  This cache purging must return a `202 Accepted` response and not\n+`200/204` due to the nature of how caches work in the real world.","path":"rfcs/0116-artifact-service.md","position":118,"original_position":118,"commit_id":"5800370daf90cf094198155e14f38a575792fbeb","original_commit_id":"5800370daf90cf094198155e14f38a575792fbeb","user":{"login":"djmitche","id":28673,"avatar_url":"https://avatars3.githubusercontent.com/u/28673?v=4","gravatar_id":"","url":"https://api.github.com/users/djmitche","html_url":"https://github.com/djmitche","followers_url":"https://api.github.com/users/djmitche/followers","following_url":"https://api.github.com/users/djmitche/following{/other_user}","gists_url":"https://api.github.com/users/djmitche/gists{/gist_id}","starred_url":"https://api.github.com/users/djmitche/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/djmitche/subscriptions","organizations_url":"https://api.github.com/users/djmitche/orgs","repos_url":"https://api.github.com/users/djmitche/repos","events_url":"https://api.github.com/users/djmitche/events{/privacy}","received_events_url":"https://api.github.com/users/djmitche/received_events","type":"User","site_admin":false},"body":"I'm confused what the difference is here between \"copies\" and \"cached copies\".","created_at":"2018-03-26T22:05:42Z","updated_at":"2018-03-26T22:17:24Z","html_url":"https://github.com/taskcluster/taskcluster-rfcs/pull/116#discussion_r177249762","pull_request_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/116","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/comments/177249762"},"html":{"href":"https://github.com/taskcluster/taskcluster-rfcs/pull/116#discussion_r177249762"},"pull_request":{"href":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/116"}}},"pull_request":{"url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/116","id":177061075,"html_url":"https://github.com/taskcluster/taskcluster-rfcs/pull/116","diff_url":"https://github.com/taskcluster/taskcluster-rfcs/pull/116.diff","patch_url":"https://github.com/taskcluster/taskcluster-rfcs/pull/116.patch","issue_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues/116","number":116,"state":"open","locked":false,"title":"Artifact service proposal first draft","user":{"login":"jhford","id":607353,"avatar_url":"https://avatars3.githubusercontent.com/u/607353?v=4","gravatar_id":"","url":"https://api.github.com/users/jhford","html_url":"https://github.com/jhford","followers_url":"https://api.github.com/users/jhford/followers","following_url":"https://api.github.com/users/jhford/following{/other_user}","gists_url":"https://api.github.com/users/jhford/gists{/gist_id}","starred_url":"https://api.github.com/users/jhford/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jhford/subscriptions","organizations_url":"https://api.github.com/users/jhford/orgs","repos_url":"https://api.github.com/users/jhford/repos","events_url":"https://api.github.com/users/jhford/events{/privacy}","received_events_url":"https://api.github.com/users/jhford/received_events","type":"User","site_admin":false},"body":"This proposal was discussed during the Berlin work week on March 22, 2018.  I'm going to the PR stage directly as we've already had a lot of discussions about this with almost the whole team present.  I believe that this PR reflects the design we've been speaking about.  My feeling was also that we'd agreed that a concrete proposal was the best step to take next.\r\n\r\nLet's discuss this!  I'm flagging people for review who were most actively involved in the discussion.","created_at":"2018-03-23T12:52:43Z","updated_at":"2018-03-26T22:17:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f628ccd6228da1bcaceb802ff18905c8250234d1","assignee":{"login":"jhford","id":607353,"avatar_url":"https://avatars3.githubusercontent.com/u/607353?v=4","gravatar_id":"","url":"https://api.github.com/users/jhford","html_url":"https://github.com/jhford","followers_url":"https://api.github.com/users/jhford/followers","following_url":"https://api.github.com/users/jhford/following{/other_user}","gists_url":"https://api.github.com/users/jhford/gists{/gist_id}","starred_url":"https://api.github.com/users/jhford/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jhford/subscriptions","organizations_url":"https://api.github.com/users/jhford/orgs","repos_url":"https://api.github.com/users/jhford/repos","events_url":"https://api.github.com/users/jhford/events{/privacy}","received_events_url":"https://api.github.com/users/jhford/received_events","type":"User","site_admin":false},"assignees":[{"login":"jhford","id":607353,"avatar_url":"https://avatars3.githubusercontent.com/u/607353?v=4","gravatar_id":"","url":"https://api.github.com/users/jhford","html_url":"https://github.com/jhford","followers_url":"https://api.github.com/users/jhford/followers","following_url":"https://api.github.com/users/jhford/following{/other_user}","gists_url":"https://api.github.com/users/jhford/gists{/gist_id}","starred_url":"https://api.github.com/users/jhford/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jhford/subscriptions","organizations_url":"https://api.github.com/users/jhford/orgs","repos_url":"https://api.github.com/users/jhford/repos","events_url":"https://api.github.com/users/jhford/events{/privacy}","received_events_url":"https://api.github.com/users/jhford/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"imbstack","id":127521,"avatar_url":"https://avatars2.githubusercontent.com/u/127521?v=4","gravatar_id":"","url":"https://api.github.com/users/imbstack","html_url":"https://github.com/imbstack","followers_url":"https://api.github.com/users/imbstack/followers","following_url":"https://api.github.com/users/imbstack/following{/other_user}","gists_url":"https://api.github.com/users/imbstack/gists{/gist_id}","starred_url":"https://api.github.com/users/imbstack/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/imbstack/subscriptions","organizations_url":"https://api.github.com/users/imbstack/orgs","repos_url":"https://api.github.com/users/imbstack/repos","events_url":"https://api.github.com/users/imbstack/events{/privacy}","received_events_url":"https://api.github.com/users/imbstack/received_events","type":"User","site_admin":false},{"login":"petemoore","id":190790,"avatar_url":"https://avatars0.githubusercontent.com/u/190790?v=4","gravatar_id":"","url":"https://api.github.com/users/petemoore","html_url":"https://github.com/petemoore","followers_url":"https://api.github.com/users/petemoore/followers","following_url":"https://api.github.com/users/petemoore/following{/other_user}","gists_url":"https://api.github.com/users/petemoore/gists{/gist_id}","starred_url":"https://api.github.com/users/petemoore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petemoore/subscriptions","organizations_url":"https://api.github.com/users/petemoore/orgs","repos_url":"https://api.github.com/users/petemoore/repos","events_url":"https://api.github.com/users/petemoore/events{/privacy}","received_events_url":"https://api.github.com/users/petemoore/received_events","type":"User","site_admin":false},{"login":"ccooper","id":609786,"avatar_url":"https://avatars0.githubusercontent.com/u/609786?v=4","gravatar_id":"","url":"https://api.github.com/users/ccooper","html_url":"https://github.com/ccooper","followers_url":"https://api.github.com/users/ccooper/followers","following_url":"https://api.github.com/users/ccooper/following{/other_user}","gists_url":"https://api.github.com/users/ccooper/gists{/gist_id}","starred_url":"https://api.github.com/users/ccooper/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ccooper/subscriptions","organizations_url":"https://api.github.com/users/ccooper/orgs","repos_url":"https://api.github.com/users/ccooper/repos","events_url":"https://api.github.com/users/ccooper/events{/privacy}","received_events_url":"https://api.github.com/users/ccooper/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/116/commits","review_comments_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/116/comments","review_comment_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues/116/comments","statuses_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/statuses/5800370daf90cf094198155e14f38a575792fbeb","head":{"label":"taskcluster:artifact-service","ref":"artifact-service","sha":"5800370daf90cf094198155e14f38a575792fbeb","user":{"login":"taskcluster","id":6257436,"avatar_url":"https://avatars2.githubusercontent.com/u/6257436?v=4","gravatar_id":"","url":"https://api.github.com/users/taskcluster","html_url":"https://github.com/taskcluster","followers_url":"https://api.github.com/users/taskcluster/followers","following_url":"https://api.github.com/users/taskcluster/following{/other_user}","gists_url":"https://api.github.com/users/taskcluster/gists{/gist_id}","starred_url":"https://api.github.com/users/taskcluster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/taskcluster/subscriptions","organizations_url":"https://api.github.com/users/taskcluster/orgs","repos_url":"https://api.github.com/users/taskcluster/repos","events_url":"https://api.github.com/users/taskcluster/events{/privacy}","received_events_url":"https://api.github.com/users/taskcluster/received_events","type":"Organization","site_admin":false},"repo":{"id":86847026,"name":"taskcluster-rfcs","full_name":"taskcluster/taskcluster-rfcs","owner":{"login":"taskcluster","id":6257436,"avatar_url":"https://avatars2.githubusercontent.com/u/6257436?v=4","gravatar_id":"","url":"https://api.github.com/users/taskcluster","html_url":"https://github.com/taskcluster","followers_url":"https://api.github.com/users/taskcluster/followers","following_url":"https://api.github.com/users/taskcluster/following{/other_user}","gists_url":"https://api.github.com/users/taskcluster/gists{/gist_id}","starred_url":"https://api.github.com/users/taskcluster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/taskcluster/subscriptions","organizations_url":"https://api.github.com/users/taskcluster/orgs","repos_url":"https://api.github.com/users/taskcluster/repos","events_url":"https://api.github.com/users/taskcluster/events{/privacy}","received_events_url":"https://api.github.com/users/taskcluster/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/taskcluster/taskcluster-rfcs","description":"Taskcluster team planning","fork":false,"url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs","forks_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/forks","keys_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/teams","hooks_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/hooks","issue_events_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/events","assignees_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/tags","blobs_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/languages","stargazers_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/stargazers","contributors_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/contributors","subscribers_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/subscribers","subscription_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/subscription","commits_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/merges","archive_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/downloads","issues_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/labels{/name}","releases_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/deployments","created_at":"2017-03-31T18:04:51Z","updated_at":"2018-03-26T16:32:59Z","pushed_at":"2018-03-26T16:32:57Z","git_url":"git://github.com/taskcluster/taskcluster-rfcs.git","ssh_url":"git@github.com:taskcluster/taskcluster-rfcs.git","clone_url":"https://github.com/taskcluster/taskcluster-rfcs.git","svn_url":"https://github.com/taskcluster/taskcluster-rfcs","homepage":"","size":105,"stargazers_count":2,"watchers_count":2,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":10,"mirror_url":null,"archived":false,"open_issues_count":33,"license":{"key":"mpl-2.0","name":"Mozilla Public License 2.0","spdx_id":"MPL-2.0","url":"https://api.github.com/licenses/mpl-2.0"},"forks":10,"open_issues":33,"watchers":2,"default_branch":"master"}},"base":{"label":"taskcluster:master","ref":"master","sha":"a05b01af9d61a807ed1a1e39e07c18ab5bbda02e","user":{"login":"taskcluster","id":6257436,"avatar_url":"https://avatars2.githubusercontent.com/u/6257436?v=4","gravatar_id":"","url":"https://api.github.com/users/taskcluster","html_url":"https://github.com/taskcluster","followers_url":"https://api.github.com/users/taskcluster/followers","following_url":"https://api.github.com/users/taskcluster/following{/other_user}","gists_url":"https://api.github.com/users/taskcluster/gists{/gist_id}","starred_url":"https://api.github.com/users/taskcluster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/taskcluster/subscriptions","organizations_url":"https://api.github.com/users/taskcluster/orgs","repos_url":"https://api.github.com/users/taskcluster/repos","events_url":"https://api.github.com/users/taskcluster/events{/privacy}","received_events_url":"https://api.github.com/users/taskcluster/received_events","type":"Organization","site_admin":false},"repo":{"id":86847026,"name":"taskcluster-rfcs","full_name":"taskcluster/taskcluster-rfcs","owner":{"login":"taskcluster","id":6257436,"avatar_url":"https://avatars2.githubusercontent.com/u/6257436?v=4","gravatar_id":"","url":"https://api.github.com/users/taskcluster","html_url":"https://github.com/taskcluster","followers_url":"https://api.github.com/users/taskcluster/followers","following_url":"https://api.github.com/users/taskcluster/following{/other_user}","gists_url":"https://api.github.com/users/taskcluster/gists{/gist_id}","starred_url":"https://api.github.com/users/taskcluster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/taskcluster/subscriptions","organizations_url":"https://api.github.com/users/taskcluster/orgs","repos_url":"https://api.github.com/users/taskcluster/repos","events_url":"https://api.github.com/users/taskcluster/events{/privacy}","received_events_url":"https://api.github.com/users/taskcluster/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/taskcluster/taskcluster-rfcs","description":"Taskcluster team planning","fork":false,"url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs","forks_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/forks","keys_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/teams","hooks_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/hooks","issue_events_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/events","assignees_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/tags","blobs_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/languages","stargazers_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/stargazers","contributors_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/contributors","subscribers_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/subscribers","subscription_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/subscription","commits_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/merges","archive_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/downloads","issues_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/labels{/name}","releases_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/deployments","created_at":"2017-03-31T18:04:51Z","updated_at":"2018-03-26T16:32:59Z","pushed_at":"2018-03-26T16:32:57Z","git_url":"git://github.com/taskcluster/taskcluster-rfcs.git","ssh_url":"git@github.com:taskcluster/taskcluster-rfcs.git","clone_url":"https://github.com/taskcluster/taskcluster-rfcs.git","svn_url":"https://github.com/taskcluster/taskcluster-rfcs","homepage":"","size":105,"stargazers_count":2,"watchers_count":2,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":10,"mirror_url":null,"archived":false,"open_issues_count":33,"license":{"key":"mpl-2.0","name":"Mozilla Public License 2.0","spdx_id":"MPL-2.0","url":"https://api.github.com/licenses/mpl-2.0"},"forks":10,"open_issues":33,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/116"},"html":{"href":"https://github.com/taskcluster/taskcluster-rfcs/pull/116"},"issue":{"href":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues/116"},"comments":{"href":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/issues/116/comments"},"review_comments":{"href":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/116/comments"},"review_comment":{"href":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/pulls/116/commits"},"statuses":{"href":"https://api.github.com/repos/taskcluster/taskcluster-rfcs/statuses/5800370daf90cf094198155e14f38a575792fbeb"}},"author_association":"NONE"}}
{"actor":{"display_login":"djmitche"}}