---
name: openqa-cn-slot-scaffolder
description: "Generate a domain data-build slot from OpenAPI files: new business-domain pack, scaffold a data-build skill, or add an enterprise custom domain. Internal helper of the parent pack; reach this through codexqa-testdata-generator."
license: "Apache-2.0"
metadata:
  decimalai-skill-id: "f364f9f6-1eee-4177-8243-38ee50363a8c"
  decimalai-version-id: "c4563866-e13d-4f97-8900-9380578028e1"
  decimalai-version: "1"
  decimalai-body-sha256: "4fbd747d62b85b55ad72200d9d372e462b8ec5485993fbb4de1d503d14a7fd6e"
  decimalai-name: "openqa-cn/slot-scaffolder"
  decimalai-format: "1"
  decimalai-invocation: "model"
  decimalai-category: "agent-tooling"
  decimalai-source: "https://app.decimal.ai/s/openqa-cn-slot-scaffolder@1/SKILL.md"
---
# Slot scaffolder

Bundled sub-skill of `codexqa-testdata-generator`: turn an OpenAPI directory plus a
domain name into a slot that matches [../slots/SLOT_SPEC.md](../slots/SLOT_SPEC.md),
the single copy of that contract.

## Inputs

`domain` and `openapi` are the prerequisite **materials**. If either is missing, or the OpenAPI directory has no `.yaml` / `.yml` / `.json` files, **stop and ask**. Do not invent operations or scaffold an empty slot. After the user provides them, generate the slot. Do not collect executor fields.

| Field | Meaning | Required |
|---|---|---|
| `domain` | Short English slug (`payments`, `logistics`) | yes |
| `openapi` | Directory of OpenAPI YAML/JSON files (at least one spec) | yes |
| `output` | Destination directory (default `../slots/<domain>`) | no |

## Run

```bash
node scripts/scaffold_slot.ts \
  --domain <domain> \
  --openapi <openapi-dir> \
  --output <output-dir>
```

The script writes `slot.yaml` (the one config), executor stubs, generated `SKILL.md` / `tools-guide.md`, and copies OpenAPI into `assets/openapi/`.

Slots under `./slots/<domain>` are discovered automatically. If the skill lives elsewhere, add one line:

```yaml
workspace:
  slot_roots:
    - /path/to/company-slots
```

## After generation

1. Implement each stub `main(params)` against `DATA_BUILD_API_BASE` (timeouts; never `shell: true`; missing required IDs must fail)
2. Add `scenes` (and optional `aliases` / `invokeParams`) in `slot.yaml` only. List more specific entities before generic ones
3. Refresh generated docs: `node ../scripts/sync_slot.ts --dir <slot>`  
   Hand-written `SKILL.md` is left alone unless it is `generated-from: slot.yaml` or you pass `--force`
4. Smoke-test: `node ../scripts/search_data_build.ts --keywords <domain> --json`

Do **not** add `skill_marketplace.paths` or `api_catalog.paths`. Search, OpenAPI index, and case-pipeline bind all read `slots/` + `workspace.slot_roots`. If `slot.yaml` is omitted, entities are inferred from `scripts/executors/*` and `assets/openapi` operationIds.

Human operators: [../HOW_IT_WORKS.md](../HOW_IT_WORKS.md#appendix-add-a-new-scene). Agents stay on this file and [../slots/SLOT_SPEC.md](../slots/SLOT_SPEC.md).
