---
title: "Getting started with texanshootR"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Getting started with texanshootR}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment  = "#>",
  eval     = FALSE
)
```

`texanshootR` is a terminal-first specification-search engine. The main
entry point is `shoot()`. It opens a wall-clock budget, fires at the
specification space, and returns a `tx_run` carrying the highlighted
result and the audit trail.

## A first run

```{r}
library(texanshootR)

run <- shoot(mtcars)
print(run)
summary(run)
```

`shoot()` flails opportunistically across predictor subsets,
transformations, interactions, outlier exclusions, subgroup splits, and
— as the career advances — alternative model families. The print method
leads with the shooter's face and the emotional arc the run followed
(`composed -> resolved`, `panicked -> resolved (last-minute)`,
`escalated to derived metrics`) before the formula and the p-value.

Every run is deterministic given a seed. The seed, R version, package
version, and a hash of the search trace are recorded on the returned
object so the full search can be replayed.

## The publication chain

A finished `tx_run` that clears `p <= 0.05` is *shippable*. The first
shippable run opens a **publication chain** — six output stages,
redeemed in order:

```r
abstract(run)            # one-paragraph deadpan summary
manuscript(run)          # IMRaD draft; Methods match the winning spec
presentation(run)        # 8-slide deck; residual plot on slide 7
reviewer_response(run)   # opens "we thank the reviewer..."
graphical_abstract(run)  # the figure your PI will retweet
funding(run)             # the next grant, citing the just-shipped finding
```

Finish the chain through your currently-unlocked prefix and you
collect a length-bonus on top of the per-stage XP.

The chain breaks — bonus forfeit, partial XP kept — if you fire a
fresh `shoot()` before finishing. Calling the wrong stage (or the
wrong run) signals a `tx_chain_error` but leaves the chain open so
you can retry the correct stage.

Aliases are accepted: `powerpoint` (= `presentation`), `reviewer` (=
`reviewer_response`), `graphical` (= `graphical_abstract`).

### XP, chain length, career tier

The chain prefix you can redeem grows with cumulative XP. Career tier
is a label derived from that prefix:

| Chain length | New stage              | XP needed | Career tier        |
|:------------:|------------------------|:---------:|--------------------|
| 1            | `abstract()`           | 0         | Junior Researcher  |
| 2            | `manuscript()`         | 5         | Postdoc            |
| 3            | `presentation()`       | 15        | Postdoc            |
| 4            | `reviewer_response()`  | 30        | Senior Scientist   |
| 5            | `graphical_abstract()` | 55        | Senior Scientist   |
| 6            | `funding()`            | 90        | PI                 |

The tier label is cosmetic. The chain length is the real gate.

## Auto-generating the chain

Output flags on `shoot()` auto-generate the chain prefix needed to
reach the highest enabled flag, in order. So a shippable run with
`presentation = TRUE` produces `abstract`, `manuscript`, and
`presentation` in one go — provided each one is unlocked:

```{r}
run <- shoot(mtcars, presentation = TRUE)
```

Files land in `tempdir()` by default. Override with `output_dir =` or
`options(texanshootR.output_dir = ...)`. Each generator returns the
file path invisibly.

## Locked stages and broken chains

Locked calls, the wrong run, and out-of-order calls all signal a
structured `tx_chain_error`. A locked stage in a fresh profile
looks like this:

```
manuscript() requires:
5 XP (chain length 2)

Current XP:
0
```

Scripts can branch on the `reason` field:

```{r}
res <- tryCatch(manuscript(run), tx_chain_error = function(e) e)
if (inherits(res, "tx_chain_error")) {
  res$reason   # one of: not_unlocked, no_active_chain,
               #         wrong_run, wrong_stage
}
```

Inspect the live HUD with `progress()`:

```{r}
progress()
```

It prints chain length, current XP, next unlock, what's still locked,
and the active chain window if one is open.

## Career, achievements, cosmetics

```{r}
career()        # tier, runs, favourite method, opaque scores
achievements()  # 20 unlockable badges; hidden ones show as ???
wardrobe()      # equipped cosmetic slots (hat, badge, cloak, poncho, lanyard)
run_log()       # tibble of every run on this profile
```

Hidden achievements appear as `???` until unlocked. New cosmetics
auto-equip when their unlocking achievement fires; override the
selection with `wardrobe(slot, id)`.

## Persistent state

The researcher profile persists under
`tools::R_user_dir("texanshootR", "data")` as flat YAML. The first
interactive save prompts before writing anything to disk. Decline the
prompt, or opt out entirely with:

```{r}
options(texanshootR.save_enabled = FALSE)
```

and the package becomes stateless: every call is independent,
progression sits inert at Junior Researcher, and the chain never
opens beyond `abstract()`.

To pre-consent (CI, scripts, the impatient):

```{r}
options(texanshootR.consent = TRUE)
```

## Resetting

Should circumstances call for a fresh start — a new institution, a
co-author dispute, an opportune hard-drive failure, or because some of
you just want to see the world burn:

```{r}
reset_career(force = TRUE)
reset_achievements(force = TRUE)
reset_wardrobe(force = TRUE)
reset_all(force = TRUE)
```

## Next steps

The [README](https://gillescolling.com/texanshootR/) covers the seven
model families, the message-pack schema, and the design philosophy.
The [reference index](https://gillescolling.com/texanshootR/reference/)
lists every exported function with examples.
