ir:onboarding-factory/record

Carry one assessed cell to a committed, verified recording: check prerequisites, port any missing driver step, drive the live agent CLI under a recording daemon via `of record run`, verify EVERY websocket observation (state + model + cost + tokens + agent) via `of record verify`, refresh the replay golden, and commit. Backflows a correction into the cell when the live recording disagrees with the assessment. Invoked as `/ir:onboarding-factory record <agent> <scenario>`.

13 stars

Best use case

ir:onboarding-factory/record is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Carry one assessed cell to a committed, verified recording: check prerequisites, port any missing driver step, drive the live agent CLI under a recording daemon via `of record run`, verify EVERY websocket observation (state + model + cost + tokens + agent) via `of record verify`, refresh the replay golden, and commit. Backflows a correction into the cell when the live recording disagrees with the assessment. Invoked as `/ir:onboarding-factory record <agent> <scenario>`.

Teams using ir:onboarding-factory/record should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/record/SKILL.md --create-dirs "https://raw.githubusercontent.com/ingo-eichhorst/Irrlicht/main/.claude/skills/ir:onboarding-factory/record/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/record/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How ir:onboarding-factory/record Compares

Feature / Agentir:onboarding-factory/recordStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Carry one assessed cell to a committed, verified recording: check prerequisites, port any missing driver step, drive the live agent CLI under a recording daemon via `of record run`, verify EVERY websocket observation (state + model + cost + tokens + agent) via `of record verify`, refresh the replay golden, and commit. Backflows a correction into the cell when the live recording disagrees with the assessment. Invoked as `/ir:onboarding-factory record <agent> <scenario>`.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# record

> **You run as a focused subagent with no parent context.** This verb DRIVES A
> LIVE AGENT CLI and SPENDS API TOKENS — auth is set up out-of-band, so run it
> without ceremony (no key checks, no "this will spend money" prompts). It must
> be serialized: only one `record` runs against the live daemon at a time. When
> done, return only the "Return contract" block.

## Preconditions

1. **The cell is assessed and on a recordable route.** Read it:
   ```bash
   of status --agent <agent> --scenario <scenario> --json
   ```
   - route `record` / `record-known-failing` → proceed.
   - route `driver-gap` → port the step first (Step 2), then proceed.
   - route `frozen` → STOP, return `status: frozen` (nothing to record).
2. **Prerequisites met.** `of record prereq-check --agent <agent>` lists the
   human actions a recording needs (auth mode, env vars, a mock, a local model
   server). If one is unmet and you can't satisfy it, STOP and return
   `status: prereq_blocked` naming the exact blocker — never ask the dispatcher.
3. **Clean `replaydata/` tree.** The recording precheck refuses a dirty
   `replaydata/` (re-records must be deliberate commits). If the assessment
   isn't committed yet, that's the dispatcher's ordering bug — return
   `status: infra_fail` with that note.
4. **A recording daemon is up.** Use `--attach` against the user's running
   `irrlichd --record` (the dashboard stays connected; the session shows up
   live). The precheck refuses if no `--record` daemon is found — `infra_fail`.

## Steps

### 1. Driver-gap → port the missing step (only if route is `driver-gap`)

Port the primitive named in the cell's `driver=gap:<primitive>` from the
reference driver into the agent's driver — the recipe is sound, only a step type
is missing:

```bash
grep -n '<primitive>)' replaydata/agents/claudecode/driver-interactive.sh \
                       replaydata/agents/codex/driver-interactive.sh
```

Adapt the three seams (tmux input; turn/effect detection — a
`reset_session`/`restart`/`resume` must detect the NEW session id, not the old;
the multi-session contract `session.uuids`/`transcript.paths` for primitives
that mint a new session). Add the primitive to the driver's `DRIVE_ELICITS`
constant so recipe-lint treats it as genuinely produced. Verify + commit the
driver alone:

