{
    "archive_path": "archive/1791713075.907332",
    "base_url": "nishtahir.com/build-your-own-decision-model",
    "basename": "",
    "bookmarked_date": "2026-10-11 10:04",
    "canonical": {
        "archive_org_path": "https://web.archive.org/web/nishtahir.com/build-your-own-decision-model",
        "dom_path": "output.html",
        "favicon_path": "favicon.ico",
        "git_path": "git/",
        "google_favicon_path": "https://www.google.com/s2/favicons?domain=nishtahir.com",
        "headers_path": "headers.json",
        "htmltotext_path": "htmltotext.txt",
        "index_path": "index.html",
        "media_path": "media/",
        "mercury_path": "mercury/content.html",
        "pdf_path": "output.pdf",
        "readability_path": "readability/content.html",
        "screenshot_path": "screenshot.png",
        "singlefile_path": "singlefile.html",
        "warc_path": "warc/",
        "wget_path": "nishtahir.com/build-your-own-decision-model/index.html"
    },
    "domain": "nishtahir.com",
    "extension": "",
    "hash": "1ER9QS77GS8MFEX6BPAC",
    "history": {
        "archive_org": [],
        "dom": [],
        "favicon": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--output",
                    "favicon.ico",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://www.google.com/s2/favicons?domain=nishtahir.com"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-11T10:05:38.293719+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T10:05:37.632621+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--output",
                    "favicon.ico",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://www.google.com/s2/favicons?domain=nishtahir.com"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-11T16:29:35.337667+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T16:29:34.585066+00:00",
                "status": "succeeded"
            }
        ],
        "git": [],
        "headers": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--head",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-11T10:05:38.909704+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T10:05:38.302169+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--head",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-11T16:29:35.935740+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T16:29:35.341824+00:00",
                "status": "succeeded"
            }
        ],
        "htmltotext": [],
        "media": [],
        "mercury": [
            {
                "cmd": [
                    "/app/node_modules/@postlight/parser/cli.js",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "1.0.0",
                "end_ts": "2026-10-11T10:05:46.338046+00:00",
                "index_texts": null,
                "output": "mercury",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T10:05:42.212576+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "/app/node_modules/@postlight/parser/cli.js",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "1.0.0",
                "end_ts": "2026-10-11T16:29:42.940738+00:00",
                "index_texts": null,
                "output": "mercury",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T16:29:39.166846+00:00",
                "status": "succeeded"
            }
        ],
        "pdf": [],
        "readability": [
            {
                "cmd": [
                    "/app/node_modules/readability-extractor/readability-extractor",
                    "/tmp/tmpzi3hd4aw",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2026-10-11T10:05:42.202792+00:00",
                "index_texts": [
                    "\"System one\" decision models are models that infer and respond with calibrated probabilities or every allowed answer.Consider your everyday language model, to get typed output from it (JSON), you may use Structured Output to constrain the output to guaranteed valid JSON. While model prefills the input in one pass, it still has to go perform a pass for every token in order to generate a valid response.In this example, 11 passes are required to generate the final output. (We're not accounting for speculative decoding and other inference optimization techniques.)\n\n\n\n\n    \n    prompt (prefill)\n      generated (predicted)\n      being predicted\n    \n  \n\n\n\nDecision models such as Jev, make the assumption that there are fixed options we can select from and we can do so quickly by making a single pass. In this example we constrain the set of possible outputs to the options A, B, C, D, E. By masking other items in the vocabulary, the model can only emit those tokens. By selecting the highest probability output, we get our answer.\n\n\n\n\n    \n    prompt (prefill)\n      generated (predicted)\n      being predicted\n    \n  \n\n\n\nSince the outputs are constrained to only a fixed set of options, the model can't select anything outside of those. This however does not guarantee that the output will be correct. It's also common to treat the output token probabilities a confidence scores in this context, but without additional training, those scores likely reflect its confidence in what the next token will be rather than the true probability of the response being the correct answer.Build your ownWe can emulate this behavior by constraining output tokens using an LLM. Here I'm using Qwen/Qwen3-1.7Bimport argparse\nimport json\n\nimport torch\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\n\nmodel_name = \"Qwen/Qwen3-1.7B\"\noptions = [\"A\", \"B\", \"C\", \"D\", \"E\"]\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"--input\", default=\"question.json\")\nargs = parser.parse_args()\n\n# load the tokenizer and the model\ntokenizer = AutoTokenizer.from_pretrained(model_name)\nmodel = AutoModelForCausalLM.from_pretrained(\n    model_name,\n    torch_dtype=\"auto\",\n    device_map=\"auto\"\n)\n\n# the token the model would emit for each option as the first assistant token\noption_token_ids = [tokenizer.encode(opt, add_special_tokens=False)[0] for opt in options]\n\n\ndef format_prompt(item):\n    prompt = item[\"question\"] + \"\\n\"\n    for opt in options:\n        prompt += f\"{opt}. {item[opt]}\\n\"\n    prompt += \"Answer:\"\n    messages = [\n        {\"role\": \"user\", \"content\": prompt}\n    ]\n    return tokenizer.apply_chat_template(\n        messages,\n        tokenize=False,\n        add_generation_prompt=True,\n        enable_thinking=False\n    )\n\n\nwith open(args.input) as f:\n    item = json.load(f)\n\nmodel_inputs = tokenizer(format_prompt(item), return_tensors=\"pt\").to(model.device)\nwith torch.no_grad():\n    logits = model(**model_inputs).logits[0, -1]\n# constrained decoding: only the option tokens are allowed\nprobs = torch.softmax(logits[option_token_ids].float(), dim=-1)\n\nprint(f\"prediction: {options[probs.argmax().item()]}\")\nfor opt, prob in zip(options, probs.tolist()):\n    print(f\"{opt}: {prob:.4f}  {item[opt]}\")Running it with an simple question to test it yeilds the following output// input\n\n{\n    \"question\": \"What color is the sky?\",\n    \"A\": \"Red\",\n    \"B\": \"Blue\",\n    \"C\": \"Green\",\n    \"D\": \"Purple\",\n    \"E\": \"I don't know\"\n}\n\n// output\n\nprediction: B\nA: 0.0000  Red\nB: 0.9988  Blue\nC: 0.0000  Green\nD: 0.0000  Purple\nE: 0.0012  I don't knowThe model was able to make sense of our input and make a prediction that reasonably corresponds to the correct answer.We can test the accuracy of the model by running it against public datasets. I ran this against a random sample holdout of CommonsenseQA    precision    recall        f1   support\nA    0.5733    0.7197    0.6382       239\nB    0.5506    0.7686    0.6416       255\nC    0.5372    0.6598    0.5922       241\nD    0.7206    0.3904    0.5065       251\nE    0.7519    0.4255    0.5435       235\naccuracy: 725/1221 = 0.5938\nmacro f1: 0.5844Not bad for a 1.7B model, Running a quick finetune on the dataset gives us slightly better performance    precision    recall        f1   support\nA    0.6475    0.6611    0.6542       239\nB    0.6113    0.6784    0.6431       255\nC    0.6234    0.5975    0.6102       241\nD    0.6700    0.5418    0.5991       251\nE    0.5808    0.6426    0.6101       235\naccuracy: 762/1221 = 0.6241\nmacro f1: 0.6234Calibrating your modelTesting the model against a very ambiguous problem demonstrates an interesting problem.// input\n{\n    \"question\": \"Where would you most likely find a bat?\",\n    \"A\": \"Cave\",\n    \"B\": \"Baseball game\",\n    \"C\": \"Attic\",\n    \"D\": \"Zoo\",\n    \"E\": \"Sporting goods store\"\n}\n\n// output\n\nprediction: A\nA: 0.9978  Cave\nB: 0.0004  Baseball game\nC: 0.0017  Attic\nD: 0.0000  Zoo\nE: 0.0001  Sporting goods storeThere should be no clear answer here, but treating the output probabilities as a pseudo \"confidence\" score, shows that the model is extremely overconfident in this answer.If we bin the confidence score ranges in the eval I ran earlier, we can see that the model's confidence does not match its accuracy. This means that the model is not calibrated.         bin   count  confidence  accuracy\n(0.00, 0.10]       0      0.0000    0.0000\n(0.10, 0.20]       0      0.0000    0.0000\n(0.20, 0.30]       3      0.2834    0.0000\n(0.30, 0.40]      26      0.3761    0.2692\n(0.40, 0.50]      41      0.4538    0.2683\n(0.50, 0.60]      70      0.5490    0.3286\n(0.60, 0.70]      74      0.6476    0.3649\n(0.70, 0.80]      77      0.7495    0.4286\n(0.80, 0.90]     121      0.8555    0.4711\n(0.90, 1.00]     809      0.9855    0.7009We can notice that the model tends to be extremely overconfident in the 0.9 - 1.0 bin but it's only correct 70% of the time. When it makes a prediction with  0.8 - 0.9 confidence it's only accurate ~40% of the time. This means that the model is generally overconfident in its predictions.Since our goal is to have the model output scores that is reflective of its accuracy, one method we can use to callibrate it is through temperature scaling. By modifying the temperature value, we can flatten its output probability distribution curve and scale it to approximate its accuracy.\n\n\n\n\n\n\n\nCurve fitting fit the temperature parameter to the model's accuracy, I found 3.797280788421631 as a temp value.         bin   count  confidence  accuracy\n(0.00, 0.10]       0      0.0000    0.0000\n(0.10, 0.20]       0      0.0000    0.0000\n(0.20, 0.30]      82      0.2712    0.2317\n(0.30, 0.40]     217      0.3507    0.3917\n(0.40, 0.50]     199      0.4472    0.5126\n(0.50, 0.60]     166      0.5475    0.5482\n(0.60, 0.70]     139      0.6562    0.5827\n(0.70, 0.80]     140      0.7492    0.7714\n(0.80, 0.90]     169      0.8507    0.7988\n(0.90, 1.00]     109      0.9333    0.9541This gets us a much better calibration. If you want to play around with this, I made a GitHub repo with scripts that walk you through building a dataset, evaluating, finetuning and calibrating your own model. I encourage pulling it and trying it on other bigger models."
                ],
                "output": "readability",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T10:05:40.256922+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "/app/node_modules/readability-extractor/readability-extractor",
                    "/tmp/tmppg0cx7mg",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2026-10-11T16:29:39.153627+00:00",
                "index_texts": [
                    "\"System one\" decision models are models that infer and respond with calibrated probabilities or every allowed answer.Consider your everyday language model, to get typed output from it (JSON), you may use Structured Output to constrain the output to guaranteed valid JSON. While model prefills the input in one pass, it still has to go perform a pass for every token in order to generate a valid response.In this example, 11 passes are required to generate the final output. (We're not accounting for speculative decoding and other inference optimization techniques.)\n\n\n\n\n    \n    prompt (prefill)\n      generated (predicted)\n      being predicted\n    \n  \n\n\n\nDecision models such as Jev, make the assumption that there are fixed options we can select from and we can do so quickly by making a single pass. In this example we constrain the set of possible outputs to the options A, B, C, D, E. By masking other items in the vocabulary, the model can only emit those tokens. By selecting the highest probability output, we get our answer.\n\n\n\n\n    \n    prompt (prefill)\n      generated (predicted)\n      being predicted\n    \n  \n\n\n\nSince the outputs are constrained to only a fixed set of options, the model can't select anything outside of those. This however does not guarantee that the output will be correct. It's also common to treat the output token probabilities a confidence scores in this context, but without additional training, those scores likely reflect its confidence in what the next token will be rather than the true probability of the response being the correct answer.Build your ownWe can emulate this behavior by constraining output tokens using an LLM. Here I'm using Qwen/Qwen3-1.7Bimport argparse\nimport json\n\nimport torch\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\n\nmodel_name = \"Qwen/Qwen3-1.7B\"\noptions = [\"A\", \"B\", \"C\", \"D\", \"E\"]\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"--input\", default=\"question.json\")\nargs = parser.parse_args()\n\n# load the tokenizer and the model\ntokenizer = AutoTokenizer.from_pretrained(model_name)\nmodel = AutoModelForCausalLM.from_pretrained(\n    model_name,\n    torch_dtype=\"auto\",\n    device_map=\"auto\"\n)\n\n# the token the model would emit for each option as the first assistant token\noption_token_ids = [tokenizer.encode(opt, add_special_tokens=False)[0] for opt in options]\n\n\ndef format_prompt(item):\n    prompt = item[\"question\"] + \"\\n\"\n    for opt in options:\n        prompt += f\"{opt}. {item[opt]}\\n\"\n    prompt += \"Answer:\"\n    messages = [\n        {\"role\": \"user\", \"content\": prompt}\n    ]\n    return tokenizer.apply_chat_template(\n        messages,\n        tokenize=False,\n        add_generation_prompt=True,\n        enable_thinking=False\n    )\n\n\nwith open(args.input) as f:\n    item = json.load(f)\n\nmodel_inputs = tokenizer(format_prompt(item), return_tensors=\"pt\").to(model.device)\nwith torch.no_grad():\n    logits = model(**model_inputs).logits[0, -1]\n# constrained decoding: only the option tokens are allowed\nprobs = torch.softmax(logits[option_token_ids].float(), dim=-1)\n\nprint(f\"prediction: {options[probs.argmax().item()]}\")\nfor opt, prob in zip(options, probs.tolist()):\n    print(f\"{opt}: {prob:.4f}  {item[opt]}\")Running it with an simple question to test it yeilds the following output// input\n\n{\n    \"question\": \"What color is the sky?\",\n    \"A\": \"Red\",\n    \"B\": \"Blue\",\n    \"C\": \"Green\",\n    \"D\": \"Purple\",\n    \"E\": \"I don't know\"\n}\n\n// output\n\nprediction: B\nA: 0.0000  Red\nB: 0.9988  Blue\nC: 0.0000  Green\nD: 0.0000  Purple\nE: 0.0012  I don't knowThe model was able to make sense of our input and make a prediction that reasonably corresponds to the correct answer.We can test the accuracy of the model by running it against public datasets. I ran this against a random sample holdout of CommonsenseQA    precision    recall        f1   support\nA    0.5733    0.7197    0.6382       239\nB    0.5506    0.7686    0.6416       255\nC    0.5372    0.6598    0.5922       241\nD    0.7206    0.3904    0.5065       251\nE    0.7519    0.4255    0.5435       235\naccuracy: 725/1221 = 0.5938\nmacro f1: 0.5844Not bad for a 1.7B model, Running a quick finetune on the dataset gives us slightly better performance    precision    recall        f1   support\nA    0.6475    0.6611    0.6542       239\nB    0.6113    0.6784    0.6431       255\nC    0.6234    0.5975    0.6102       241\nD    0.6700    0.5418    0.5991       251\nE    0.5808    0.6426    0.6101       235\naccuracy: 762/1221 = 0.6241\nmacro f1: 0.6234Calibrating your modelTesting the model against a very ambiguous problem demonstrates an interesting problem.// input\n{\n    \"question\": \"Where would you most likely find a bat?\",\n    \"A\": \"Cave\",\n    \"B\": \"Baseball game\",\n    \"C\": \"Attic\",\n    \"D\": \"Zoo\",\n    \"E\": \"Sporting goods store\"\n}\n\n// output\n\nprediction: A\nA: 0.9978  Cave\nB: 0.0004  Baseball game\nC: 0.0017  Attic\nD: 0.0000  Zoo\nE: 0.0001  Sporting goods storeThere should be no clear answer here, but treating the output probabilities as a pseudo \"confidence\" score, shows that the model is extremely overconfident in this answer.If we bin the confidence score ranges in the eval I ran earlier, we can see that the model's confidence does not match its accuracy. This means that the model is not calibrated.         bin   count  confidence  accuracy\n(0.00, 0.10]       0      0.0000    0.0000\n(0.10, 0.20]       0      0.0000    0.0000\n(0.20, 0.30]       3      0.2834    0.0000\n(0.30, 0.40]      26      0.3761    0.2692\n(0.40, 0.50]      41      0.4538    0.2683\n(0.50, 0.60]      70      0.5490    0.3286\n(0.60, 0.70]      74      0.6476    0.3649\n(0.70, 0.80]      77      0.7495    0.4286\n(0.80, 0.90]     121      0.8555    0.4711\n(0.90, 1.00]     809      0.9855    0.7009We can notice that the model tends to be extremely overconfident in the 0.9 - 1.0 bin but it's only correct 70% of the time. When it makes a prediction with  0.8 - 0.9 confidence it's only accurate ~40% of the time. This means that the model is generally overconfident in its predictions.Since our goal is to have the model output scores that is reflective of its accuracy, one method we can use to callibrate it is through temperature scaling. By modifying the temperature value, we can flatten its output probability distribution curve and scale it to approximate its accuracy.\n\n\n\n\n\n\n\nCurve fitting fit the temperature parameter to the model's accuracy, I found 3.797280788421631 as a temp value.         bin   count  confidence  accuracy\n(0.00, 0.10]       0      0.0000    0.0000\n(0.10, 0.20]       0      0.0000    0.0000\n(0.20, 0.30]      82      0.2712    0.2317\n(0.30, 0.40]     217      0.3507    0.3917\n(0.40, 0.50]     199      0.4472    0.5126\n(0.50, 0.60]     166      0.5475    0.5482\n(0.60, 0.70]     139      0.6562    0.5827\n(0.70, 0.80]     140      0.7492    0.7714\n(0.80, 0.90]     169      0.8507    0.7988\n(0.90, 1.00]     109      0.9333    0.9541This gets us a much better calibration. If you want to play around with this, I made a GitHub repo with scripts that walk you through building a dataset, evaluating, finetuning and calibrating your own model. I encourage pulling it and trying it on other bigger models."
                ],
                "output": "readability",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T16:29:37.254530+00:00",
                "status": "succeeded"
            }
        ],
        "screenshot": [],
        "singlefile": [],
        "title": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-11T10:05:40.250021+00:00",
                "index_texts": null,
                "output": "Build your own decision model",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T10:05:40.237222+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-11T16:29:37.250258+00:00",
                "index_texts": null,
                "output": "Build your own decision model",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T16:29:37.237519+00:00",
                "status": "succeeded"
            }
        ],
        "wget": [
            {
                "cmd": [
                    "wget",
                    "--no-verbose",
                    "--adjust-extension",
                    "--convert-links",
                    "--force-directories",
                    "--span-hosts",
                    "--no-parent",
                    "-e",
                    "robots=off",
                    "--reject=js,mjs,woff,woff2,ttf,otf,eot,mp4,m4v,mov,webm,ogv,mkv,avi,flv",
                    "--timeout=120",
                    "--restrict-file-names=windows",
                    "--page-requisites",
                    "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) wget/GNU Wget 1.21.3",
                    "--compression=auto",
                    "--timestamping",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "GNU Wget 1.21.3",
                "end_ts": "2026-10-11T10:05:40.229301+00:00",
                "index_texts": null,
                "output": "nishtahir.com/build-your-own-decision-model/index.html",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T10:05:38.919403+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "wget",
                    "--no-verbose",
                    "--adjust-extension",
                    "--convert-links",
                    "--force-directories",
                    "--span-hosts",
                    "--no-parent",
                    "-e",
                    "robots=off",
                    "--reject=js,mjs,woff,woff2,ttf,otf,eot,mp4,m4v,mov,webm,ogv,mkv,avi,flv",
                    "--timeout=120",
                    "--restrict-file-names=windows",
                    "--page-requisites",
                    "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) wget/GNU Wget 1.21.3",
                    "--compression=auto",
                    "--timestamping",
                    "https://nishtahir.com/build-your-own-decision-model/"
                ],
                "cmd_version": "GNU Wget 1.21.3",
                "end_ts": "2026-10-11T16:29:37.232181+00:00",
                "index_texts": null,
                "output": "nishtahir.com/build-your-own-decision-model/index.html",
                "pwd": "/data/archive/1791713075.907332",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-11T16:29:35.942075+00:00",
                "status": "succeeded"
            }
        ]
    },
    "icons": null,
    "is_archived": true,
    "is_static": false,
    "latest": {
        "archive_org": null,
        "dom": null,
        "favicon": "favicon.ico",
        "git": null,
        "media": null,
        "pdf": null,
        "screenshot": null,
        "singlefile": null,
        "title": "Build your own decision model",
        "warc": null,
        "wget": "nishtahir.com/build-your-own-decision-model/index.html"
    },
    "link_dir": "/data/archive/1791713075.907332",
    "newest_archive_date": "2026-10-11T16:29:39.166846+00:00",
    "num_failures": 0,
    "num_outputs": 12,
    "oldest_archive_date": "2026-10-11T10:05:37.632621+00:00",
    "path": "/build-your-own-decision-model/",
    "schema": "Link",
    "scheme": "https",
    "snapshot_id": "2e468e8a-86c2-4f51-bf0c-c737ab7d01b2",
    "sources": [
        "/data/sources/1791713075-import.txt"
    ],
    "tags": ",war-wiki",
    "tags_str": "war-wiki",
    "timestamp": "1791713075.907332",
    "title": "Build your own decision model",
    "updated": "2026-10-11T16:29:34.584901+00:00",
    "updated_date": "2026-10-11 16:29",
    "url": "https://nishtahir.com/build-your-own-decision-model/"
}