           ticket-ids (map id-str->int (filter #(= \:  (get % 0)) parts))]
       {:ids ticket-ids :maybe-command command :message message-str})))
 
-(defn process-git [git-hash email & message-pieces]
+(defn process-git
+  "This is the entry point for processing git feedback.
+  It takes a commit hash, the author email, and any chunks of the message.
+  These are most easily obtained with: `git log -n1 --pretty=format:'%H %ae %s'`"
+  [git-hash email & message-pieces]
   (let [message-map (parse-git-message (cstr/join " " message-pieces))
         command (:maybe-command message-map)
         tickets (:tickets (ticket-file!))]

    ret))

(defn blocking-deref
  "Given atom and a Result object, attempt to cycle the process tick on derefing until `pred-fn` isn't true
  By default, `pred-fn` is nil?
  Once the condition doesn't hold, the Result will be set to @a, and @a is returned"
  ([a r]

    ;; We may have some hooks here, if not TODO remove the `let`
    ticket))

(defn append-ticket
  "Append a given ticket to the ticket vector/collection"
  [t-file-map ticket]
  (update-in t-file-map [:tickets] conj (assoc ticket
                                               :id (-> t-file-map :tickets count inc))))

(defn update-ticket
  "Update a ticket within the ticket vector/collection.
  The ticket passed must already have an :id"
  [t-file-map ticket]
  (update-in t-file-map [:tickets (-> ticket :id id->pos)] merge ticket))

(defn ticket-io!
  "This applies a function to the actual ticket file.
  All functions should take two args: the ticket file map and a ticket.
  You should never lock the ticket file by hand, use this function."
  ([f ticket]
   (ticket-io! f ticket default-ticket-path))
