concept-scaffold-gen
ConceptScaffoldGen
Scaffold a concept spec for $ARGUMENTS with annotations, state declarations (groups, enums, records), typed action signatures, capabilities, and a register() action.
When to use: Use when creating a new concept specification from scratch. Generates a .concept file with annotations (@version, @category, @visibility, @gate), purpose, state (with groups, enum types, record types), actions with typed variants, invariants, capabilities block, and a register() action following Jackson's methodology.
Design Principles
- Singularity: Each concept serves exactly one purpose — if the purpose has 'and', it's two concepts.
- Independence: A concept never references another concept's types or calls another concept's actions. Use type parameters and syncs.
- Sufficiency & Necessity: Every state field is needed by at least one action. Every action serves the concept's purpose. No dead state.
- Invariant Completeness: Key properties are captured as formal invariants documenting what must be true after each action.
- Description Quality: Every variant description must explain the outcome in domain terms — never echo the variant name ('Created.') or use vague text ('Failed.'). Error variants explain what went wrong; ok variants explain what is now true.
Step-by-Step Process
Step 1: Register Generator
Self-register with PluginRegistry so KindSystem can track ConceptConfig → ConceptSpec transformations. Registration is also handled automatically by register-generator-kinds.sync.
Examples: Register the concept scaffold generator
const result = await conceptScaffoldGenHandler.register({}, storage);
Step 2: Preview Changes
Dry-run the generation using Emitter content-addressing to classify each output file as new, changed, or unchanged. No files are written.
Arguments: $0 name (string), $1 typeParam (string), $2 purpose (string), $3 stateFields (statefield[]), $4 actions (actiondef[]), $5 version (int?), $6 gate (bool?), $7 capabilities (string[])
Step 3: Generate Concept Spec
Generate a well formed . concept file with state declarations , typed action signatures , variant returns , and a register ( ) action for PluginRegistry discovery .
Arguments: $0 name (string), $1 typeParam (string), $2 purpose (string), $3 stateFields (statefield[]), $4 actions (actiondef[]), $5 version (int?), $6 gate (bool?), $7 capabilities (string[])
Checklist:
- Concept name is PascalCase?
- Type parameter is a single capital letter?
- Purpose block describes why, not what?
- State fields use correct relation types (set, ->, option, list)?
- Every action has at least one variant?
- register() action is included for PluginRegistry?
- Annotations (@category, @visibility) are present?
- @version annotation included if this is a versioned spec?
- State fields use enum types for fixed value sets?
- State groups organize related fields?
- Capabilities block present for generator/plugin concepts?
- Variant descriptions explain outcomes, not just echo variant names?
- All files written through Emitter (not directly to disk)?
- Source provenance attached to each file?
- Generation step recorded in GenerationPlan?
Examples: Generate a basic concept
clef scaffold concept --name User --actions create,update,delete
Generate with custom state
clef scaffold concept --name Article --param A --category domain
Generate with version and gate
clef scaffold concept --name Approval --version 2 --gate --capabilities search,export
Step 4: Edit the Concept Spec
Refine the generated .concept file: 1. Add annotations: @version(N) for versioning, @gate for async gates, @category("domain") for grouping, @visibility("public"|"internal"). 2. Write a purpose block explaining why the concept exists (not how it works). 3. Design state fields: sets (set T), mappings (T -> Type), option/list wrappers, enum types ({Active | Inactive | Pending}), record types ({key: String, value: String}), state groups for related fields. 4. Define actions with typed params and variant returns. All primitives: String, Int, Float, Bool, Bytes, DateTime, ID. 5. Write invariants with after/then/and chains. 6. Add capabilities block if the concept is a generator or plugin.
References
Supporting Materials
Quick Reference
| Input | Type | Purpose |
|---|---|---|
| name | String | PascalCase concept name |
| typeParam | String | Type parameter letter (default: T) |
| purpose | String | Purpose description |
| category | String | Annotation category (domain, devtools, etc.) |
| version | Int | @version annotation number |
| gate | Bool | @gate annotation for async gates |
| stateFields | list StateField | State declarations (with group, enum, record support) |
| actions | list ActionDef | Action signatures with variants |
| capabilities | list String | Capabilities block entries |
| invariants | list String | Invariant steps |
Anti-Patterns
Purpose describes implementation
Purpose block says how the concept works instead of why it exists.
Bad:
purpose {
Store users in a Map<string, User> and provide CRUD operations
via async handler methods.
}
Good:
purpose {
Manage user identity and profile information.
}
Missing variants
Action only has ok variant — no error handling path.
Bad:
action create(name: String) {
-> ok(user: U) { Created. }
}
Good:
action create(name: String) {
-> ok(user: U) { New user registered and ready for profile setup. }
-> duplicate(name: String) { A user with this name already exists. }
-> error(message: String) { Creation failed due to a storage or validation error. }
}
Terse or echo descriptions
Variant descriptions that echo the variant name or use a single generic word — they tell the reader nothing about the actual outcome.
Bad:
action create(name: String) {
-> ok(user: U) { Created. }
-> error(message: String) { Failed. }
}
Good:
action create(name: String) {
-> ok(user: U) { New user registered and ready for authentication setup. }
-> error(message: String) { Creation failed due to a storage or validation error. }
}
Validation
Generate a concept scaffold:
npx tsx cli/src/index.ts scaffold concept --name User --actions create,update,delete
Validate generated concept:
npx tsx cli/src/index.ts check specs/app/user.concept
Run scaffold generator tests:
npx vitest run tests/scaffold-generators.test.ts
Related Skills
| Skill | When to Use |
|---|---|
/concept-designer |
Design concepts using Jackson's methodology before generating |
/create-handler |
Generate handler implementations for the concept |
/create-sync |
Generate sync rules connecting the concept |