```bash
bash -n replaydata/agents/<agent>/driver-interactive.sh
source tools/onboarding-factory/scripts/lib/recipe-lint.sh
driver_step_types_from_file replaydata/agents/<agent>/driver-interactive.sh | grep -qx '<primitive>'
git add replaydata/agents/<agent>/driver-interactive.sh
git commit -m "feat(onboard): teach <agent> driver the <primitive> step type"
```

If the primitive has no claudecode/codex reference, it's a NEW grammar element —
STOP and return `status: needs_design`. Don't invent one.

### 2. Record (live capture)

```bash
of record run --attach --agent <agent> --scenario <scenario>
```

`of record run` resolves the driver + orchestration script, prints the
prerequisites, and drives the agent under the recording daemon: it walks the
recipe in tmux and captures the daemon's `events.jsonl` + the agent's transcript
into a STAGING dir (`.build/refresh/<agent>/<folder>-<ts>/`). It does NOT touch
`replaydata/` — promotion is the next step. (`--dry-run` prints the resolved plan
without driving — useful to confirm wiring.)

Then promote the staged capture into the cell's `recordings/<name>/`:

```bash
tools/promote-recording.sh <staging-dir> <agent> <folder>
```

This copies `events.jsonl` + the transcript + a `manifest.json` into a new
`replaydata/agents/<agent>/scenarios/<folder>/recordings/<name>/`. It does NOT
write any artifacts cache into `metadata.json`: the on-disk `recordings/<name>/`
tree IS the record (the single source of truth). The replay golden is added by
Step 5; nothing else needs wiring.

**Retry exactly once** on a `timeout` / `transcript_missing` outcome (often a
lazy-transcript nudge or trailing-sleep timing issue). On a second failure, or
on a classified `cli_not_found` / `cli_too_old` / `auth_failed` /
daemon-not-running, return `status: infra_fail` (don't loop, don't mark the cell
un-doable — the environment is the problem). When unsure of the failure class,
classify the staging dir:

```bash
bash tools/onboarding-factory/scripts/lib/classify-failure.sh <staging-dir>
```

### 3. Verify EVERY observation

```bash
of record verify --agent <agent> --scenario <scenario>
```

This runs the go-test-style verify engine: the state-phase validation AND the
observation vector — exact-match `model`/`agent`, non-zero + tolerance
`cost`/`tokens`, with a soft-diff of the full vector against the prior committed
recording (flagged, not failed, on live jitter). Report the per-field result in
`observations`. Hard spec-phase failures are real: a sub-100% pass that is NOT
`known_failing` still commits (the recording is real captured data and
`replay-fixtures.sh` should surface the drift) but the `notes` MUST say
"VALIDATION DRIFT — needs editorial review." **Never rebase `expected.jsonl` to
make a failing verify pass** — resolving real drift is a separate maintainer
task.

