ThinkThen

Every kind of answer at once

annotate: fill out a form for every record.

form.json, a file the examples read
{
  "version": 1,
  "questions": {
    "steps": {
      "decide": "Does the report give steps to reproduce?"
    },
    "area": {
      "choose": "Which part of the app is this?",
      "options": [
        "export",
        "login",
        "billing"
      ]
    },
    "impact": {
      "score": "How much does this block the user?",
      "levels": [
        "None.",
        "Slows them.",
        "Blocks work."
      ]
    }
  }
}
One JSON document goes in. The same document comes back with three answers added: steps, area, and impact. The nested report rides through unchanged.
cat <<'EOF' |
{
  "id": "B-7",
  "report": {
    "page": "/login",
    "body": "Steps: click Log in. Nobody gets in."
  }
}
EOF
thinkthen annotate form.json \
  --field /report/body |
jq .
Output
{
  "id": "B-7",
  "report": {
    "page": "/login",
    "body": "Steps: click Log in. Nobody gets in."
  },
  "steps": true,
  "area": "login",
  "impact": 1.98
}
exit 0

You give it a saved set of questions and your JSON. You get back the same JSON with one field added per question. Nested fields ride through unchanged.

Read the answer

Each question carries its own threshold. One question set can mix cuts and bands. A question the backend could not answer is marked failed and counted. It never turns into null.

Exit codeWhat it means
0every question was answered
6the run finished with failed questions
2usage or input error
4the backend failed or refused, as it does for evidence over the size limit
5the question set could not be read
70a defect in the tool

Send the not-sure answers to a person.

Call it from your language

The Bash example opens this page.

Jobs that use annotate

Watch annotate answer questions about Beatles songs: annotate answers a question set.