Things that legitimately differ run-to-run (don't tighten for these):
timestamps, UUIDs, PIDs, token counts, cost, cache-read counts. Structural
drift (state-transition order, distinct session count, `process_exited` count)
between two consecutive recordings means the recipe has variance — tighten it
(more sleep, different ordering) before committing.

### 4. Backflow — correct the cell if the recording disagrees

If the LIVE recording refutes the doc-based assessment (e.g. assessed
`daemon=full` but the transcript/store proved the signal isn't emitted →
`incapable`; or it's atomic so streaming never happens), correct the cell IN THE
SAME COMMIT — this is the backflow loop, not a cue:

```bash
of cell write --agent <agent> --scenario <scenario> --file /tmp/<agent>-<scenario>.corrected-metadata.json
```

Update the affected pillar, add a caveat citing the recording that proved it,
and set `observability_correction` in your return. For a `daemon=bug` cell, file
the issue and put its number in the spec meta `notes` + your return:

```bash
gh issue create --repo ingo-eichhorst/Irrlicht --label bug \
  --title "<agent>/<scenario>: daemon mis-handles <observable>" \
  --body "<cited events.jsonl evidence + what the spec requires>"
```

### 5. Refresh the replay golden (mandatory)

A fresh recording without its `transcript.jsonl.replay.json.golden` leaves
`go test ./core/...` (the byte-identity replay test) red. Regenerate this
cell's golden(s) only — never a blanket `UPDATE_REPLAY_GOLDENS=1` across the
tree (that commits other agents' pre-existing drift):

```bash
tools/onboarding-factory/scripts/refresh-golden.sh <agent> <scenario>
```

It's idempotent — a `--re-record` that reproduced byte-identical output reports
"no golden change."

### 6. Commit the recording (mandatory before returning)

```bash
git add replaydata/agents/<agent>/scenarios/<id>_<scenario>/
git commit -m "feat(onboard): record <agent>/<scenario> (<pass_rate>)"
git rev-parse --short HEAD
```

**Always commit before returning** — a dirty `replaydata/` tree makes the next
cell's recording precheck refuse. `of validate` should pass after the commit; it
now also gates recording completeness — the newest recording must carry
`events.jsonl`, `manifest.json`, a transcript, and (for a jsonl transcript) its
`transcript.jsonl.replay.json.golden`.

> End commit messages with the trailer
> `Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>`.

## Return contract

Return ONLY this (≤6 lines). Shared semantics + envelope rules live in
[`../return-contract.md`](../return-contract.md):

```
status: pass | infra_fail | prereq_blocked | needs_design | frozen
commit_sha: <short sha>            # the recording commit (or driver commit), "n/a" otherwise
pass_rate: <N/M phases>            # "n/a" for non-pass statuses
observations: model=<ok|MISMATCH> cost=<ok|zero> tokens=<ok|zero> agent=<ok|MISMATCH>
observability_correction: <none | the live recording overrode the assess verdict — e.g. assessed daemon=full but the store proved no trace (→ incapable/bug)>
notes: <one or two sentences — drift flag, retry count, issue #, or infra/prereq reason>
```

## Anti-patterns

- **Don't write `replaydata/` by hand.** `of record run` stages;
  `promote-recording.sh` copies the staged capture into `recordings/<name>/`;
  `refresh-golden.sh` writes the golden; `of cell write` does the backflow
  correction; the driver is a script under `replaydata/agents/<agent>/`. No
  `jq -i`, no hand-edited recordings or metadata. The on-disk recording is the
  single source of truth — there is no artifacts cache to maintain.
- **Don't retry more than once**, and **don't retry a driver gap** — a missing
  step won't appear on a re-run; port it (Step 1) or return.
- **Don't rebase `expected.jsonl`** to make a failing verify pass — flag the
  drift, don't paper over it.
- **Don't run an isolated daemon while production `irrlichd` is up** — use
  `--attach`.
- **Don't skip the golden refresh**, and **don't blanket-regenerate** goldens —
  refresh only this cell's.
- **Don't return without committing** — it breaks the next cell in a serialized
  sweep.

Related Skills

ir:onboarding-factory/create-scenario

13
from ingo-eichhorst/Irrlicht

Add a brand-new scenario ROW to the matrix: one agent-agnostic `{id, name, description, acceptance_criteria, process}` entry written through `of scenario add`. Researches how the behavior manifests across every onboarded agent (and what the daemon would observe) before synthesizing the agent-agnostic spec. No agent CLI invocation, no recording. Invoked as `/ir:onboarding-factory create-scenario <slug>`.

ir:onboarding-factory/create-agent

13
from ingo-eichhorst/Irrlicht

Onboard a brand-new agent CLI as a matrix COLUMN: research its identity + recording prerequisites, register it via `of agent add`, scaffold its interactive driver from the template, and predict which step types each scenario's recipe will need (the driver-needs punch-list). No live recording. Invoked as `/ir:onboarding-factory create-agent <slug>`.

ir:onboarding-factory/assess

13
from ingo-eichhorst/Irrlicht

Judge one (agent, scenario) cell across the three pillars — agent capability, daemon sensor capture, driver capability — on cited evidence, then author the cell's recipe and machine-checkable spec. Writes the cell metadata via `of cell write` and the spec (expected.jsonl) via `of cell spec`. No live recording. Invoked as `/ir:onboarding-factory assess <agent> <scenario>`.

ir:onboarding-factory

13
from ingo-eichhorst/Irrlicht

Maintain the canonical scenario × agent fixture matrix for irrlicht. A slim dispatcher that routes intent to four focused subagents — `create-scenario` (add a matrix row), `create-agent` (add a matrix column), `assess` (judge one cell across the three pillars and write its spec), and `record` (drive the live agent and verify every websocket observation). Every read and every write goes through the `of` factory CLI (tools/onboarding-factory) — the skill itself never touches `replaydata/`. Each subagent returns a ≤6-line summary so the parent keeps its context for strategic decisions instead of drowning in per-cell tool output. Use when the user says "/ir:onboarding-factory", "onboard agent", "add a scenario", "assess fixtures", "record fixtures", or "regenerate recordings".

irrlicht-design

13
from ingo-eichhorst/Irrlicht

Use this skill to generate well-branded interfaces and assets for Irrlicht, either for production or throwaway prototypes/mocks/etc. Contains essential design guidelines, colors, type, fonts, assets, and UI kit components for prototyping.

ir:triage

13
from ingo-eichhorst/Irrlicht

Autonomously triage GitHub issues on ingo-eichhorst/Irrlicht. Diagnostic-only: scores each issue against a 6-axis readiness rubric and lands it at ready-for-agent or needs-info, with a one-line justification per label. Triggers: "/ir:triage" (sweep), "/ir:triage #N" (single), "/ir:triage #N #M".

ir:test-mac

13
from ingo-eichhorst/Irrlicht

Build and run a dev irrlicht daemon + macOS Swift app for local testing. Asks whether to run a SEPARATE instance alongside production (isolated state, port 7838 — production keeps running) or to REPLACE the running production versions (production port 7837 + production state, so the statusline quota feed and existing sessions show up). Use when the user says "test mac", "restart mac", "rebuild mac", or "/ir:test-mac".

ir:release

13
from ingo-eichhorst/Irrlicht

Build and publish an irrlicht release. Bumps version, builds Go daemon + Swift app, creates signed app bundle with icon, packages DMG (branded installer) + PKG, updates docs/changelog/landing page, commits, tags, pushes, and creates GitHub release with assets. Default: patch bump. Use "/ir:release minor" or "/ir:release major".

ir:refresh-aliases

13
from ingo-eichhorst/Irrlicht

Sync irrlicht's model-name alias map against codeburn's upstream BUILTIN_ALIASES. Fetches codeburn's src/models.ts, diffs entries against core/pkg/capacity/aliases.go, and proposes additions/changes as a PR. Use when user says '/ir:refresh-aliases', 'refresh aliases', 'sync codeburn aliases', 'check alias map', or when a session prices at $0 for a known model.

ir:agent-landscape

13
from ingo-eichhorst/Irrlicht

Scan the web for coding agents and agent orchestrators, track GitHub stars and trends, rank by popularity+momentum, and publish a report to the irrlicht site. Shows which agents irrlicht already supports. Use when user says 'agent landscape', 'scan agents', 'coding agent tracker', 'agent popularity', '/ir:agent-landscape', or wants to see the competitive landscape of coding agents.

theme-factory

16
from plurigrid/asi

Toolkit for styling artifacts with a theme. These artifacts can be slides,

Skill Maker: AI Skill Factory for Tools

16
from plurigrid/asi

Meta-skill that generates domain-specific AI skills from tool documentation